由于ffmpeg和NDK都是在不断进行迭代的,比如说NDK在r18之后之后彻底移除了gcc(包含r18版本),ffmpeg在4.o版本开始也针对Android平台的交叉编译默认使用clang编译,但是网上的很多资料都是使用gcc编译的。
所以如果要对照网上资料进行编译的话,保证NDK版本和ffmpeg版本甚至是编译环境工具都和作者的一样,这样会大大提高编译的成功率。
在编译成功之后再不断尝试修改参数结合搜索资料尝试,力求弄清楚每个参数的意义,做到触类旁通。
本次编译使用的是macbook,使用的NDK版本是r21(21.4.7075529),ffmpeg则是目前最新版4.4。
说明:
- 从官网下载好ffmpeg新版本之后,解压进入到FFmpeg目录中,使用命令vi build.sh创建shell脚本,
- 更改NDK目录及CFLAG参数,其中CFLAG参数这么长,怎么来的?其实这个不用死记,可以从AS NDK工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷贝,需要注意的是替换掉NDK的路径地址。 与网上gcc编译的脚本对比可以发现少了一些类似
--sysroot
这样的参数。 - 保存后运行脚本
./build.sh。
运行脚本的时候可能会遇到没有权限的问题,运行命令行chmod +x build.sh
增加一下执行权限后再次执行即可进行编译。
如果没有报错,大概几分钟后就能看编译成功。
如果报错,大家可以按照Clang编译FFmpeg常见问题此文章进行修改。
本次笔者编译使用的shell脚本如下:
#!/bin/bash
# 将NDK的路径替换成你自己的NDK路径
NDK=/Users/yonglin/Library/Android/sdk/ndk/21.4.7075529
API=21
# arm aarch64 i686 x86_64
ARCH=arm
# 指定目标cpu的架构 armv7a aarch64 i686 x86_64
PLATFORM=armv7a
TARGET=$PLATFORM-linux-androideabi
# 设置工具链mac苹果电脑的是darwin-x86_64 而如果是linux的话则是linux-x86_64
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin
# 设置编译产物的输出目录,这里表示在当前目录下新建Android_out目录
PREFIX=./Android_out/$PLATFORM
CFLAG="-D__ANDROID_API__=$API -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC"
build_one()
{
#执行configure脚本,用于生成makefile
./configure \
--ln_s="cp -rf" \
--prefix=$PREFIX \
# 指定交叉编译工具
--cc=$TOOLCHAIN/$TARGET$API-clang \
--cxx=$TOOLCHAIN/$TARGET$API-clang++ \
--ld=$TOOLCHAIN/$TARGET$API-clang \
# 设置android目标平台之后编译出来的动态库不带版本号,方便JNI调用
--target-os=android \
--arch=$ARCH \
--cpu=$PLATFORM \
--cross-prefix=$TOOLCHAIN/$ARCH-linux-androideabi- \
# 开启交叉编译
--enable-cross-compile \
--enable-shared \
--disable-static \
--enable-runtime-cpudetect \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
# 优化大小
--enable-small \
--enable-gpl \
--enable-nonfree \
--enable-version3 \
--disable-iconv \
--enable-neon \
--enable-hwaccels \
--enable-jni \
--enable-mediacodec \
# 关闭avdevice模块,此模块在android中无用
--disable-avdevice \
--disable-decoders \
--enable-decoder=vp9 \
--enable-decoder=h264 \
--enable-decoder=mpeg4 \
--enable-decoder=aac \
--enable-decoder=h264_mediacodec \
--disable-postproc \
# 会传给编译器的参数
--extra-cflags="$CFLAG" \
--extra-ldflags="-marm"
}
build_one
make clean
# 使用4条线程进行编译,增加编译速度
make -j4
make install