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

1. 相关资源介绍

本文主要讲述 linux 平台 x86(及x86-64) 架构下的 ffmpeg 编译安装过程。

其他嵌入式平台需要交叉编译,过程类似,不详述。

本实验在 opensuse 和 ubuntu 两个平台作了验证。使用lsb_release -a命令查看系统发行版版本:

opensuse 平台版本:openSUSE Leap 15.1。

ubuntu 平台版本:Ubuntu 16.04.5 LTS。

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/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.2 SDL

注意:应先安装 SDL,再安装 ffmpeg,否则 ffmpeg 编译时不会生成 ffplay

原因如参考资料[3]所述。

两种安装方式,推荐第二种方式,可能遇到的问题比较少

编译源码安装(不推荐)

在 SDL 官网 https://www.libsdl.org/ 下载最新源码包 SDL2-2.0.10.tar.gz

tar -zxvf SDL2-2.0.10.tar.gz
cd SDL2-2.0.10/ ./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

2.3 yasm/nasm

旧版 ffmpeg 及 x264/x265 使用 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/x265 改用 nasm 汇编器

具体从哪一版本开始改用nasm不太清楚。在官网 https://www.nasm.us/ 下载最新版源码 nasm-2.14.02.tar.bz2

tar -zxvf nasm-2.14.02.tar.gz
cd nasm-2.14/ ./configure --prefix=/home/think
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。

tar -jxvf x264-snapshot-20191217-2245-stable.tar.bz2
cd x264-snapshot-20191217-2245-stable/ ./configure --prefix=/home/think --enable-shared --enable-static
make
make install

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

2.5 x265

在网址 https://bitbucket.org/multicoreware/x265/downloads/ 下载源码包 x265_3.0.tar.gz

编译说明参照 https://bitbucket.org/multicoreware/x265/wiki/Home

tar -zxvf x265_3.3.tar.gz
cd x265_3.3/build/linux/ ./make-Makefiles.bash
在上一行命令运行快结束时,出现 cmake 配置信息编辑界面,将 CMAKE_INSTALL_PREFIX 的值改成 /home/think
make
make install

2.6 libmp3lame

在官网 http://lame.sourceforge.net/ 下载最新源码 lame-3.100.tar.gz

tar -zxvf lame-3.100.tar.gz
cd lame-3.100 ./configure --prefix=/home/think
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/think

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 n4.2.2 n4.2.2 ./configure --prefix=/home/think \
--enable-shared --enable-static --enable-gpl --enable-pthreads \
--enable-libx264 --enable-libx265 --enable-libmp3lame --enable-librtmp \
--extra-cflags=-I/home/think/include --extra-ldflags=-L/home/think/lib
make
make install

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

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

./configure --prefix=/home/think
make uninstall

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

3. 测试

测试文件下载(右键另存为):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/think/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

FFmpeg开发环境构建的更多相关文章

  1. windows环境下搭建ffmpeg开发环境

           ffmpeg是一个开源.跨平台的程序库,能够使用在windows.linux等平台下,本文将简单解说windows环境下ffmpeg开发环境搭建过程,本人使用的操作系统为windows ...

  2. VS2013+ffmpeg开发环境搭建

    VS2013+ffmpeg开发环境搭建 转 https://blog.csdn.net/u014253332/article/details/86657868 一.准备ffmpeg相对应开发dll.i ...

  3. Visual Studio 开发(二):VS 2017配置FFmpeg开发环境

    在上篇文章Visual Studio 开发(一):安装配置Visual Studio Code 中,我们讲了一下如何配置VS CODE,来编写和调试C的代码.如果你已经使用VS Code回顾和复习好C ...

  4. VS2013+ffmpeg开发环境搭建-->【转】

    本文转载自:http://blog.csdn.net/qq_28425595/article/details/51488869 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天整理资料时,发 ...

  5. 嵌入式linux开发环境构建

    2.1硬件环境构建 2.1.1主机与目标板结合的交叉开发模式 在主机上编辑.编译软件,然后再目标办上运行.验证程序. 对于S3C2440.S3C2410开发板,进行嵌入式Linux开发时一般可以分为以 ...

  6. Spark 1.0 开发环境构建:maven/sbt/idea

    因为我原来对maven和sbt都不熟悉,因此使用两种方法都编译了一下.下面记录一下编译时候遇到的问题.然后介绍一下如果使用IntelliJ IDEA 13.1构建开发环境. 首先准备java环境和sc ...

  7. ESP32 Eclipse开发环境构建与问题总结

    搞了一个多星期的eclipse环境构建,终于成功了,在此记录下期间遇到的问题. 以下为遇到的几点问题的解决方法: 1.使用的版本为V3.1版本,版本时间为2018年09月07日,可以直接在以下路径下载 ...

  8. Spark的Java开发环境构建

    为开发和调试SPark应用程序设置的完整的开发环境.这里,我们将使用Java,其实SPark还支持使用Scala, Python和R.我们将使用IntelliJ作为IDE,因为我们对于eclipse再 ...

  9. java开发环境构建

    一. 基本工具安装 1. 配置终端命令别名 vim ~/.bash_profile *********************************************** # for colo ...

随机推荐

  1. 数字证书管理工具openssl和keytool的区别

    1. 用SSL进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接(我们链接一般的SSL时采用的是单向验证,客户机只验证服务器的证书,服务器 ...

  2. MODBUS串行通信协议详细说明

    第一章  简介 本文详细地描述了装置在MODBUS 通讯模式下的输入和输出命令.信息和数据,以便第三方使用和开发. 1.1 串行通讯协议的目的 通信协议的作用是使信息和数据在上位机主站和装置之间有效地 ...

  3. Android-Kotlin-递归与尾递归

    递归: 阶乘计算: /** * 阶乘: * 1的阶乘是1,因为1往下走一个楼梯 就是0了 * 2的阶乘是 2*1 * 3的继承是 3*2*1 * 4的继承是 4*3*2*1 * 5的阶乘是 5*4*2 ...

  4. node-webkit学习(3)Native UI API概览

    node-webkit学习(3)Native UI API概览 文/玄魂 目录 node-webkit学习(3)Native UI API概览 前言 3.1  Native UI api概览 Exte ...

  5. docker实用命令集合

    1. 访问docker中的MySQL数据库: docker exec -it test_mysql_1 mysql -u root -p 2. 用docker命令导入或导出mysql数据: 导出doc ...

  6. 关于css中float的理解

    感觉css里的float是个非常神奇的东西,神奇之处在于,你知道它是什么意思,但是用的时候总是不知道怎么实现效果.又或者它会很容易地影响到别的元素和属性.所以今天打算尝试一下float的各种设置,看看 ...

  7. 【HDU5730】 Shell Necklace

    HDU5730 Shell Necklace 题目大意 已知连续i(1<=i<=n)个贝壳组合成一段项链的方案数a[i],求组合成包含n个贝壳的项链的总方案数. Solution cdq分 ...

  8. sam(后缀自动机)

    后缀自动机ins解释 void ins(int c){ int p=last;//将当前节点的parent节点变为last int np=++cnt;//建立新节点 last=np;//将last设为 ...

  9. BZOJ 3940--[Usaco2015 Feb]Censoring(AC自动机)

    3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 723  Solved: 360[Subm ...

  10. JavaScript基础(1)-ECMAScript

    一.JavaScript简介 1.JavaScript历史背景 布兰登 • 艾奇(Brendan Eich,1961年-),1995年在网景公司,发明的JavaScript. 刚开始JavaScrip ...