本文为作者原创,转载请注明出处: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. js加减运算·传参

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  2. ajax点击加载更多图片

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. CMUSphinx Learn - Before you start

    Before you start 开始之前 Before you start the development of the speech application, you need to consid ...

  4. 两数据库Dblink数据抽取blob

    在目标数据库建一张临时表Create global temporary table test3 on commit preserve rows as select * from TEST1 ;在目前数 ...

  5. 团队作业第5周 - 测试与发布(Alpha版本)- 天冷记得穿秋裤队

    团队作业第5周 - 测试与发布(Alpha版本)- 天冷记得穿秋裤队 Alpha版本测试报告 在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? 前后端至今一共发现有10个bug,修复的 ...

  6. python--求参赛两队所有可能的比赛组合情况

    朋友遇到一个面试题,让我帮忙实现,题目如下: 红队有A1,B1,C1三名队员,蓝队有A2,B2,C2三名队员,每轮比赛各队出一名队员参加,一名队员只能参加一次比赛,假设A1不会和B2打,B1不会和B2 ...

  7. uwsgi+nginx+django

    http://blog.csdn.net/c465869935/article/details/53242126 http://uwsgi-docs.readthedocs.io/en/latest/ ...

  8. 查看指定spid的脚本当前运行情况和状态

    USE MasterGO declare @spid int; select @spid = 419--null:all ; ;WITH DATA(spid,blockRelationship,blo ...

  9. Http/Https抓包工具Charles最新版破解教程(Windows|Mac)

    Charles介绍 Charles是一款强大的http/https抓包工具,可以抓取各种数据请求,查看请求的头信息,请求信息,返回信息等.本文主要介绍Charles的破解过程,包括Windows平台和 ...

  10. AJPFX:什么是止盈?什么是止损?

    在您进行外汇交易后,会碰到Take Profit(止盈)和 Stop Loss(止损)这两个词,均是用作控制风险的工具. 止盈(Take Profit):当单子达到预期的获利价格时锁定盈利.当订单在盈 ...