【Android音视频开发】FFmpeg库编译详解(2025最新版)

文章版本号 变更内容 变更日期 备注
0.0.1 创建 2022/10/10 初版
0.0.2 补充环境搭建内容 2022/10/11
0.0.3 补充编译内容 2022/10/13
0.0.4 更换编译用的ndk版本,完成初版编写 2022/10/17

1 前言

前两篇文章分别介绍了音频和视频的编码原理(还没看的可以戳音频编码原理,视频编码原理进行阅读),接下来进入开发阶段。进入到音视频开发阶段后,有个库是绕不开的,那就是有名的FFmpeg(读作ef ef em peg,也有人读作ef em peg)开源库,它十分强劲,提供了许多功能API,包括但不限于:音视频重采样、音视频编码格式转换、音视频播放、素材(字幕等)添加、视频转场动画、音视频推拉流、录像等等,音视频开发过程中需要用到的功能它基本都有。
鉴于FFmpeg库如此“全能”,所以给大家介绍一下它的用法是很有必要的,而在使用前,我们需要对它进行编译,得到so库和头文件后才能在项目中进行使用。

2 正文

FFmpeg开源库git地址

2.1 环境搭建

所需资源:

  • VM Virtualbox(下载链接)
  • Ubuntu 22.04.1 LTS(下载链接)

2.1.1 安装ubuntu系统

双击打开下载好的Virtualbox安装程序-VirtualBox-6.1.36-152435-Win.exe,全部点击下一步安装即可,也可根据自己需求进行修改。 安装完成后运行VirtualBox:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

上图中可以看到,博主这里已经添加了一个ubuntu系统了,还没有添加的点击“新建”按钮,在弹出框的名称栏中输入ubuntu后,类型和版本会自动设置,之后可以再自行修改名称,如ubuntu22.04.1等。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

设置完名称后点击下一步,进入设置内存大小的页面,这里的内存大小是指分配给虚拟电脑的内存大小,根据自己电脑的内存大小和需要进行设置即可。博主的电脑内存是32GB,这里设置的是8GB:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

设置完内存大小后点击下一步,创建虚拟磁盘,点击“创建”按钮。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

磁盘类型选择VDI(或根据自己需求进行选择),点击下一步。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

选择磁盘空间分配方式,有两种方式可选,动态分配固定大小,具体描述可以看窗口中的介绍文本,博主选择的是固定大小,选择好后点击下一步。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

选择虚拟磁盘放置的位置和设置磁盘大小,这里根据自己的需求进行配置即可,博主设置的磁盘大小是30GB。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

配置完后点击创建,会弹出等待弹窗,这个创建的过程比较耗时,博主等了大致5-8分钟左右。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

虚拟磁盘创建完成后,会回到首页,首页右侧会显示配置的虚拟电脑的信息。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

接下来就需要把我们之前下载的ubuntu系统iso文件配置进去了。点击“启动”按钮,在弹出的页面中点击“注册”。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

在文件夹中找到自己下载的ubuntu-xxx.iso文件,点击打开。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

将iso文件添加到列表中后,选中它并点击选择。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

回到首页后再次点击启动按钮,这时会弹出“选择启动盘”的弹窗,选中我们刚才添加的启动盘后点击启动按钮即可启动ubuntu系统。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

==启动报错解决:==
博主在最后一步点击启动后遇到了报错,报错弹窗如下:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

报错的缘由是我的电脑BIOS中没有开启VT-x功能,如果你也悲催的遇到了这个报错,那么请看下面的解决方法。
博主的电脑是win10系统,其他系统的不敢保证能用同样的方式解决(不过也可以尝试一下)。

解决方法:
重启电脑,在重启时不停按F2键(有些电脑是F8/F12,如果F2不管用可以查一下自己电脑进入BIOS的方式)进入BIOS设置页面,切换到Advanced选项卡,找到VTX virtualization(或类似选项),将disable状态改为enable状态,按F10保存并退出。电脑重启后就可以正常启动ubuntu系统了。
==正常运行截图:==

【Android音视频开发】FFmpeg库编译详解(2025最新版)

