什么是FFMPEG
FFMPEG是一套专业的音视频处理工具,它包含了多个组件,可以被编译为供不同平台和操作系统使用的动态库
完整的FFMPEG库体积特别大,而且还可能配合其它库来使用,因此我们必须学会自己根据功能和平台,来编译不同的FFMPEG库
编译FFMPEG存在的坑
- 不同版本的FFMPEG库,功能和组件不一样,脚本选项不一样
- 不同版本的NDK,工具链不一样,可用指令不一样
- FFMPEG库会调用Linux系统的指令,不同版本的Linux系统,内嵌的工具链不一样,可用质量不一样
- Linux系统和Windows系统编译方式不一样,大多权威的音视频库代码,都是为Linux系统而设计的。要编译成Windows上可用的动态库,必须借助交叉编译工具才能完成。这样又会带来更多问题,因为交叉编译工具也存在版本问题
上面的每个问题,都是非常难解决的
对于新手来说,基本是不可能靠自己解决的
所以最好的建议,就是大家使用版本完全相同的编译工具集
等以后大家自己弄清不同版本差异后,再换版本
编译工具及版本
- VMWare 任意版本,用来安装虚拟Linux系统。不建议在Windows系统中交叉编译,虚拟机一般人花点时间都能自己学会,但是交叉编译的坑,大多人是没法解决的
- ubuntu-14.04.6,注意必须是这个版本的,更高版本内置指令不一样,无法用来编译FFmpeg库
- FFmpeg 4.3.1
- ndk-r21b-linux,注意是Linux版本的
解压压缩包
- 装好Ubuntu系统后,将FFmpeg库解压到Home/ffmpeg-4.3.1位置
- 将ndk-r21b解压到Home/android-ndk-r21b-linux位置
修改configure脚本,指定so库命名规则
打开ffmpeg-4.3.1/configure文件,修改以下四个变量的值
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-4.3.1下新建一个build_android_so.sh文件,写入以下代码,这个脚本用来最终生成so库
注意TARGET和TOOLCHAIN两个变量,如果你使用的路径和我的不一样,记得调整这两个路径
#!/bin/bash
TARGET=~/armeabi-v7a
TOOLCHAIN=~/android-ndk-r21b-linux/toolchains/llvm/prebuilt/linux-x86_64
build()
{
./configure \
--prefix=$TARGET \
--disable-asm
--enable-static \
--enable-shared \
--enable-small \
--enable-gpl \
--disable-doc \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--target-os=android \
--arch=armeabi-v7a \
--cc=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-
make clean
make -j4
make install
}
build
执行编译脚本
在任意位置按下【Ctrl+Alt+T】,打开命令行窗口
输入【cd ~/ffmpeg-4.3.1】,进入ffmpeg文件夹
输入【chmod +x build_android_so.sh】,赋予脚本文件可执行权限
输入【./build_android_so.sh】,执行编译脚本
查看生成的so库
打开Target变量对应的目录,即【Home/armeabi-v7a/lib】,即可看到编译生成的so库,拷贝到安卓项目即可