windows下編譯android使用的FFmpeg庫
去年寫了篇在ubuntu下用NDK編譯FFmpeg,當時是費了很大的勁才編譯出幾個so庫!並不是每個人都有Ubuntu的,要弄屬於自己的FFmpeg庫就比較困難,正好這幾天公司不是很忙,於是在網路中尋找如何在windows下編譯出FFmpeg庫! 蒐集加整理加實踐最終得到FFmpeg!
準備:win10, NDK(具體什麼版本我也忘了,在AndroidStudio裡面下載的,感覺版本什麼的問題不大), ffmpeg3.0.9, MinGW
先說一下這個MinGW,這個在官網下載,他會提供一個下載器給你,線上安裝即可!之後把安裝的bin目錄配置到系統環境變數的Path裡
解壓下載的ffmpeg-3.0.9,下面要開始了!!!!
手動在ffmpeg-3.0.9目錄下新建一個文字檔案,取名build_android.sh將下列內容貼上進去
#!/bin/bash #設定編譯中臨時檔案目錄,不然會報錯 unable to create temporary file export TMPDIR=F:/zwyl/ffmpeg-3.0.9/ffmpegtemp # NDK的路徑,根據實際安裝位置設定 NDK=F:/AStudioSDK/ndk-bundle # 編譯針對的平臺,這裡選擇最低支援android-14, arm架構,生成的so庫是放在libs/armeabi資料夾下的,若針對x86架構,要選擇arch-x86 PLATFORM=$NDK/platforms/android-14/arch-arm # 工具鏈的路徑,arm-linux-androideabi-4.9與上面設定的PLATFORM對應,4.9為工具的版本號 TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64 function build_one { ./configure \ --prefix=$PREFIX \ --target-os=linux \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --arch=arm \ --sysroot=$PLATFORM \ --extra-cflags="-I$PLATFORM/usr/include" \ --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \ --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \ --disable-shared \ --enable-runtime-cpudetect \ --enable-gpl \ --enable-small \ --enable-cross-compile \ --disable-debug \ --enable-static \ --disable-doc \ --disable-asm \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-postproc \ --disable-avdevice \ --disable-symver \ --disable-stripping \ $ADDITIONAL_CONFIGURE_FLAG sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h make clean make -j4 make install $TOOLCHAIN/bin/arm-linux-androideabi-ld \ -rpath-link=$PLATFORM/usr/lib \ -L$PLATFORM/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 \ } # arm v7vfp CPU=armv7-a OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU " PREFIX=./android/$CPU-vfp ADDITIONAL_CONFIGURE_FLAG= build_one # CPU=armv # PREFIX=$(pwd)/android/$CPU # ADDI_CFLAGS="-marm" # build_one #arm v6 #CPU=armv6 #OPTIMIZE_CFLAGS="-marm -march=$CPU" #PREFIX=./android/$CPU #ADDITIONAL_CONFIGURE_FLAG= #build_one #arm v7vfpv3 # CPU=armv7-a # OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU " # PREFIX=./android/$CPU # ADDITIONAL_CONFIGURE_FLAG= # build_one #arm v7n #CPU=armv7-a #OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8" #PREFIX=./android/$CPU #ADDITIONAL_CONFIGURE_FLAG=--enable-neon #build_one #arm v6+vfp #CPU=armv6 #OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU" #PREFIX=./android/${CPU}_vfp #ADDITIONAL_CONFIGURE_FLAG= # build_one
說明:這是個shell指令碼檔案#一般表示註釋,修改好自己的NDK目錄,ffmpegtemp目錄先新建好,用來快取的
用notepad++ 開啟該指令碼,在編輯裡面有個文件格式轉換,選中轉換為UNIX格式,雖說是在windows下,但是指令碼要執行還是要使用unix格式
在MinGW的安裝目錄下找到msys.bat檔案,我的在這個目錄下: C:\MinGW\msys\1.0 然後雙擊執行,接著cd到ffmpeg-3.0.9目錄下
給build_android.sh許可權,輸入 chmod +x build_android.sh然後就是執行
輸入 ./build_android.sh回車即可
可能是我的電腦慢的問題,回車後沒反應,不要急,大概半個小時就好了(電腦配置造成的吧)
最後會在該目錄下生成一個android資料夾
中間碰到一個問題報SYNTAX ERROR:UNEXPECTED END OF FILE錯誤
網上查了說是因為沒有轉格式,但是轉了格式還是報錯,結果我把環境切到linux下執行(裝了雙系統),報的錯不一樣,因為語法錯了,找了半天是因為在方法體裡面少了個回車,這都被我發現了!
好了,可以愉快的使用ffmpeg玩耍了,具體怎麼玩,可以參見雷神的部落格