就算是正常启动也需要等待几分钟的时间,期间可能会黑屏一阵子,请耐心等待加载。

最后,附上官方配置文档,需要梯子才能加载出页面中的图片,否则只能看到纯文本描述。

==其他踩坑记录:==

  1. 无法访问共享文件夹,报错You do not have the permissions necessary to view the contents of ‘shared_folder’:解决方案
  2. 无法复制文本粘贴到ubuntu系统:解决方案
  3. 安装增强功能报错“Could not mount the media/drive…”:

    【Android音视频开发】FFmpeg库编译详解(2025最新版)

打开文件夹,找到箭头所指的目录,右键点击它,在弹出的选项框中点击Properties。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

【Android音视频开发】FFmpeg库编译详解(2025最新版)

复制文件夹路径,打开Terminal,按照顺序输入图上的命令,进到增强功能文件所在的目录,然后运行它即可手动安装增强功能。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

2.1.2 配置编译环境

2.1.2.1 下载NDK

博主使用的ndk版本为r22b,如果你已经下载了别的版本的ndk,也可以直接使用,不过版本提议不要太低,推荐r21+。
ndk下载链接
下载完成后,通过共享文件夹将ndk压缩包转移到ubuntu系统中。打开终端,使用cd命令进入到存放压缩包的目录,然后使用以下命令对压缩包进行解压:

unzip android-ndk-r22b-linux.zip

【Android音视频开发】FFmpeg库编译详解(2025最新版)

配置环境变量:
右键点击ndk解压后生成的目录,在弹出菜单中点击Properties,将文件夹路径复制下来。

【Android音视频开发】FFmpeg库编译详解(2025最新版)

【Android音视频开发】FFmpeg库编译详解(2025最新版)

然后打开终端,输入

vim ~/.bashrc

翻到文件的末尾,按i键进入编辑模式,输入

export NDK_HOME=刚才复制的path
export PATH=$NDK_HOME:$PATH

【Android音视频开发】FFmpeg库编译详解(2025最新版)

然后按ESC键退出编辑模式,输入:wq回车,保存修改内容。
退出vim后,使用命令

source ~/.bashrc

使改动生效,至此,ndk的环境变量就配置好了。

2.1.2.2 下载所需编译软件

第一更新包列表:

sudo apt update

然后下载需要的编译软件

sudo apt install autoconf
automake
build-essential
cmake
git-core
libass-dev
libfreetype6-dev
libgnutls28-dev
libmp3lame-dev
libsdl2-dev
libtool
libva-dev
libvdpau-dev
libvorbis-dev
libxcb1-dev
libxcb-shm0-dev
libxcb-xfixes0-dev
meson
ninja-build
pkg-config
texinfo
wget
yasm
zlib1g-dev
libunistring-dev
libaom-dev
libdav1d-dev
pkg-config

到这一步编译所需的准备工作就做完了,接下来终于可以开始编译了。

2.2 编译FFmpeg

2.2.1 下载FFmpeg源码

创建一个目录用来存放FFmpeg源码,打开Terminal,使用cd命令进入该目录下,执行

git clone https://github.com/FFmpeg/FFmpeg.git

将FFmpeg源码下载到本地,如下图:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

源码下载完成后,正式开始编译。

2.2.2 编译

修改configure文件:
第一,我们需要对configure文件进行修改,目的是为了不生成版本号(如libavcodec7.so),由于android平台识别不了!
将:

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音视频开发】FFmpeg库编译详解(2025最新版)

试运行configure文件:
进入FFmpeg源码根目录下,使用

sudo ./configure

命令试着编译一下,发现会报错:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

按照提示,在上面的命令后面加上–disable-x86asm,命令如下

sudo ./configure –disable-x86asm

这次能够正常运行了,但是最后会报warning:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

警报内容说的是没找到pkg-config,我们使用命令安装一下:

sudo apt install pkg-config

安装完成后再次执行之前的编译命令,这次能够成功运行了。博主已将pkg-config包的下载加入到了之前的“下载需要的编译软件”指令中,使用新的指令下载后应该就不会遇到这个warning了。
OK,configure文件成功运行后,接下来就可以开始筹备针对安卓平台的编译了。

