1. 程式人生 > >android ndk開發之一 編譯ffmpeg

android ndk開發之一 編譯ffmpeg

之所以要在linux下編譯ffmpeg,是因為在windows下的坑很多,而且在linux下編譯方便快捷。

安裝

現在大部分的電腦都是windows,所以我們可以先裝個虛擬機器,裝個linux系統,這裡不詳細說了,網上教程很多,這裡我用的虛擬機器是Oracle VM VirtualBox,系統則用的是Ubuntu,只要網速快,都不是問題。。。

配置

去版本字尾

FFMPEG預設編譯出來的庫字尾是有加版本號的,這種Android上似乎是載入不了哇!彆著急,稍微改改就成。將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)'

新建指令碼

在你解壓後的ffmpeg原始碼的根目錄下新建一個build.sh檔案(記住這是個指令碼檔案),指令碼程式碼如下,你只需複製進你新建的build.sh檔案了,旨在將ffmpeg編譯成單個類庫(參照http://blog.csdn.net/leixiaohua1020/article/details/47011021):

make clean

export NDK=/home/loften/ffmpeg/android-ndk-r13b
export PREBUILT=$NDK/toolchains/arm-linux
-androideabi-4.9/prebuilt export PLATFORM=$NDK/platforms/android-14/arch-arm export PREFIX=../ff-pure-onelib build_one(){ ./configure --target-os=linux --prefix=$PREFIX \ --enable-cross-compile \ --enable-runtime-cpudetect \ --disable-asm \ --arch=arm \ --cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc \ --cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \ --disable-stripping \ --nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm \ --sysroot=$PLATFORM \ --enable-gpl --enable-static --disable-shared --enable-nonfree --enable-version3 --enable-small \ --enable-zlib --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \ --extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a" } build_one make make install $PREBUILT/linux-x86_64/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 libpostproc/libpostproc.a libavdevice/libavdevice.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a cd ..

說明:

指定NDK目錄:

export NDK=/home/loften/ffmpeg/android-ndk-r13b

指定編譯工具鏈 :

export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt

指定使用NDK Platform版本 :

export PLATFORM=$NDK/platforms/android-14/arch-arm
這裡指定的ndk platform的路徑(確保目錄裡存在),一定要選擇比你的目標機器使用的版本低的,比如你的手機是android-23版本,那麼就選擇低於23的

指定編譯後的安裝目錄

(可修改成你想要的目錄)
export PREFIX=../ff-pure-onelib

— 以上幾點都是根據您解壓的ndk來配置的,細節方面的修改應實際根據您下載的ndk來檢視配置就行了。

開始編譯

  1. 開啟終端,通過cd ~命令進入相對應的您解壓的ffmpeg的根目錄下
  2. 設定許可權 chmod 777 build.sh
  3. 編譯指令碼 source build.sh
  4. 接下來就是等待了,等到成功了生成的檔案都在/ff-pure-onelib資料夾裡(或者您設定的目錄下)
  5. 當然,編譯過程中如果有遇到報錯,就好好檢視報錯內容,一般都是找不到該目錄下的檔案,則需要您去檢視ndk目錄下是否存在該檔案,沒有的話則相對應的修改目錄檔案就行,比如:你配置了export PLATFORM=$NDK/platforms/android-14/arch-arm ,然而在編譯過程中報錯找不到android-14/arch-arm ,那你就得檢視下/platforms目錄下是否真的存在 android-14了,如果沒有,就換成裡面有的,以此類推,其他配置都一樣,正常來說都可以編譯成功的
  6. 如果出現錯誤,你改變build.sh程式碼後想繼續的話,可以把make clean註釋下,即 修改為 “#make clean”,然後繼續 source build.sh 就可以繼續編譯了。

編譯成功

最後把拿到的庫檔案測試下效果,寫一個jni的程式呼叫下。 在android studio中就可以通過cmake來開心的玩耍了。。。。

編譯帶x264的ffmpge

編譯x264

在你解壓後的x264原始碼的根目錄下新建一個build.sh檔案,具體內容如下:

NDK=/home/loften/Android/android-ndk-r13b
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one(){
 ./configure --prefix=$PREFIX \
--enable-static \    
--enable-shared \    
--enable-pic \    
--disable-asm \   
--disable-cli \    
--host=arm-linux \    
--sysroot=$PLATFORM \    
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi-
make clean
make -j4
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
  1. 開啟終端,通過cd ~命令進入相對應的您解壓的x264的根目錄下
  2. 設定許可權 chmod 777 build.sh
  3. 編譯指令碼 source build.sh
  4. 接下來就是等待了,等到成功了生成的檔案都在/android資料夾裡