ndk编译ffmpeg

文章目录

最近在努力学习音视频相关东西,以备未来不时之需

在音视频处理领域有一个绕不过去的著名项目就是FFmpeg,这个项目基于 GPL 开源协议,

最新版本目前我在 mac 上无法编译,会报错

使用的总体环境如下:

1Macos: 10.13.6 (17G65)
2ffmpeg: 3.3.6
3ndk: 15.2.4203891

引用外部源码(尝试失败)

初次尝试的时候,希望可以通过 CMakeLists 中配置头文件和库的方式,直接引用,发现可能需要拷贝所有源代码到项目中,但这样需要 copy 的东西很多,对于真实的项目来说也许可行,但 demo 项目就太复杂了,而且不方便今后的使用

交叉编译 so

这里有一个坑,就是 ndk 版本不能太低,因为之前使用过 ijkplayer,那个项目要求 11d 还是 11e 的 ndk 版本,我这次想直接用这个 ndk 版本,过程中会报很多错误,具体原因没有深究

然后使用我 android sdk 中带的 ndk 版本果断成功

这个是我的 ndk 版本,截至当前最新版本应该是 18.X

版本号在 ndk 中查看 propertis 文件可以看见

另一个叫法是 android-ndk-r15c

1Pkg.Desc = Android NDK
2Pkg.Revision = 15.2.4203891

ffmpeg 版本:我开始是下载的最新版本 4.1 版 ,结果编译不通过,在 udp.c 中报错了,通过网络搜索到一个原因,ffmpeg

通过下载了一个 ffmpeg-3.3.6 解决

另外,亲测最新的 NDKr18 并不能编译 3.3.6 会报一个

1/Users/caijinglong/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc is unable to create an executable file.
2C compiler test failed.
3
4If you think configure made a mistake, make sure you are using the latest
5version from Git.  If the latest version fails, report the problem to the
6ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
7Include the log file "config.log" produced by configure as this will help

换成 r15c 后分分钟钟成功

结论

在 mac 下,使用 ndk 15.2.4203891(r15c) + ffmpeg 3.3.6 一定可以成功,其他的环境不保证

编译过程

脚本

使用的是楼上同学的脚本修改 ndk 路径

这里要注意 TMPDIR 对应的这个文件夹请提前建立好

 1#!/bin/bash
 2export TMPDIR=/Users/cai/code/c/ffmpeg/tempdir
 3NDK=/Users/cai/Library/Android/sdk/ndk-bundle
 4
 5TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
 6
 7NDK_VERSION=android-14
 8
 9PLATFORM=$NDK/platforms/$NDK_VERSION/arch-arm
10
11echo "NDK=$NDK NDK_VERSION=$NDK_VERSION"
12
13# darwin linux
14function build_one {
15./configure \
16--target-os=linux \
17--arch=$ARCH \
18--prefix=$PREFIX \
19--enable-shared \
20--disable-static \
21--disable-doc \
22--disable-ffmpeg \
23--disable-ffplay \
24--disable-ffprobe \
25--disable-ffserver \
26--disable-doc \
27--disable-symver \
28--enable-cross-compile \
29--cross-prefix=$CROSS_COMPILE \
30--sysroot=$SYSROOT \
31--extra-cflags="-fpic"
32
33$ADDITIONAL_CONFIGURE_FLAG
34
35make clean
36make -j8
37make install
38}
39
40ARCH=arm
41CPU=arm
42PREFIX=$(pwd)/android/$CPU
43TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
44CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
45SYSROOT=$NDK/platforms/$NDK_VERSION/arch-$ARCH
46
47echo "PREFIX=${PREFIX}"
48echo "TOOLCHAIN=${TOOLCHAIN}"
49echo "CROSS_COMPILE=${CROSS_COMPILE}"
50echo "SYSROOT=${SYSROOT}"
51
52echo "******************************"
53
54build_one

修改 ffmpeg 配置源码

使用 vi/文本编辑器 之类的东西打开 ffmpeg/configure 修改

1#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
2#LIB_INSTALL_EXTRA_CMD='\$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
3#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
4#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
5
6SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
7LIB_INSTALL_EXTRA_CMD='\$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
8SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
9SLIB_INSTALL_LINKS='\$(SLIBNAME)'

修改上面的为下面的

原始文件行为 3305~3308 行

编译

使用sh build_android.sh 打包 也可以用 chmod -x build_android.sh;./build_android.sh

然后等待完成就可以了

20190114163509.png

我这里是这样的

查看编译结果

我这里分别编译得到这样的结果

20190114163602.png

我这里是分别编译了 arm/v7a/arm64 的 so 文件,你只需要修改 sh 文件,将 CPU 分别设置即可打包出对应的类型

1arm => armeabi
2armeabi-v7a => armeabi-v7a
3arm64-v8a => arm64-v8a

修改这两个为对应的 cpu 类型即可

1ARCH=arm
2CPU=arm

其实,正常来说 只需要一个 armeabi-v7a 就可以了,因为我是用的 flutter,为了兼容更多的设备,最好是有且只有 v7a 的 so 即可

后记

本篇是使用 mac 交叉编译出安卓可用的 so 库,下一篇会介绍如何将 so 置入