创建、执行编译脚本:
在FFmpeg源码根目录下创建build_android.sh文件,并将下面的脚本代码copy进去后保存,注意要将NDK_ROOT修改成自己的ndk目录路径。

#!/bin/bash

# 以下路径需要修改成自己的NDK目录

 

export NDK_ROOT=/home/jessehao/Development/Android/ndk/android-ndk-r22b

export TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64

 

echo "<<<<<<<<<<<<<基于NDK22b编译 FFmpeg 5.0 64位硬件解码版本>>>>>>>>>>>>>>"

 

#设置编译平台的相关参数

#armv7-a

ARCH=arm

CPU=armv7-a 

#armv8-a

#ARCH=arm64

#CPU=armv8-a

API=21

OS=android

PLATFORM=$CPU-linux-androideabi

PREFIX=$(pwd)/android/$CPU

OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

 

 

#指定输出路径

PREFIX=$(pwd)/android/arm

SYSROOT=$TOOLCHAIN/sysroot

CROSS_PREFIX=$TOOLCHAIN/bin/llvm-

#CROSS_PREFIX=$TOOLCHAIN/bin/$PLATFORM-

ANDROID_CROSS_PREFIX=$TOOLCHAIN/bin/${PLATFORM}$API-

 

 

echo "开始编译 $CPU"

#该脚本命令中不能插入注释,每行命令必须以  结尾

./configure 

--prefix=$PREFIX 

--enable-shared 

--enable-gpl 

--enable-neon 

--enable-hwaccels 

--enable-postproc 

--enable-jni 

--enable-small 

--enable-mediacodec 

--enable-decoder=h264_mediacodec 

--enable-ffmpeg 

--disable-static 

--disable-ffplay 

--disable-ffprobe 

--disable-ffplay 

--disable-avdevice 

--disable-debug 

--disable-static 

--disable-doc 

--disable-symver 

--cross-prefix=$CROSS_PREFIX 

--target-os=$OS 

--arch=$ARCH 

--cpu=$CPU 

--cc=${ANDROID_CROSS_PREFIX}clang 

--cxx=${ANDROID_CROSS_PREFIX}clang++ 

--enable-cross-compile 

--sysroot=$SYSROOT 

--extra-cflags="-Os -fPIC $OPTIMIZE_CFLAGS" 

--extra-ldflags="$ADDI_LDFLAGS" 

 

make clean

#编译

make

#安装

make install

 

echo "编译完成 $CPU"

然后使用

sudo ./build_android.sh

命令运行该脚本。
运行后发现并没有这么顺利,刚开始就报错了:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

我们按ctrl+c终止脚本执行,由于继续执行下去也是有问题的。
进到ffbuild找到config.log并打开,拉到最下方,可以看到以下报错详情:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

报错信息说的很清楚了,没有找到相应的clang文件。
我们进到报错信息中指出的目录,发现armv7-a中间多了个“-”,而实际的clang文件是没有“-”的,我们需要改一下脚本,将CPU中armv7-a中的“-”去掉,如下图所示:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

修改后再次运行脚本,就没有之前的报错了:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

但是出现了新的warning信息:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

先不管这个warning,继续编译,发现能够正常编译完成,

【Android音视频开发】FFmpeg库编译详解(2025最新版)

且在我们指定的目录(${pwd}/android/arm)下生成了头文件和so库:

【Android音视频开发】FFmpeg库编译详解(2025最新版)

【Android音视频开发】FFmpeg库编译详解(2025最新版)

说明是有正常进行编译的。
接下来,我们就可以通过在项目中引入这些头文件和so库,调用FFmpeg提供的多功能API了!

如果你遇到了文章中没有提到的问题,请在评论区留言,博主看到后会尽快回复。
之后的文章会讲解如何利用上面编译出来的头文件和so库,利用FFmpeg提供的API进行音视频开发,我们下一篇文章见。:)

© 版权声明

相关文章

暂无评论

none
暂无评论...