FFmpeg入门
本文介绍了FFmpeg在Linux系统下的安装配置及Qt开发环境集成方法。主要内容包括: FFmpeg安装:通过源码编译方式安装FFmpeg 4.3版本,配置依赖库路径并验证安装成功; Qt项目配置:在.pro文件中添加FFmpeg头文件路径和库文件链接,通过测试代码验证集成效果; FFmpeg框架组成:简要说明其分层架构,重点介绍AVFormat(封装/解封装)和AVCodec(编解码)两大核心
文章目录
- 💂 个人主页:风间琉璃
- 🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主
- 💬 如果文章对你有
帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦
前言
提示:这里可以添加本文要记录的大概内容:
一、FFmpeg安装(linux+qt)
参考链接:FFmpeg安装
1.1 ffmpeg安装
①首先安装编译FFmpeg所需的依赖包:
sudo apt update
sudo apt install yasm libfaac-dev libmp3lame-dev libopus-dev libx264-dev libx265-dev libtheora-dev libvorbis-dev libxvidcore-dev libxext-dev libxfixes-dev
如果linux系统不支持命令行安装如下依赖库,那就需要手动编译安装了,具体参考上面的链接。
②下载FFmpeg源码进行安装,这里下载是FFmpeg-release-4.3版本。下载链接:FFmpeg官网下载。
进行主目录配置,安装目录为/usr/local, 指令如下
./configure --prefix=/usr/local --enable-pic --enable-shared --enable-gpl --enable-libmp3lame --enable-libopus --enable-libx264 --enable-libx265 --enable-nonfree --enable-pthreads
这条配置命令的作用是为 FFmpeg 编译启用一系列常用的编解码器和功能:
- 生成共享库并支持多线程。
- 启用 GPL 授权功能,支持 H.264(
libx264)、H.265(libx265)、MP3(libmp3lame)和 Opus(libopus)编解码器。 - 安装路径为
/usr/local。 - 启用位置无关代码和共享库构建。
这样的配置适合需要高效视频音频编码功能,并且愿意使用一些非自由软件(如 x264 和 x265)的用户。如果不需要使用某些库或者想要禁用某些功能,可以根据需求调整这些选项。
③编译FFmpeg
make -j32
④安装并验证是否安装成功
sudo make install
安装完成后,需要配置环境变量,如果 FFmpeg 编译时使用了非标准的库路径,而运行时没有设置正确的库路径,系统就会无法找到需要的库文件。在~/.bashrc文件中添加如下指令:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
确保环境变量 LD_LIBRARY_PATH 包含 FFmpeg 的库文件路径。

