上一章我介绍了用Linux系统编译FFmpeg的过程,但实际情况是很多人没有Linux系统,只能在Windows系统上进行编译。本篇文章我将介绍如何用Windows系统编译FFmpeg for Android。
前期准备:
- Windows系统(我用的是win10)
- MinGW: 下载地址 这里下载的是压缩包,里面没有msys,如果下载安装程序,会因为网络限制等问题,导致无法安装需要的模块。
- Msys : 下载地址 这里选择.7z文件。
- NDK :可以从NDK官网上下载,Linux上可以直接用命令行下载 我这里使用的是android-ndk-r10e,网上有人说ndk16及以上的使用会有问题(我用android-ndk-r16b也出现了问题)
- FFmpeg :FFmpeg官网 我这里使用的是ffmpeg-4.2.2.tar.gz
1. 前言:
MSYS是bash、make、gawk和grep等GNU实用工具的集合,它能够实现那些依赖于传统UNIX工具的应用的构建,弥补MinGW和cmd的不足。
例如,构建一个使用autotools系统的库,用户通常会运行”./配置",然后"make"来构建它。configure shell脚本需要一个shell脚本解释器,它不存在于Windows系统中,但由MSYS提供。
人们经常误以为MSYS是“Windows上的UNIX”,实际上,MSYS本身不包含编译器或C库,因此不能将UNIX程序移植到Windows上,也不提供任何UNIX特定的功能,如区分大小写的文件名等。
2. 设置环境变量:
将 MinGW和Msys解压,把msys文件放在MinGW文件夹内。
将C:\mingw64\bin 和 C:\mingw64\msys\bin添加到系统PATH环境变量中(我把文件解压后放在C盘,你们视具体情况修改路径位置)。

打开msys文件中的msys.bat文件,在命令行中输入 gcc -v,查看环境变量是否配置正确。


3. 编译FFmpeg
在ffmpeg-4.2.2文件夹中找到configure文件,找到build setting部分
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)'
如下图所示,这一步的主要目的是生成Android能够使用的 名称-版本.so文件的格式,否则生成的是Linux上使用库,Android不能用。

在ffmpeg-4.2.2文件夹中,新建build_android.sh文件,粘贴如下内容:
#!/bin/bash
#设置编译中临时文件目录,不然会报错 unable to create temporary file
export TMPDIR=D:/softwares/android-ndk-r10e/ffmpegtemp
# NDK的路径,根据实际安装位置设置
NDK=D:/softwares/android-ndk-r10e
# 编译针对的平台,这里选择最低支持android-14, arm架构,生成的so库是放在libs/armeabi文件夹下的,若针对x86架构,要选择arch-x86
PLATFORM=$NDK/platforms/android-14/arch-arm
# 工具链的路径,arm-linux-androideabi-4.9与上面设置的PLATFORM对应,4.9为工具的版本号
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
PREFIX=$(pwd)/android/$CPU
CPU=arm
ADDI_CFLAGS="-Os -fpic -marm"
function build_one
{
./configure \
--prefix=$PREFIX \
--target-os=linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--disable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-cross-compile \
--disable-debug \
--enable-static \
--disable-doc \
--disable-asm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
make clean
make -j4
make install
}
build_one
打开msys文件中的msys.bat,切换到ffmpeg-4.2.2文件夹,输入以下命令:
./build_android.sh
如果是ffmpeg-4.2.2及以上版本可能在编译中会有以下问题:
1. Unknown option "--disable-ffserver". See ./configure --help for available options.
这是因为4.2.2版本中已经取消了 disable ffserver build选项,在build_android.sh中删除--disable-ffserver即可。
2. recipe for target 'libavformat/udp.o' failed

解决办法是注释掉报错的ffmpeg-4.2.2/libavformat/udp.c代码段 290——295行:

编译完成后在ffmpeg-4.2.2\android\lib中会有生成的.a 文件。(此处,我尝试了其它版本的ffmpeg、NDK都输出的是.a文件,没有.so文件。如果有了解的,可以在评论中提示一下,谢谢!)

最后,附上ndk-r10e下编译完成的FFmpeg文件(包含ffmpeg-2.2.3和ffmpeg-4.2.2,在linux和Windows下编译的结果)
Linux下编译: ffmpeg-2.2.3 ffmpeg-4.2.2
win10下编译: ffmpeg-2.2.3和ffmpeg-4.2.2
本文详细介绍了如何在Windows系统上编译FFmpeg for Android,包括前期准备、环境变量设置和编译过程,特别针对ffmpeg-4.2.2及以上版本可能出现的问题提供了解决方案。
&spm=1001.2101.3001.5002&articleId=104730697&d=1&t=3&u=799ad0a574d14820a2f2295f467542ff)

被折叠的 条评论
为什么被折叠?



