windows10下編譯ffmpeg for android
本文記錄在windows10下編譯ffmpeg的過程:
環境:win10 ffmpeg-3.3 ndk-r14b
注意:一般來說低版本ndk編譯的能在高版本使用,但高版本ndk編譯的無法在低版本使用,因為NDK平臺不是後向相容的,而是前向相容的,因此請根據實際情況選擇ndk的版本。推薦使用app的minSdkVersion對應的編譯平臺。
在此處選擇basic setup,把右邊的都勾選(具體需要哪個其實我也忘了,索性就都選了),然後點選左上角的installation下拉選單下的apply change進行下載安裝。
完成後配置環境變數:
之後在安裝目錄找到msys.bat並開啟,後面會用到。
第三步,找到ffmpeg目錄下的configure檔案,將如下程式碼(有人反饋說複製下面的程式碼後每行末尾會多出兩個空格,發現確實如此,因此複製後需要手動去掉空格))
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命名的需要。
第四步,新建一個build_android.sh,裡面的程式碼如下:(有人反饋說複製下面的程式碼後每行末尾會多出兩個空格,發現確實如此,因此複製後需要手動去掉空格)
#!/bin/bash
export TMPDIR=G:/ffmpeg/tmpdir
NDK=E:/androidstudio/sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-18/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
CPU=arm
PREFIX=G:/ffmpeg/output/$CPU
ADDI_CFLAGS="-Os -fpic -marm"
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-static \
--enable-asm \
--enable-neon \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--enable-pthreads \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-runtime-cpudetect \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="$ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
build_one
read -p "Press any key to continue."
其中,
TMPDIR是個臨時目錄,編譯時需要用到,這個可以隨意指定路徑,但必須保證路徑存在;
NDK則替換為你本機的ndk路徑;
SYSROOT根據你的本機設定,但不要大於你的target,比如你的target是22,就不要用 大於android-22的;
PREFIX則是編譯後so的存放地址,路徑可以隨便指定。
--enable-shared:生成動態庫so
--enable-static:生成靜態庫
關於引數的作用,可以開啟ffmpeg原始碼目錄下的configure檔案,裡面都有對應的英文說明,舉個栗子:“--enable-mediacodec enable Android MediaCodec support [no]”
特別需要說明的是target-os,這個如果指定linux的話則需要執行第三步的檔案修改,如果是android則可以直接略過第三步,因為在configure檔案中已經對target-os作了判斷,如果是android會幫我們做類似於第三步的操作。
第五步,在剛剛開啟的mingw中切換到ffmpeg路徑下,執行build_android.sh
在此過程中
請檢查${MinGWDir}/msys/1.0/bin(預設為C:/MinGW/msys/1.0/bin)下有沒有pr.exe,如果沒有,那麼在編譯libav過程中,執行./configure會報錯:pr command not found。
下載coreutils-win32-5.3.0-bin.zip,解壓並將bin目錄下的內容拷貝到${MinGWDir}/msys/1.0/bin(預設為C:/MinGW/msys/1.0/bin)下。
附下載地址:http://gnuwin32.sourceforge.net/packages/coreutils.htm
其實這個pr command not found不用管它也能繼續執行下去。
第六步,漫長的等待後,如果在前面PREFIX指定的路徑下看到這兩個資料夾,那麼恭喜你,終於編譯成功了。
常見問題解決:
1 編譯過程中如果出現失敗,請到ffmpeg原始碼目錄下找到config.log,裡面末尾可能記錄了錯誤的原因,根據裡面的提示百度google自行解決即可。
2 FFMPEG編譯時出現 ffmpeg yasm not found, use --disable-yasm for a crippled build
這是因為 FFMPEG為了提高編譯速度,使用了彙編指令,如果系統中沒有yasm指令的話,就會出現上述的問題。
解決辦法是:
A 如果是Windows系統, 從網上下載一個 yasm.exe(地址:http://yasm.tortall.net/Download.html,下載完後改名字為 yasm.exe即可) 並放在mingw/bin下面,重新編譯,就不會出現該錯誤了;
B 如果是Linux系統,則更簡單,直接在終端輸入 sudo apt-get install yasm ,安裝好後,重新編譯就 OK了。
參考:
http://blog.csdn.net/u011485531/article/details/55804380