一、相关资源介绍
本文主要讲述linux平台x86(及x86-64)架构下的ffmpeg编译安装过程。
其他嵌入式平台需要交叉编译,过程类似,不详述。
本实验在opensuse和ubuntu两个平台作了验证。使用lsb_release -a
命令查看系统发行版版本:
opensuse平台版本:openSUSE Leap 42.3。
ubuntu平台版本:Ubuntu 16.04.5 LTS。
1. yasm/nasm
旧版ffmpeg及x264使用yasm汇编器
Yasm是英特尔x86架构下的一个汇编器和反汇编器。Yasm是一个完全重写的Netwide汇编器(NASM)。Yasm通常可以与NASM互换使用,并支持x86和x86-64架构。其许可协议为修订过的BSD许可证。
此处Yasm用来编译x86平台下ffmpeg中部分汇编代码。
注意,Yasm是x86平台汇编器,不需要交叉编译。若是arm等其他平台,交叉编译工具链中包含有对应的汇编器,则交叉编译时需要--disable-yasm选项。
Yasm官网:http://yasm.tortall.net/
新版ffmpeg及x264改用nasm汇编器
Netwide Assembler(简称NASM)是一款基于英特尔x86架构的汇编与反汇编工具。NASM被认为是Linux平台上最受欢迎的汇编工具之一。
NASM官网:https://www.nasm.us/
2. x264
x264是开源的h264编码器,使用非常广泛,综合性能不比商业编解码器差。
x264官网:https://www.videolan.org/developers/x264.html
3. 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
4. SDL
SDL(Simple DirectMedia Layer)是一套开源的跨平台多媒体开发库。SDL提供了数种控制图像、声音、输出输入的函数,封装了复杂的视音频底层操作,简化了视音频处理的难度。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。
SDL官网:https://www.libsdl.org/
5. ffmpeg
ffmpeg官网:https://www.ffmpeg.org/
二、编译过程
1. 规划安装路径
将编译源码得到的程序资源安装到用户目录/home/think下。则安装后,/home/think目录下会多出bin、include、lib、share等目录
配置环境变量
编辑/etc/profile,添加如下几行:
export PATH=/home/think/bin:$PATH
export LIBRARY_PATH=/home/think/lib:/home/think/lib64:$LIBRARY_PATH
export PKG_CONFIG_PATH=/home/think/lib/pkgconfig:$PKG_CONFIG_PATH
export C_INCLUDE_PATH=/home/think/include:$C_INCLUDE_PATH
上述几个环境变量是程序编译时需要用到的库文件、头文件路径,以及可执行程序所在路径。
在命令行中运行如下命令,使新设置的环境变量立即生效:
source /etc/profile
配置动态库路径
编辑/etc/ld.so.conf,添加如下两行:
/home/think/lib
/home/think/lib64
ld.so.conf中的内容是程序运行时需要搜索的动态库路径。
在命令行中运行如下命令,使新设置的动态库路径立即生效:
ldconfig
2. yasm/nasm
旧版ffmpeg及x264使用yasm汇编器
在官网下载页面http://yasm.tortall.net/Download.html下载最新版源码yasm-1.3.0.tar.gz
tar -zxvf yasm-1.3.0.tar.gz
cd yasm-1.3.0/
./configure --prefix=/home/think
make
make install
新版ffmpeg及x264改用nasm汇编器
具体从哪一版本开始改用nasm不太清楚,至今日2018-11-20得到的最新版本已改用nasm
在官网https://www.nasm.us/下载最新版源码nasm-2.14.tar.bz2
tar -zxvf nasm-2.14.tar.gz
cd nasm-2.14/
./configure --prefix=/home/think
make
make install
3. x264
在网址https://www.videolan.org/developers/x264.html下载源码包last_x264.tar.bz2,这是git仓库的master分支源码。我们直接输入以下地址下载stable分支:
http://download.videolan.org/x264/snapshots/last_stable_x264.tar.bz2
下载得到last_stable_x264.tar.bz2源码包。
tar -jxvf last_stable_x264.tar.bz2
cd x264-snapshot-20181119-2245-stable/
./configure --prefix=/home/think --enable-shared --enable-static
make
make install
注意第4行配置选项中,未给出--disable-asm选项,则表示启用汇编选项
4. x265
在网址https://bitbucket.org/multicoreware/x265/downloads/下载源码包x265_2.9.tar.gz
编译说明参照https://bitbucket.org/multicoreware/x265/wiki/Home
tar -zxvf x265_2.9.tar.gz
cd x265_2.9/build/linux/
./make-Makefiles.bash
在上一行命令运行快结束时,出现cmake配置信息编辑界面,将CMAKE_INSTALL_PREFIX的值改成/home/think
make
make install
5. SDL
注意:应先安装SDL,再安装ffmpeg,否则ffmpeg编译时不会生成ffplay
原因如参考资料[3]所述。
两种安装方式,推荐第二种方式,可能遇到的问题比较少
编译源码安装(不推荐)
在SDL官网https://www.libsdl.org/下载最新源码包SDL2-2.0.9.tar.gz
tar -zxvf SDL2-2.0.9.tar.gz
cd SDL2-2.0.9/
./configure --prefix=/home/think
make
make install
通过编译源码安装的方式,编译安装成功后运行ffplay可能会遇到挺多问题,参“六、问题描述”
通过软件源在线安装(推荐)
opensuse平台:
zypper install libSDL2-devel
zypper install libSDL2_image-devel
zypper install libSDL2_mixer-devel
zypper install libSDL2_ttf-devel
zypper install libSDL2_gfx-devel
ubuntu平台:
apt-get install libsdl2-dev
apt-get install libsdl2-image-dev
apt-get install libsdl2-mixer-dev
apt-get install libsdl2-ttf-dev
apt-get install libsdl2-gfx-dev
6. ffmpeg
在ffmpeg官网https://www.ffmpeg.org/下载最新版源码ffmpeg-4.1.tar.bz2
tar -jxvf ffmpeg-4.1.tar.bz2
cd cd ffmpeg-4.1/
./configure --prefix=/home/think --enable-shared --enable-static --enable-libx264 --enable-libx265 --enable-gpl --enable-pthreads --extra-cflags=-I/home/think/include --extra-ldflags=-L/home/think/lib
make
make install
五、测试
在命令行中运行如下测试命令:
ffmpeg -i bigbuckbunny_480x272.h265 bigbuckbunny_480x272.mp4
ffplay 128x128.264
ffprobe 128x128.264
注意:
远程终端处于控制台命令行模式(运行级别3),无权限调用SDL,因此无法测试ffplay,但可以测试ffmpeg和ffprobe。测试ffplay需要X11控制台模式(运行级别5,即GUI图形模式)。
六、问题记录
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
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
3. x265 not found using pkg-config
错误提示:
编译ffmpeg,运行./configure --enable-libx265 ...
出现如下错误提示:
x265 not found using pkg-config
原因分析:
参考资料[5]http://forums.libsdl.org/viewtopic.php?t=7609
解决方法:
export PKG_CONFIG_PATH=/home/think/lib/pkgconfig:$PKG_CONFIG_PATH
七、参考资料
[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
八、修改记录
2018-11-20 1.0 初稿