FFmpeg开发环境构建(x86-linux平台)

本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10035365.html

1. 相关资源介绍

本文主要讲述 Linux 平台 x86 (及 x86-64) 架构下的 FFmpeg 编译安装过程。其他嵌入式平台需要交叉编译,过程类似。本实验在 opensuse 平台作了验证,Linux 发行版版本为:openSUSE Leap 15.6,使用 lsb_release -a 命令查看系统发行版版本。FFmpeg 版本为 8.0。

1.1 FFmpeg

FFmpeg 官网:https://www.ffmpeg.org/

1.2 SDL

SDL (Simple DirectMedia Layer) 是一套开源的跨平台多媒体开发库。SDL 提供了数种控制图像、声音、输出输入的函数,封装了复杂的视音频底层操作,简化了视音频处理的难度。目前 SDL 多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

SDL 官网:https://www.libsdl.org/

1.3 yasm/nasm

旧版 FFmpeg 及 x264/x265 使用 yasm 汇编器

Yasm 是英特尔 x86 架构下的一个汇编器和反汇编器。Yasm 是一个完全重写的 Netwide 汇编器 (NASM)。Yasm 通常可以与 NASM 互换使用,并支持 x86 和 x86-64 架构。其许可协议为修订过的 BSD 许可证。

此处 Yasm 用来编译 x86 平台下 FFmpeg 中部分汇编代码。

注意,Yasm 是 x86 平台汇编器,不需要交叉编译。若是 arm 等其他平台,交叉编译工具链已经包含了汇编器,则交叉编译 FFmpeg 时需要 --disable-yasm 选项。

Yasm 官网:http://yasm.tortall.net/

新版 FFmpeg 及 x264/x265 改用 nasm 汇编器

Netwide Assembler (简称 NASM) 是一款基于英特尔 x86 架构的汇编与反汇编工具。NASM 被认为是 Linux 平台上最受欢迎的汇编工具之一。

注意,NASM 是 x86 平台汇编器,不需要交叉编译。若是 arm 等其他平台,交叉编译工具链已经包含了汇编器,则交叉编译 FFmpeg 时需要 --disable-x86asm 选项。

NASM 官网:https://www.nasm.us/

1.4 x264

x264 是开源的 h264 编码器,使用非常广泛,综合性能不比商业编码器差。
x264 官网:https://www.videolan.org/developers/x264.html
FFmpeg 工程中实现了 h264 解码器,但无 h264 编码器。因此需要安装第三方编码器 x264

1.5 x265

x265 是开源的 h265 编码器。
x265 官网:http://www.x265.org/
下载地址一:https://bitbucket.org/multicoreware/x265/downloads/
下载地下二:https://www.videolan.org/developers/x265.html
FFmpeg 工程中实现了 h265 解码器,但无 h265 编码器。因此需要安装第三方编码器 x265

1.6 libmp3lame

libmp3lame 是开源的 mp3 编码器。
libmp3lame 官网:http://lame.sourceforge.net/

1.7 librtmp

librtmp: RTMPDump Real-Time Messaging Protocol API。
librtmp 又称 rtmpdump,是用于处理 RTMP 流的工具。支持所有形式的 RTMP,包括 rtmp://, rtmpt://, rtmpe://, rtmpte://, 和 rtmps://。
librtmp 文档:http://rtmpdump.mplayerhq.hu/librtmp.3.html
librtmp 官网:http://rtmpdump.mplayerhq.hu/

2. 编译安装过程

2.1 规划安装路径

将编译源码得到的程序资源安装到用户目录 $HOME 下。则安装后,$HOME 目录下会多出 bin、include、lib、share 等目录。

配置环境变量

编辑 /etc/profile,添加如下几行:

export PATH=$HOME/bin:$PATH
export LIBRARY_PATH=$HOME/lib:$HOME/lib64:$LIBRARY_PATH
export LD_LIBRARY_PATH=$HOME/lib:$HOME/lib64:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=$HOME/lib/pkgconfig:$PKG_CONFIG_PATH
export C_INCLUDE_PATH=$HOME/include:$C_INCLUDE_PATH

上述几个环境变量是程序编译时需要用到的库文件、头文件路径,以及可执行程序所在路径。

在命令行中运行如下命令,使新设置的环境变量立即生效:

source /etc/profile

配置动态库路径

编辑 /etc/ld.so.conf,添加如下两行:

$HOME/lib
$HOME/lib64

