前言
之前一直想做音視頻相關(guān)的東西,項目中用的東西也是別人封裝或著編譯好的so庫。感覺自己很low,所以就從源頭著手學(xué)習以下音視頻的相關(guān)東西。說到音視頻當然繞不開
FFMpeg了,這兩天編譯了一下Android端使用的FFMpeg的so庫,期間遇到了一些問題,特此記錄一下。文章有點長請耐心觀看。
首先
什么是FFMpge?
`FFmpeg`是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機程序。它包括了目前領(lǐng)先的音/視頻編碼庫
libavcodec。`FFmpeg`是在 `Linux`下開發(fā)出來的,但它可以在包括 `Windows` 在內(nèi)的大多數(shù)操作系統(tǒng)中編譯。這個項目是由
`Fabrice Bellard` 發(fā)起的,現(xiàn)在由 `Michael Niedermayer` 主持。可以輕易地實現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換,例如可以將
攝錄下的視頻avi等轉(zhuǎn)成現(xiàn)在視頻網(wǎng)站所采用的flv格式。
什么是
win10的WSL?
`WSL`就是`win10`推出的新功能-子系統(tǒng),全稱WindowsSubsystemforLinux,和虛擬機一樣,可以安裝特定的`Linux`。
如何安裝
WSL?




注意: 點擊獲取前需要登錄Microsoft賬號,要不不能獲取。另外,至于ubuntu如何設(shè)置這里就不討論了。各位可以自行嘗試,生命在于折騰。
編譯
FFMpeg需要什么?
- 1、FFMpeg包
- 2、NDK
- 3、
NDK的環(huán)境變量設(shè)置
注意:我這里以FFMpeg的4.0.2版本和NDK的android-ndk-14b進行編譯的。盡量不要用最新的庫進行編譯,當然,如果你是大佬或者踩坑達人當我沒說。


