windows 下使用 NDK 编译 ffmpeg 4.1.3

博客介绍了FFmpeg 4.1.3版本在Android下的编译方法。因谷歌将gcc从NDK移除,需在configure时指定c/c++编译器和链接器。还介绍了使用cygwin和WSL进行编译的方法,包括解决编译中遇到的软链接、文件名大小写敏感等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一年多过去了,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 环境下也可使用此脚本

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值