ld.so.conf 中的内容是程序运行时需要搜索的动态库路径。

在命令行中运行如下命令,使新设置的动态库路径立即生效:

ldconfig

2.2 SDL

注意:应先安装 SDL,再安装 FFmpeg,否则 FFmpeg 编译时不会生成 ffplay
原因如参考资料[3]所述。

可以在 SDL 官网 https://www.libsdl.org/ 下载最源码包编译安装。通过编译源码安装的方式,编译安装成功后运行 ffplay 可能会遇到挺多问题,参 “4. 问题描述”。所以不推荐使用源码编译安装。

通过软件源在线安装:

sudo zypper install libSDL2-devel libSDL2_image-devel libSDL2_mixer-devel libSDL2_ttf-devel libSDL2_gfx-devel

2.3 yasm/nasm

旧版 FFmpeg 及 x264/x265 使用 yasm 汇编器,新版 FFmpeg 及 x264/x265 改用 nasm 汇编器。具体从哪一版本开始改用nasm不太清楚。在官网 https://www.nasm.us/ 下载最新版源码 nasm-2.16.03.tar.bz2 编译安装,如下:

wget -c -O nasm-2.16.03.tar.bz2 --no-check-certificate https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/nasm-2.16.03.tar.bz2

tar -jxvf nasm-2.16.03.tar.bz2
cd nasm-2.16.03/

./configure --prefix=$HOME
make
make install

2.4 x264

在网址 https://www.videolan.org/developers/x264.html 下载源码包 last_x264.tar.bz2,这是 git 仓库的 master 分支源码。我们输入以下地址:http://download.videolan.org/x264/snapshots/,可以选择最新的 stable 版本源码包进行下载,当前最新版本为 x264-snapshot-20191217-2245-stable.tar.bz2。过程如下:

wget -c --no-check-certificate http://download.videolan.org/x264/snapshots/x264-snapshot-20191217-2245-stable.tar.bz2

tar -jxvf x264-snapshot-20191217-2245-stable.tar.bz2
cd x264-snapshot-20191217-2245-stable/

./configure --prefix=$HOME --enable-shared --enable-static  
make  
make install  

注意第 4 行配置选项中,未给出 --disable-asm 选项,则表示启用汇编选项

2.5 x265

在网址 https://bitbucket.org/multicoreware/x265_git/downloads/ 下载源码包 x265_4.1.tar.gz,编译说明参照 https://bitbucket.org/multicoreware/x265_git/wiki/Home。过程如下:

wget -c --no-check-certificate https://bitbucket.org/multicoreware/x265_git/downloads/x265_4.1.tar.gz

tar -zxvf x265_4.1.tar.gz
cd x265_4.1/build/linux/

./make-Makefiles.bash  
# 在上一行命令运行快结束时,出现 cmake 配置信息编辑界面,将 CMAKE_INSTALL_PREFIX 的值
# 改成环境变量 $HOME 的值,比如 /home/frank
make  
make install  

2.6 libmp3lame

在官网 http://lame.sourceforge.net/ 下载最新源码 lame-3.100.tar.gz 编译安装,过程如下:

wget -c -O lame-3.100.tar.gz --no-check-certificate https://cytranet-dal.dl.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz?viasf=1

tar -zxvf lame-3.100.tar.gz
cd lame-3.100

./configure --prefix=$HOME
make
make install

2.7 librtmp

根据官网 http://rtmpdump.mplayerhq.hu/ 说明,通过 git 下载源码。编译安装方法参考源码目录下 README 文件和 Makefile 文件。过程如下:

git clone git://git.FFmpeg.org/rtmpdump
cd rtmpdump

make CRYPTO=GNUTLS
make install prefix=$HOME

2.8 FFmpeg

在官网 https://www.ffmpeg.org/ 下载最新版源码包。或者使用 git 克隆 FFmpeg 源码仓库。FFmpeg 源码仓库地址 https://git.ffmpeg.org/ffmpeg.git,在 github 上镜像地址 https://github.com/FFmpeg/FFmpeg.git。 过程如下:

git clone https://git.ffmpeg.org/ffmpeg.git
cd ffmpeg
git tag
git checkout -b n8.0 n8.0

./configure --prefix=$HOME \
--enable-shared --enable-static --enable-gpl --enable-pthreads \
--enable-libx264 --enable-libx265 --enable-libmp3lame --enable-librtmp \
--extra-cflags=-I$HOME/include --extra-ldflags=-L$HOME/lib
make
make install

