• 💂 个人主页:风间琉璃
  • 🤟 版权: 本文由【风间琉璃】原创、在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系统不支持命令行安装如下依赖库,那就需要手动编译安装了,具体参考上面的链接。

image-20250119113357725

②下载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

image-20250119114346475

这条配置命令的作用是为 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 的库文件路径。

image-20250119115659052

然后执行 source ~/.bashrc 使其生效。

编译安装完成后,再次验证FFmpeg版本:

ffmpeg -version
image-20250119120229657

1.2 Qt中配置FFmpeg

创建一个空的Qt工程,在 Qt 项目中使用 FFmpeg 的库和头文件,需要将 FFmpeg 的头文件和库文件路径添加到 INCLUDEPATHLIBS 中。编辑.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配置成功啦。

image-20250119160957619

二、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等模块库,细节结构如下图所示。

image-20250118203526569

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中,滤镜框架可以有多个输入和多个输出。滤镜处理的例子如下图所示。

image-20250118204635347

这个例子将输入的视频切割成两部分流,一部分流抛给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图像序列)。

结束语

感谢阅读吾之文章,今已至此次旅程之终站 🛬。

吾望斯文献能供尔以宝贵之信息与知识也 🎉。

学习者之途,若藏于天际之星辰🍥,吾等皆当努力熠熠生辉,持续前行。

然而,如若斯文献有益于尔,何不以三连为礼?点赞、留言、收藏 - 此等皆以证尔对作者之支持与鼓励也 💞。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