FFmpeg是功能強大的多媒體編解碼庫,廣泛應用于各個平臺的主流播放器、轉碼等軟件。在Android框架對視頻播放、編解碼的支持沒有那么強大時,使用ffmpeg也是不二的選擇。本文介紹使用ndk編譯ffmpeg的過程。
在看了很多人寫的編譯方法,嘗試了很多方案后,發現只有下面這個方法能夠一次成功,其他都會出各種各樣的問題。
準備
環境linux,
下載ffmpeg源碼: http://www.ffmpeg.org/download.html
下載linux版ndk: http://developer.android.com/ndk/downloads/index.html
將源碼和ndk都下載放到本地目錄,路徑隨意。
寫編譯腳本
進入到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)'
這幾行代碼替換的原因是原來編譯后的名稱類似如下這種libavcodec.so.56,這樣android編譯時識別不出,所以換成類似libavcodec-56.so這樣。
在ffmpeg目錄下添加編譯腳本build_android.sh,腳本中寫入以下代碼。腳本中主要是執行configure,然后執行make。
#!/bin/bash
NDK=$HOME/Desktop/adt/android-ndk-r9
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
其中configure的參數加了如下一些:
prefix 指定了編譯結果的目錄;
enable 和disable 指定了需要編譯的項;
cross-prefix指定了交叉編譯的工具鏈中gcc文件;
target-os 不用說,是目標操作系統;
arch cpu類型;
sysroot androdlib目錄。
更多conigure參數可參考./configure --help。
然后修改build_android.sh文件的權限:
sudo chmod +x build_android.sh
并執行:
./build_android.sh
接下來就等著吧,幾分鐘后便看到結果。
執行完畢后在android目錄下就生成了lib和include目錄,lib目錄下面放的so文件,include目錄下放的頭文件。
將這些文件拷貝出來就可以準備后續開發了。
更多
Android多媒體之二:jni調用ffmpeg命令
Android多媒體之三:編譯并使用x264庫