./configure 选项中 --extra-cflags=-I$HOME/include --extra-ldflags=-L$HOME/lib 是指定 FFmpeg 编译时需要的第三方库 (libx264 等) 的头文件目录和库文件目录。我们前面已将所有第三方库的安装路径都设置到了 $HOME 目录。

如果机器上已经编译安装过 FFmpeg,需要再次编译安装时,需要先卸载旧版本的头文件和库文件,否则编译时可能优先使用已安装的旧的头文件或库文件,导致编译失败。卸载命令如下:

./configure --prefix=$HOME
make uninstall

如果是全新安装,不必执行上述卸载命令。

3. 测试

下载测试文件:

git clone https://github.com/leichn/ffmpeg_training.git
cd ffmpeg_training/video/xing/

选用 ffmpeg_training/video/xing/huangh.flv 作为测试文件。在命令行中运行如下测试命令:

ffmpeg -i huangh.flv -c copy huangh.ts
ffplay huangh.flv
ffprobe huangh.flv

注意:
远程终端处于控制台命令行模式时 (运行级别为 3,即命令行模式),无权限调用 SDL,因此无法测试 ffplay,但可以测试 ffmpeg 和 ffprobe。测试 ffplay 需要 X11 控制台模式 (运行级别为 5,即 GUI 图形模式)。

4. 问题记录

4.1 No available video device

错误提示:
Could not initialize SDL - No available video device
(Did you set the DISPLAY variable?)

原因分析:
参考资料[4]https://blog.csdn.net/huanghai381/article/details/51777446
解决方法:
a) 安装x11的库文件:
opensuse平台:

zypper install libX11-devel
zypper install xorg-x11-devel

ubuntu平台:

apt-get install libx11-dev
apt-get install xorg-dev

b) 重新编译安装SDL

4.2 Audio target 'pulse' not available

错误提示:
Could not initialize SDL - Audio target 'pulse' not available
(Did you set the DISPLAY variable?)

原因分析:
参考资料[5]http://forums.libsdl.org/viewtopic.php?t=7609
解决方法:
a) 安装缺少的库
opensuse 平台:

zypper install libpulse-devel
zypper install libasound2
zypper install libasound2-devel    // 实测不安装此包也无问题,若软件源中无此包则不必安装

ubuntu 平台:

apt-get install libpulse-dev
apt-get install libasound2
apt-get install libasound2-dev

b) 重新编译安装 SDL

4.3 x265 not found using pkg-config

错误提示:
编译FFmpeg,运行./configure --enable-libx265 ...出现如下错误提示:
x265 not found using pkg-config
原因分析:
参考资料[6]https://stackoverflow.com/questions/51918409/compiling-FFmpeg-x265-not-found-using-pkg-config
解决方法:
export PKG_CONFIG_PATH=$HOME/lib/pkgconfig:$PKG_CONFIG_PATH

5. 参考资料

[1] “FFmpeg 编译”, https://blog.csdn.net/season_hangzhou/article/details/24399371
[2] “FFmpeg 编译”,https://www.cnblogs.com/HongyunL/p/5243096.html
[3] “FFmpeg 编译未生成ffplay”, http://blog.chinaunix.net/uid-11344913-id-3936227.html
[4] “SDL 失败:无有效视频设备”,https://blog.csdn.net/huanghai381/article/details/51777446
[5] “SDL 失败:无有效音频设备”,http://forums.libsdl.org/viewtopic.php?t=7609
[6] “x265 not found using pkg-config”,https://stackoverflow.com/questions/51918409/compiling-FFmpeg-x265-not-found-using-pkg-config
[7] “configure, pkg-config”,https://www.cnblogs.com/wliangde/p/3807532.html
[8] “Yasm”, https://zh.wikipedia.org/wiki/Yasm
[9] “NASM”, https://zh.wikipedia.org/wiki/Netwide_Assembler

6. 修改记录

2018-11-20 1.0 初稿
2019-03-26 1.1 增加 librtmp 库。FFmpeg 版本 4.1 升级至 4.1.2
2019-04-04 1.2 增加 libmp3lame 库
2020-02-22 1.3 FFmpeg 版本 4.1.2 升级至 4.2.2
2025-03-17 1.4 FFmpeg 版本 4.2.2 升级至 7.1.1
2025-08-25 1.5 FFmpeg 版本 7.1.1 升级到 8.0

posted @ 2018-11-28 22:14  叶余  阅读(11534)  评论(3)    收藏  举报