然后执行 source ~/.bashrc 使其生效。
编译安装完成后,再次验证FFmpeg版本:
ffmpeg -version
1.2 Qt中配置FFmpeg
创建一个空的Qt工程,在 Qt 项目中使用 FFmpeg 的库和头文件,需要将 FFmpeg 的头文件和库文件路径添加到 INCLUDEPATH 和 LIBS 中。编辑.pro项目文件,添加如下:
INCLUDEPATH += /usr/local/include/ffmpeg
LIBS += -L/usr/local/lib \
-lavcodec \
-lavformat \
-lavdevice \
-lavutil \
-lswscale
INCLUDEPATH 用来指定 FFmpeg 头文件的位置。LIBS 用来指定 FFmpeg 的库文件路径,并链接所需的 FFmpeg 库,如 libavcodec, libavformat, libavutil, libswscale 等。
在main.cpp进行验证,输出 FFmpeg 的编解码器配置和版本信息。
#include "mainwindow.h"
#include <QApplication>
#include <qdebug.h>
extern "C"
{
#include <libavcodec/avcodec.h>
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
// 输出 FFmpeg 编解码器配置
qDebug() << avcodec_configuration();
// 输出 FFmpeg 编解码器版本
qDebug() << avcodec_version();
w.show();
return a.exec();
}
输出如下,基本上FFmpeg配置成功啦。
二、FFmpeg基本组成
相关术语:
容器(Container)格式:一种用于文件封装的格式,通常包含一个或多个流。每种容器格式通常会使用特定的后缀名来标识,例如 .mov、.avi、.wav 等。
流(Stream):容器内存储的音频(Audio)、视频(Video)或字幕(Subtitle)等数据。每个流包含特定的媒体内容。
元数据(Metadata):位于容器中的附加信息,用于描述和补充媒体内容。一个常见的例子是MP3文件中的ID3标签,它包含了如艺术家、专辑、曲目等信息。
编解码器(Codec):是“enCOder”(编码器)和“DECoder”(解码器)这两个词的缩写,通常指一种压缩标准。例如,AVC/H.264、HEVC/H.265、VVC/H.266、AV1等都是常见的视频编码标准。编解码器负责将媒体内容进行压缩和解压缩。
FFmpeg框架可以简单分为两层,上层是以ffmpeg、ffplay、ffprobe为代表的命令行工具;其底层支撑是一些基础库,包含AVFormat、AVCodec、AVFilter、AVDevices、AVUtils等模块库,细节结构如下图所示。
2.1 封装**/**解封装模块AVFormat
AVFormat实现了当前多媒体领域中的大多数媒体封装格式和流媒体协议,包括封装器(Muxer)和解封装器(Demuxer)。它支持各种文件格式的封装和解封装,如MP4、FLV、MKV、TS等,以及流媒体协议如RTMP、RTSP、MMS、HLS等。
FFmpeg是否支持某种媒体封装格式,取决于编译时是否包括该格式的解封装器(Demuxer)和封装器(Muxer)。如果FFmpeg不支持某些新的容器格式,可以根据实际需求进行扩展,增加所需的封装格式。扩展的主要工作是在AVFormat中,根据FFmpeg的框架要求,增加相应的封装和解封装处理模块。
2.2 编**/**解码模块AVCodec
AVCodec实现了当前多媒体领域中大多数常用的编解码格式,既支持编码也支持解码。AVCodec不仅原生支持许多编解码格式(即FFmpeg自行实现,如H.264、AAC、MJPEG等),还可以通过集成第三方库来支持其他编解码器。例如,H.264(AVC)编码需要使用x264编码器,H.265(HEVC)编码需要使用x265编码器,MP3编码则需要使用libmp3lame编码器。
2.3 滤镜模块AVFilter
AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。滤镜处理的例子如下图所示。
这个例子将输入的视频切割成两部分流,一部分流抛给crop与vflip滤镜处理模块进行操作,另一部分保持原样;当crop与vflip滤镜处理操作完成后,将流合并到原有的overlay图层中,并显示在最上面一层,输出新的视频。
2.4 设备模块AVDevice
AVDevice提供了常用的输入输出设备处理框架,用于不同平台上的音视频输入和输出设备管理:
- macOS和iOS:一般使用AVFoundation来调用底层音视频输入以及桌面共享。
- Windows:常用**dshow(DirectShow)**作为音视频输入设备。
- Linux
- 音频输入输出设备:如oss(Open Sound System)、alsa(Advanced Linux Sound Architecture)、fbdev(Frame Buffer)、openal(OpenAL)、**pulse(Pulse Audio)**等。
- 视频设备:如opengl(OpenGL)、video4linux2(Video for Linux)、**x11grab(基于XCB的X11桌面捕获)**等。
- 跨平台输出设备:sdl和**sdl2(Simple Directmedia Layer)**是不同版本的跨平台输出设备,能够在大多数平台上使用。
此外,AVDevice还提供了一个名为lavfi的虚拟输入设备,它允许使用Libavfilter的滤镜链或表达式作为输入或输出设备。通过lavfi,可以方便地生成“假”的音频(如某一频率的声音或高斯白噪声)和视频流(如纯色或渐变的RGB图像序列)。
结束语
感谢阅读吾之文章,今已至此次旅程之终站 🛬。
吾望斯文献能供尔以宝贵之信息与知识也 🎉。
学习者之途,若藏于天际之星辰🍥,吾等皆当努力熠熠生辉,持续前行。
然而,如若斯文献有益于尔,何不以三连为礼?点赞、留言、收藏 - 此等皆以证尔对作者之支持与鼓励也 💞。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)