本文介绍在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 枫竹梦