注意:WSL和win10可以通過共享文件進行文件傳遞,也可以直接在ubuntu命令行下進行文件操作,我這里直接是下載到win10E盤的chromeDownLoad文件夾中,那么如何移動到我們的ubuntu特定路徑下呢?
首先在使用
ls -all查看所有文件夾,并且在home路徑下創(chuàng)建ffmpeg文件夾,然后切換到win10的路徑下,命令如下
//查看所有文件
ls -all
//切換到home路徑下
cd /home
//創(chuàng)建ffmpeg文件夾
sudo mkdir ffmpeg
// 切換到根目錄下
cd ..
//切換到`mnt`路徑下,`mnt`就是`win10`的路徑
cd mnt
//查看mnt下的所有盤
ls -all
//切換到e盤
cd e
//切換到chromeDownLoad路徑下
cd chromeDownLoad
//移動ffmpeg-4.0.2.tar.gz到home/ffmpeg路徑下
suduo mv ffmpeg-4.0.2.tar.gz /home/ffmpeg
//解壓ffmpeg-4.0.2.tar.gz文件
sudo tar -xzvf ffmpeg-4.0.2.tar.gz,如果出錯了請使用
sudo tar -xvf ffmpeg-4.0.2.tar.gz
到這里ffmpeg的材料就準備好了,那么,
ndk和NDK的環(huán)境變量呢?
// 在usr下創(chuàng)建ndk文件夾
sudo mkdir /usr/ndk
//切換到e盤chromeDownLoad路徑下
cd /mnt/e/chromeDownLoad
//移動ndk壓縮包到/usr/ndk中
sudo mv android-ndk-r14b-linux-x86-64.zip /usr/ndk
//解壓android-ndk-r14b-linux-x86-64.zip ,如果沒有安裝zip的話首先需要安裝zip
//安裝zip
sudo apt-get install zip
//解壓包
sudo unzip android-ndk-r14b-linux-x86-64.zip
配置NDK環(huán)境變量,需要在
vim中操作,剛開始使用可能不太習慣,靜下心來慢慢操作就好。
1、在命令行中輸入
sudo vim ~/.bashrc-
2、打開
vim之后點擊i鍵進行編輯來設(shè)置環(huán)境變量(如果你的路徑和我的一致那么直接使用下面環(huán)境變量即可)export NDKROOT=/usr/ndk/android-ndk-r14b export PATH=$NDKROOT:$PATH 3、點擊
Esc鍵退出編輯模式,輸入:wq保存退出4、
source ~/.bashrc更新環(huán)境變量,如果沒有權(quán)限就加上sudo
到此
環(huán)境變量和NDK還有ffmpeg包都準備好了
其次
配置
FFMpeg的配置文件
-
1、切換到
FFMpeg文件路徑下cd /home/ffmpeg/ffmpeg-4.0.2 -
2、打開
configure文件夾sudo vim configure -
3、看到好長一大串是不是會頭暈眼花?別著急,直接輸入
: ? build setting就會到我們需要改的地方的,然后點擊i鍵進行修改
image.png
image.png 4、修改
將下面的
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
替換成
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
這一步的主要目的是生成Android能夠使用的 名稱-版本.so文件的格式,不然的話生成的是Linux上使用庫,Android不能用。
- 5、編寫Android編譯的腳本
在解壓后的文件夾
ffmpeg-4.0.2中,新建build_android.sh文件(使用的shell命令sudo touch build_android.sh)
輸入命令sudo vim build_android.sh,點擊Enter打開文件,在文件中粘貼下面內(nèi)容:
export SYSROOT=$NDK/platforms/android-14/arch-arm/
#編譯使用的toolchain
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
# 這個是輸出的路徑
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-x86asm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
注意:粘貼完成后,點擊Esc鍵然后輸入:wq然后開始編譯。
- 6、開始編譯,在命令行輸入
sudo chmod a+x build_android.sh,然后再輸入sudo ./build_android.sh開始編譯。這里你可能會編譯不成功,提示的是沒有安裝make所以首先需要安裝make在命令行下輸入sudo apt-get install make即可,然后等待安裝完成。 - 7、經(jīng)過漫長的等待后會再
ffmpeg-4.0.2的路徑下會生成一個android文件夾里面就是編譯成功的so庫


最后
再說一點Android端如何生成
頭文件?
-
1、創(chuàng)建
VideoConfig類public class VideoConfig {
static { System.loadLibrary("avcodec-58"); System.loadLibrary("avfilter-7"); System.loadLibrary("avformat-58"); System.loadLibrary("avutil-56"); System.loadLibrary("postproc-55"); System.loadLibrary("swresample-3"); System.loadLibrary("swscale-5"); System.loadLibrary("yffmpeg"); } public native String avformatinfo(); public native String avcodecinfo(); public native String avfilterinfo(); public native String configurationinfo();}
2、點擊
build===>Rebuild Project會生成一個build文件


-
3、生成頭文件(
java和kotlin的生成路徑是有區(qū)別的),命令如下:javah -classpath "生成的路徑" 全類名
注意:如果命令使用錯了會找不到類名,并且當你百度的時候你會欲哭無淚的。既然已經(jīng)知道重要了,那么如何生成呢?看下面
如果你創(chuàng)建的是java文件,那么命令如下
javah -classpath "F:\AndroidJetPack\CustomNode\videolibrary\build\intermediates\javac\debug\classes"
com.yk.silence.videolibrary.VideoConfig
其中F:\AndroidJetPack\CustomNode\videolibrary\build\intermediates\javac\debug\classes就是你的路徑。

如果你創(chuàng)建的是kotlin文件,那么命令如下
javah -classpath "F:\AndroidJetPack\CustomNode\videolibrary\build\tmp\kotlin-classes\debug"
com.yk.silence.videolibrary.VideoConfig

感謝
題外話
如果你有不明白的地方或者對
ffmpeg感興趣可以進水群(493180098)探討啊。

