Android开发——编译FFmpeg(三、Windows系统编译FFmpeg)

本文详细介绍了如何在Windows系统上编译FFmpeg for Android,包括前期准备、环境变量设置和编译过程,特别针对ffmpeg-4.2.2及以上版本可能出现的问题提供了解决方案。

上一章我介绍了用Linux系统编译FFmpeg的过程,但实际情况是很多人没有Linux系统,只能在Windows系统上进行编译。本篇文章我将介绍如何用Windows系统编译FFmpeg for Android。

前期准备:

  1. Windows系统(我用的是win10)
  2. MinGW:  下载地址   这里下载的是压缩包,里面没有msys,如果下载安装程序,会因为网络限制等问题,导致无法安装需要的模块。
  3. Msys : 下载地址  这里选择.7z文件。
  4. NDK :可以从NDK官网上下载,Linux上可以直接用命令行下载 我这里使用的是android-ndk-r10e,网上有人说ndk16及以上的使用会有问题(我用android-ndk-r16b也出现了问题)
  5. 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即可。

ffmpeg-4.2.2 Program options中没有--disable-ffserver
ffmpeg-2.2.3 Program options中有--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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值