本文介紹在Ubuntu平台編譯FFmpeg庫,用於Android使用。前提需要配置好NDK的環境。可以參考之前的文章Android NDK環境搭建。
下載FFmpeg
在官網下載FFmpeg源碼,https://ffmpeg.org/download.html
本文基於FFmpeg2.8進行編譯。
將下載的文件解壓,得到ffmpeg目錄。
修改configure文件
由於FFmpeg默認生成的庫文件格式為libavcodec.so.xx.xx.x。其中的xx就是主副版本號,這種格式在Ubuntu下使用是沒有問題的,但是在Android下開發使用,並不把其作為有效的庫文件。所以需要修改其他生成的文件名的格式。
通過修改configure文件要實現,打開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)'
編譯生成類庫
基本的編譯過程是configure, make, make install。其中configure的配置文件根據需要進行配置,如果是第一次使用,可以按如下進行配置。如果你不是第一次使用,相信你對於配置的參數應該已經知道自己需要哪些功能。
在與ffmpeg相同級別建立,編譯腳本文件build.sh
#!/bin/bash
NDK=/home/mn/bin/android-ndk-r15b
SYSROOT=$NDK/platforms/android-16/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
PREFIX=../output
ADDI_CFLAGS="-marm"
# --disable-symver - disable symbolic versioning
function build_one
{
./configure \
--prefix=$PREFIX \ --enable-shared \ --enable-small \ --disable-static \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-symver \ --target-os=linux \ --arch=arm \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --enable-cross-compile \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
make install
}
cd ffmpeg
build_one
在腳本的開始處定義了一些變量,其他NDK需要根據自己的環境進行配置,配置為NDK的根目錄。
PREFIX為編譯的輸出的目錄。其他參數不需要修改。
執行如下命令進行編譯:
$ chmod u+x build.sh
$ ./build.sh
等待編譯結束。在output/lib/的目錄下生成如下文件:
libavcodec-57.so
libavcodec.so
libavdevice-57.so
libavdevice.so
libavfilter-6.so
libavfilter.so
libavformat-57.so
libavformat.so
libavutil-55.so
libavutil.so
libswresample-2.so
libswresample.so
libswscale-4.so
libswscale.so
pkgconfig
錯誤處理
如果在編譯的過程中出現了錯誤,查看ffmpeg/config.log對配置的日志,及make的錯誤輸出。歡迎留言相互交流。
By 楓竹夢
