其实网络上有很多关于编译FFmpeg的文档,但是真正到自己编译的时候还是会遇到一些意想不到的问题。原因可能是平台不一样,也可能是FFmpeg版本不一样导致别人的方法照搬过来不能work。那我下面就分享一下自己编译FFmpeg的过程:
一、工作环境
FFmpeg version: 3.4.2
编译平台: MacOS
NDK version: 15.2.4203891
二、准备工作
1. 下载FFmpeg源码:http://ffmpeg.org
2. 修改源码目录下的配置文件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)'
这一步是为了生成的so可以被Android平台识别,直接复制粘贴就可以。
三、写编译脚本
1. 指定临时目录
export TMPDIR=/Users/Tian/Downloads/ffmpeg_install
指定一个临时目录,可以是任何路径,但必须保证存在,ffmpeg编译要用;
2. 指定NDK路径
NDK=/Users/Tian/Library/Android/sdk/ndk-bundle
3. 指定使用NDK Platform版本
SYSROOT=$NDK/platforms/android-16/arch-arm/
这里指定的ndk platform的路径,一定要选择比你的目标机器使用的版本低的,比如你的手机是android-15版本,那么就选择低于15的
4.指定编译工具链
TOOLCHAIN=/Users/Tian/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
注意:这里很多博客里面最后一个目录都是linux-x86_64,如果用这个编译的话会报错:C compiler test failed,如果你也有这个问题可以检查有没有对应的目录。
5.指定编译后的安装目录
PREFIX=/Users/Tian/Downloads/ffmpeg_install/
这个目录是ffmpeg编译后的so的输出目录,会有一个include和lib文件夹生成在这里,这也是我们之后要在android apk中使用的。
下面是我的脚本:
#!/bin/bash
export TMPDIR=/Users/Tian/Downloads
NDK=/Users/Tian/Library/Android/sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-16/arch-arm/
TOOLCHAIN=/Users/Tian/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CPU=arm
PREFIX=/Users/Tian/Downloads/ffmpeg_install/
ADDI_CFLAGS="-marm"
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--enable-small \
--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
}
build_one
四、运行脚本
首先要给脚本文件添加执行权限,然后运行。
这里我会报错:fatal error: linux/perf_event.h: No such file or directory,发现是libavutil/timer.h 找不到 linux/perf_event.h 引起的。查了一下linux/perf_event.h是linux平台的效能优化工具,看起来没什么用,整段注掉,编译通过。(有知道的朋友可以交流一下这个具体是什么东西)
当脚本在没有任何报错的情况下跑完,就可以去之前设置的目录里面看成果了。打开你*.sh文件里指定的放编译结果的目录, $PREFIX 目录下生成 include和lib两个文件夹,将lib文件夹中的 pkgconfig 目录和so的链接文件删除,只保留so文件,然后include 和lib两个目录拷贝出来这就是我们想要的了。
以上就是我的整个编译过程,谢谢。