搭建環(huán)境
a食听、一般情況下用linux環(huán)境最直接胸蛛,如果不想在多臺電腦操作,可以安裝兩個操作系統(tǒng)樱报,然后進(jìn)入系統(tǒng)引導(dǎo)的時候葬项,選擇不一樣的系統(tǒng)引導(dǎo)進(jìn)去相應(yīng)的系統(tǒng)。
這種情況要注意的是迹蛤,在linux下民珍,其他硬盤的掛載路徑是在/media/user/盤符/,是掛載到media下面的
b、安裝虛擬機(jī)盗飒,如果內(nèi)存足夠大嚷量,安裝一個vmware 14破解版的,分配4g足夠了逆趣,虛擬的機(jī)的好處是跟你現(xiàn)有window同時一起玩玩耍蝶溶,注意點(diǎn)就是開啟虛擬機(jī)和系統(tǒng)的文件的共享。其共享路徑是在/mnt/hgfs/下
具體共享方法可以借鑒這個:https://www.cnblogs.com/huangjianxin/p/6343881.html
c.另外一種就是在window上安裝MinGW+msys搭建編譯環(huán)境宣渗,如果想編譯window下的ffmpeg.exe抖所,以及dll這些動態(tài)庫,可以采用c方法
d.采用cygwin的搭建模擬環(huán)境落包,不過這個需要更新下載一大堆的包數(shù)據(jù)部蛇。
f.win10 子系統(tǒng)
先開啟window的子系統(tǒng)空能
成功后重啟,然后再microsoft store 商店中下載lilnux
下載完成后會提示你設(shè)置用戶名和密碼咐蝇,然后這樣就成功了
最后如果想進(jìn)入子系統(tǒng)涯鲁,直接在cmd下輸入bash,便可直接進(jìn)入子系統(tǒng)了有序,非常方便抹腿,最開始的時候,需要安裝gcc環(huán)境 sudo apt-get install gcc
綜上旭寿,最方便的方式警绩,就是window開始子系統(tǒng)的功能了。
編譯
在window子系統(tǒng)下編譯
1盅称、先下載ffmpeg肩祥,然后改configuratoin后室,使得支持android so包的格式:
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)'
編譯的整體流程是三個步驟,第一是./configuration混狠,然后是make岸霹,然后make install,make install的時候前面加一個sudo即 sudo make install将饺,開始編譯的時候贡避,盡量是三個步驟分開,
然后成功了再放在一起予弧。應(yīng)該是在android平臺上的so包刮吧,所以采用ndk的來進(jìn)行混編,而且ndk采用的是linux版本的ndk
②編寫ffmpeg_android_configuration.sh指令:
# 設(shè)置NDK路徑
NDK=NDK=D:/IdeSDK/androidSdk/ndk-bundle/android-ndk-r16b
# 當(dāng)前設(shè)置為最低支持android-14版本掖蛤,arm架構(gòu)
SYSROOT=$NDK/platforms/android-14/arch-arm/
# 設(shè)置編譯工具鏈杀捻,4.9為版本號
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--prefix=$PREFIX \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=$CPU \
--sysroot=$SYSROOT \
$ADDITIONAL_CONFIGURE_FLAG
}
# 設(shè)置編譯后的文件輸出目錄
CPU=armv7-a
PREFIX=$(pwd)/android/$CPU
build_one
執(zhí)行完畢之后,會有這一下三個文件了:config.h,config.log,config.mak
之后再分別執(zhí)行坠七,make水醋,之后在執(zhí)行make install 指令
最后旗笔,編譯成功之后會在android文件夾下生成相應(yīng)的文件的彪置,如果要編譯成一個包,可以添加一下代碼
$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$SYSROOT/usr/lib \
-L$SYSROOT/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libswresample/libswresample.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a
同時生成靜態(tài)庫:
--disable-static
--enable-shared
修改為:
--enable-static
--disable-shared
設(shè)置編譯器的路徑蝇恶,根據(jù)實際路徑進(jìn)行修改拳魁,編譯前一定要檢查一遍路徑是否正確!
最后組中的sh文件應(yīng)該是這樣
#!/bin/bash
# 設(shè)置NDK路徑
NDK=NDK=D:/IdeSDK/androidSdk/ndk-bundle/android-ndk-r16b
# 當(dāng)前設(shè)置為最低支持android-14版本撮弧,arm架構(gòu)
SYSROOT=$NDK/platforms/android-14/arch-arm/
# 設(shè)置編譯工具鏈潘懊,4.9為版本號TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--prefix=$PREFIX \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=$CPU \
--sysroot=$SYSROOT \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
# 設(shè)置編譯后的文件輸出目錄
CPU=armv7-a
PREFIX=$(pwd)/android/$CPU
build_one
$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$SYSROOT/usr/lib \
-L$SYSROOT/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libswresample/libswresample.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a
執(zhí)行腳本的時候前面加上sudo,即 sudo ./build_ffmepg.sh贿衍,有時候因為make install 的原因需要超級權(quán)限授舟。另外修改了configure配置之后,
建議從新單獨(dú)跑一下./configure(ffmpeg_android_configuration.sh) 而不是直接跑./build_ffmepg.sh贸辈,因為有時候configure會出錯的释树,沒有重新
生成config.mk配置文件,但是依然執(zhí)行了make擎淤, make install 的過程奢啥,到時生成的so還是一樣的舊結(jié)果。
所以非常建議嘴拢,改了配置之后桩盲,吧android 下的文件夾下先刪除,然后單獨(dú)跑ffmpeg_android_configuration.sh測試是否成功席吴。
so瘦身
完整的so包接近100M了赌结,很巨大捞蛋,所以是需要什么的功能開放功能,按需裁剪就好了柬姚,裁剪的時候關(guān)注兩個地方襟交,第一個是./configure 成功之后,會
在bash下顯示編譯的結(jié)果伤靠,上面提示ffmpeg有哪些結(jié)果會輸出:
另外一個是看config.mak里面捣域,可以看到有哪些配置項是打開和關(guān)閉的狀態(tài)。
正常來說宴合,我們只需要把主要用的打開就好了焕梅,比如說項目上主要就是用到h264的編碼,但是需要主要的是ffmpeg本身有h264的解碼卦洽,但是沒有h264的編碼贞言,所以需要h264的編碼功能,需要鏈入h264的三方包阀蒂。
#!/bin/bash
# NDK的路徑该窗,根據(jù)實際安裝位置設(shè)置
NDK=E:/1.android.sdk/ndk-bundle/android-ndk-r16b
# 編譯針對的平臺,這里選擇最低支持android-14, arm架構(gòu)蚤霞,生成的so庫是放在libs/armeabi文件夾下的酗失,若針對x86架構(gòu),要選擇arch-x86
PLATFORM=$NDK/platforms/android-14/arch-arm
# 工具鏈的路徑昧绣,arm-linux-androideabi-4.9與上面設(shè)置的PLATFORM對應(yīng)规肴,4.9為工具的版本號
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
function build_one(){
./configure \
--disable-demuxers \
--disable-muxers \
--disable-decoders \
--disable-encoders \
--disable-protocols \
--disable-filters \
--enable-static \
--disable-shared \
--enable-version3 \
--enable-gpl \
--enable-libx264 \
--extra-cflags=-I/mnt/e/ffmpeg/x264/build_window/include \
--extra-ldflags=-L/mnt/e/ffmpeg/x264/build_window/lib \
--enable-ffmpeg \
--enable-demuxer=mov \
--enable-demuxer=h264 \
--enable-muxer=mov \
--enable-muxer=h264 \
--enable-protocol=file \
--enable-decoder=rawvideo \
--enable-decoder=mjpeg \
--enable-decoder=h263 \
--enable-decoder=mpeg4 \
--enable-decoder=h264 \
--enable-encoder=mjpeg \
--enable-encoder=h263 \
--enable-encoder=mpeg4 \
--enable-encoder=libx264 \
--enable-parser=h264 \
--enable-zlib \
--disable-network \
--disable-avdevice \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-\
--enable-cross-compile\
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include"\
--prefix=$PREFIX \
$ADDITIONAL_CONFIGURE_FLAG
#make clean
#make
#make install
}
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one
更直接的方式是:直接用--disable-everthing 把基本所有的禁用,然后開相應(yīng)的enable夜畴,就沒必要寫
--disable-demuxers --disable-muxers --disable-decoders --disable-encoders --disable-protocols \這些腳本拖刃。
需要注意的是:
--extra-cflags=-I/mnt/e/ffmpeg/x264/build_window/include
--extra-ldflags=-L/mnt/e/ffmpeg/x264/build_window/lib
這兩個地址是編譯libx264的輸出地址,自己需要更新確認(rèn)贪绘。它們代表的意思是
-I:編譯階段生效的參數(shù)兑牡,用于指定頭文件的搜索路徑。
-L:鏈接階段生效的參數(shù)税灌,用于指定鏈接庫的搜索路徑均函,-l用于指定鏈接庫的名稱,一般兩者一起使用的話垄琐,就可以指定動態(tài)鏈接庫边酒。
另外一個比較常用的指令是 --enable-small,這個參數(shù)是優(yōu)化壓縮文件狸窘,有可能會降低性能墩朦,對生成的ffmpeg.exe 會縮小1.5M左右