windows10下編譯ffmpeg for android

本文總結衆多博文在windows10下編譯ffmpeg的經驗,並提出在編譯過程中遇到的問題以及如何解決。非常詳細!

環境:win10 ffmpeg-3.3.9  ndk-r14b

Android NDK下載(r10~r21)

https://blog.csdn.net/momo0853/article/details/73898066

注意:一般來說低版本ndk編譯的能在高版本使用,但高版本ndk編譯的無法在低版本使用,因爲NDK平臺不是後向兼容的,而是前向兼容的,因此請根據實際情況選擇ndk的版本。推薦使用app的minSdkVersion對應的編譯平臺。

第一步:下載ffmpeg,我下載的是ffmpeg-3.3(下載地址:https://ffmpeg.org/download.html

 第二步:下載mingw(下載地址:https://sourceforge.net/projects/mingw/files/)

下載完成後運行 mingw-get-setup.exe 安裝MinGW Installer

 

直接默認,點擊continue  開始安裝,下圖即安裝成功的樣子:

 

如果mingw-get-setup安裝mingw總是出現download failed和unable to continue錯誤,截圖如下:

 

 原因是網絡問題導致下載失敗,網上有人說連接手機熱點可以解決但是我試了N多次都沒有效果,我的解決方法是找個梯子連接外網即可成功下載。

安裝後桌面上會建立快捷方式,運行。

在此處選擇basic setup,把右邊的都勾選,然後點擊左上角的installation下拉菜單下的apply change進行下載安裝。

如果安裝出現錯誤

install: bison-2.4.2-1-msys-1.0.13-doc.tar.lzma
mingw-get-gui: *** ERROR *** required package file is not available
mingw-get-gui: *** ERROR *** cannot install bison-2.4.2-1-msys-1.0.13-doc.tar.lzma
mingw-get-gui: *** ERROR *** due to previous download failure
 

遇到這樣的問題很大概率是被牆了
使用梯子即可
再次運行mingw-get即可

安裝完成後會在安裝目錄下出現這些文件:
 

然後配置環境變量:

 

之後在安裝目錄找到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)'

新建一個build_android.sh,裏面的代碼如下:

#!/bin/bash
export TMPDIR=C:/jiangjie/Android/ffmpeg-3.3.9/ffmpegtemp
NDK=C:/Users/rg/AppData/Local/Android/Sdk/android-ndk-r14b
SYSROOT=$NDK/platforms/android-18/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
CPU=arm
PREFIX=C:/jiangjie/Android/ffmpeg-3.3.9/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]”

#################################################################################################

前期的準備工作就差不多完工了,現在就是開始編譯了:

進入你安裝的MinGW目錄中,找到剛剛安裝的msys中

給build_android.sh權限,輸入 chmod +x build_android.sh

執行./build_android.sh

如果找不到.mak文件

先執行./configure才能生成config.mak文件 

https://github.com/dxjia/ffmpeg-compile-shared-library-for-android/issues/9

又出現錯誤:yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild錯誤

安裝ffmpeg過程中,執行./configure時,報yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild錯誤,分析、解決如下:

分析:yasm是彙編編譯器,ffmpeg爲了提高效率使用了彙編指令,如MMX和SSE等。所以系統中未安裝yasm時,就會報上面錯誤。

解決:安裝yasm編譯器。安裝方法如下:

在http://www.tortall.net/projects/yasm/releases下面找到適合自己平臺的yasm版本。然後進行安裝。舉例如下:

1)下載:wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

2)解壓:tar zxvf yasm-1.3.0.tar.gz

3)切換路徑: cd yasm-1.3.0

4)執行配置: ./configure

5)編譯:make

6)安裝:make install

 

然後返回ffmpag再次執行./configure

 

最後進入ffmpeg所在解壓的目錄:

 執行./build_android.sh

 

注:如果提示.../arm-linux-androideabi-pkg-config not found, library detection may fail.警告,忽視即可,編譯時目前沒有發現有什麼影響。

漫長的等待後,如果在前面PREFIX指定的路徑下看到這兩個文件夾,那麼恭喜你,終於編譯成功了。

其他問題

1.ffmpeg 版本:我開始是下載的最新版本 ,結果編譯不通過,在 udp.c 中報錯了,通過網絡搜索到一個原因,ffmpeg 版本太高

通過下載了一個 ffmpeg-3.3.9 解決

另外,親測最新的 NDK  並不能編譯 3.3.9 會報一個

/Users/caijinglong/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc is unable to create an executable file.
C compiler test failed.

If you think configure made a mistake, make sure you are using the latest
version from Git.  If the latest version fails, report the problem to the
[email protected] mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "config.log" produced by configure as this will help

換成 r14d 後分分鐘鍾成功

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章