一年多过去了,ffmpeg 已经到了 4.1.3 版本,谷歌也将 gcc 从 NDK 中移除。
一、指定编译器
由于 gcc 从 ndk 中移除,需要在 configure 时使用 --cc --cxx --ld 来分别指定 c/c++编译器和链接器。
找 ndk 的 clang 文件的位置,可以看见谷歌已经为我们写好各个架构和不同android版本的运行脚本。
例如编译的目标架构是 armv7a,目标 android 版本为 19,使用一下参数即可。
至于为啥连接器指定 armv7a-linux-androideabi19-clang 而不是 arm-linux-androideabi-ld 自己试试就知道
--cc=/文件路径/armv7a-linux-androideabi19-clang \
--cxx=/文件路径/armv7a-linux-androideabi19-clang++ \
--ld=/文件路径/armv7a-linux-androideabi19-clang
二、使用 cygwin 进行编译
使用 cygwin 时还是有坑的,由于 ffmpeg 4.x.x 版本在编译过程中使用软连接命令,而链接器无法识别 cygwin 的软链接符号,所以会在 libavutil/libavutil.so 时报错,这时需要通过 --ln_s="cp -rf" 来指定使用复制替代 "ln -s"
照例放出脚本:
#!/bin/bash
export TMPDIR=`dirname $0`/tmpdir
NDK=D:/Android/android-sdk/ndk-bundle
API=19
# arm aarch64 i686 x86_64
ARCH=arm
# armv7a aarch64 i686 x86_64
PLATFORM=armv7a
TARGET=$PLATFORM-linux-androideabi
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64/bin
SYSROOT=$NDK/sysroot
PREFIX=`dirname $0`/Android/$PLATFORM
CFLAG="-D__ANDROID_API__=$API -U_FILE_OFFSET_BITS -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD -Os -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm"
mkdir -p $TMPDIR
build_one()
{
./configure \
--ln_s="cp -rf" \
--prefix=$PREFIX \
--cc=$TOOLCHAIN/$TARGET$API-clang \
--cxx=$TOOLCHAIN/$TARGET$API-clang++ \
--ld=$TOOLCHAIN/$TARGET$API-clang \
--target-os=android \
--arch=$ARCH \
--cpu=$PLATFORM \
--cross-prefix=$TOOLCHAIN/$ARCH-linux-androideabi- \
--disable-asm \
--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-jni \
--enable-mediacodec \
--disable-decoders --enable-decoder=vp9 --enable-decoder=h264 --enable-decoder=mpeg4 --enable-decoder=aac \
--disable-encoders --enable-encoder=vp9_vaapi --enable-encoder=h264_nvenc --enable-encoder=h264_v4l2m2m --enable-encoder=hevc_nvenc \
--disable-demuxers --enable-demuxer=rtsp --enable-demuxer=rtp --enable-demuxer=flv --enable-demuxer=h264 \
--disable-muxers --enable-muxer=rtsp --enable-muxer=rtp --enable-muxer=flv --enable-muxer=h264 \
--disable-parsers --enable-parser=mpeg4video --enable-parser=aac --enable-parser=h264 --enable-parser=vp9 \
--disable-protocols --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=tcp --enable-protocol=udp \
--disable-bsfs \
--disable-indevs --enable-indev=v4l2 \
--disable-outdevs \
--disable-filters \
--disable-postproc \
--extra-cflags="$CFLAG" \
--extra-ldflags="-marm"
}
build_one
make clean
make -j4
make install
三、使用 WSL 进行编译
如果系统是 Win10 1803 及其以上版本,可以使用 WSL (Windows Subsystem for Linux) 进行编译
1.启用 WSL
略,自行百度吧,教程太多了
2.安装 Linux 版的 NDK
这里有个坑,由于 windows 默认文件名大小写不敏感,而 Linux 版的 NDK 有些头文件是除了大小写其余拼写完全一致的,直接解压完进行使用可能会出现一些问题。可喜的是,win10 1803 及其以上版本可以对单独文件夹开启大小写敏感,解决方法如下:
a) 先将 NDK 文件解压出来,过程中会提示重复文件,覆盖或者跳过都行
b) 将下面的命令保存到一个 .bat 文件内,将文件放到 NDK 路径下,以管理员权限运行
@echo off & color 0A
set DP=%~dp0
set DP=%DP:~0,-1%
echo %DP%
for /f "delims=" %%i in ('dir /ad/b/s "%DP%"') do (fsutil.exe file SetCaseSensitiveInfo "%%i" enable)
pause
c) 再次解压 NDK 到相同路径覆盖即可
3.编译
还是使用之前的脚本编译即可。注意更改 NDK 的路径
哦,对了这里编译器是可以识别软链接符号的, --ln_s="cp -rf" 可以去了
如果是在真实的 Linux 环境下也可使用此脚本