本文主要讲述linux平台x86(及x86-64)架构下的ffmpeg编译安装过程。
其他嵌入式平台需要交叉编译,过程类似,不详述。
本实验在opensuse和ubuntu两个平台作了验证。使用lsb_release -a
命令查看系统发行版版本:
opensuse平台版本:openSUSE Leap 42.3。
ubuntu平台版本:Ubuntu 16.04.5 LTS。
ffmpeg官网:https://www.ffmpeg.org/
SDL(Simple DirectMedia Layer)是一套开源的跨平台多媒体开发库。SDL提供了数种控制图像、声音、输出输入的函数,封装了复杂的视音频底层操作,简化了视音频处理的难度。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。 SDL官网:https://www.libsdl.org/
旧版ffmpeg及x264使用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改用nasm汇编器 Netwide Assembler(简称NASM)是一款基于英特尔x86架构的汇编与反汇编工具。NASM被认为是Linux平台上最受欢迎的汇编工具之一。 注意,NASM是x86平台汇编器,不需要交叉编译。若是arm等其他平台,交叉编译工具链中包含有对应的汇编器,则交叉编译FFmpeg时需要--disable-x86asm选项。 NASM官网:https://www.nasm.us/
x264是开源的h264编码器,使用非常广泛,综合性能不比商业编解码器差。 x264官网:https://www.videolan.org/developers/x264.html ffmpeg工程中实现了h264解码器,但无h264编码器。因此需要安装第三方编码器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
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/
将编译源码得到的程序资源安装到用户目录/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
注意:应先安装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可能会遇到挺多问题,参“4. 问题描述” 通过软件源在线安装(推荐) 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
旧版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
在网址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选项,则表示启用汇编选项
在网址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
根据官网http://rtmpdump.mplayerhq.hu/说明,通过git下载源码。 编译安装方法参考源码目录下README文件和Makefile文件。
git clone git://git.ffmpeg.org/rtmpdump
cd rtmpdump
make SYS=posix
make install prefix=/home/think
直接在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 n4.1.2 n4.1.2
./configure --prefix=/home/think --enable-shared --enable-static --enable-gpl --enable-pthreads \
--enable-libx264 --enable-libx265 --enable-librtmp \
--extra-cflags=-I/home/think/include --extra-ldflags=-L/home/think/lib
make uninstall
make
make install
./configure
选项中--extra-cflags=-I/home/think/include --extra-ldflags=-L/home/think/lib
是指定FFmpeg编译时需要的第三方库(libx264等)的头文件目录和库文件目录。因为我们前面将所有第三方库的安装路径都设置为/home/think/
目录。
如果机器上已经编译安装过FFmpeg,需要再次编译安装时,需要先执行make uninstall
以删除旧版本的头文件和库文件,否则编译时可能优先使用已安装的旧的头文件或库文件,导致编译失败。如果是全新安装,不必执行make uninstall
。
测试文件下载(右键另存为):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图形模式)。
错误提示: 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
错误提示: 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
错误提示:
编译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 初稿 2019-03-26 1.1 增加librtmp库。ffmpeg版本4.1升级至4.1.2