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