1. 程式人生 > >windows10下編譯ffmpeg for android

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