书籍基本信息
书名: 《深入理解FFmpeg》
作者: 刘歧、杜金房、宋韶颍 等
出版社: 电子工业出版社
出版时间: 2020 年
适合读者: FFmpeg 开发者、音视频工程师、对 FFmpeg 源码感兴趣的技术人员。深入理解
深入理解FFmpeg - 第1章 多媒体基础 - 刘歧 赵军 杜金房 赵文杰 宋韶颍 - 微信读书
目标
总结本章知识,对于前期学习音视频流媒体开发没提到的知识点进行详细描述。查漏补缺
FFmpeg 简介
FFmpeg 的许可证
FFmpeg 的发布许可证取决于编译时的选项:
LGPL-2.1(及之后):适用于使用动态链接库的情况,允许闭源使用。
GPL-2.0(及之后):适用于使用静态链接库或修改 FFmpeg 源代码的情况,要求开源。
开发者可以根据需求选择合适的许可证版本。
总结
-
FFmpeg 既是一个多媒体工具集(包含 ffmpeg、ffplay、ffprobe),也是一个开发套件(提供丰富的 API 和工具库)。
-
其核心功能包括音视频编解码、格式转换、流媒体处理、色彩与采样率转换等。
-
“FF” 最初的含义是 “Fast Forward”,但随着 FFmpeg 的发展,其意义已经扩展为多媒体处理的代名词。mpeg是动态图像专家组
-
FFmpeg 的许可证(LGPL 或 GPL)取决于编译选项,开发者可以根据需求选择合适的版本。
-
FFmpeg 在音视频处理、流媒体、开发扩展等领域具有广泛的应用。
FFmpeg 的发展历史
2000 年:Fabrice Bellard 创立 FFmpeg,目标是实现 MPEG 编码/解码库。
2003 年:Michael Niedermayer 接手 FFmpeg,开发原生 H.264 解码器。
2005 年:引入 Vorbis 解码器。
2006 年:开发进展缓慢,社区规模较小。
2009 年:发布 FFmpeg 0.5,首个正式版本。
2010 年:FFmpeg 原生 VP8 解码器性能超越谷歌的 libvpx。
2011 年:社区分裂,部分开发者创建新项目 Libav。
2011~2014 年:Michael Niedermayer 推动 FFmpeg 与 Libav 的兼容并从Libav移植到ffmpeg,修复安全问题。
2014 年:Michael Niedermayer 辞去领导者角色,保留维护者身份。
2015 年:FFmpeg 社区成立决策委员会,以更开放的方式管理项目。依据代码贡献程度选举委员
2019 年:扩充决策委员会,全球开发者聚会,确定年度碰头会机制。
至今:FFmpeg 持续发展,成为多媒体处理领域的核心工具。
专业名词
● 容器(Container)格式:一种文件封装类型,里面主要包含了流,一般会使用一个特定的后缀名标识,例如.mov、.avi、.wav等。
● 流(Stream):在容器中存储音频(Audio)或者视频(Video)、字幕(Subtitle)等数据。
● 元数据(Metadata):一般位于容器之中,告诉我们一些额外的信息,一个常见的例子是MP3文件中的ID3 tag。
● 编解码器(Codec):它实际上是enCOder与DECoder这两个词的混搭。大部分情况下我们指的是一种压缩标准,如我们说的AVC/H.264、HEVC/H.265、VVC/H.266、AV1等。
FFmpeg的基本组成
ffprobe:强大的多媒体分析工具,用于获取媒体文件的详细信息。
ffplay:轻量级的音视频播放工具,支持滤镜处理和音频波形显示。
扩展与自定义
FFmpeg 的模块化设计使其具有很高的扩展性:
-
封装/解封装扩展:在 AVFormat 中增加新的封装格式或流媒体协议支持。
-
编解码扩展:在 AVCodec 中增加新的编解码格式或硬件加速支持。
-
滤镜扩展:在 AVFilter 中增加新的滤镜效果。
总结
可以理解为:数据(编码数据) 容器(文件格式/封装) 协议(网络传输)
对端接收: 解协议(接收网络传输) 解容器(解析文件格式) 源数据(解码)
AVFormat:负责媒体文件的封装和解封装,支持多种文件格式和流媒体协议。
-
流媒体协议支持:支持 RTMP、RTSP、HLS、MMS 等网络流媒体协议。
-
文件格式:MP4、FLV、MKV、TS、AVI 等
-
扩展性:如果 FFmpeg 不支持某种新的容器格式,可以根据需求扩展 AVFormat 模块,增加相应的封装和解封装处理模块。
AVCodec:负责音视频数据的编码和解码,支持多种编解码格式。
-
原生支持:H.264、AAC、MJPEG 等。
-
第三方库支持:
-
H.264 编码:x264 编码器。
-
H.265 编码:x265 编码器。
-
MP3 编码:libmp3lame 编码器。
-
-
扩展性:如果需要支持新的编解码格式或硬件编解码加速,可以在 AVCodec 模块中增加相应的编解码模块。
AVFilter:提供通用的音视频滤镜处理框架,支持多种滤镜效果。
详细内容 ffmpeg filter 滤镜命令_ffmpeg 滤镜-优快云博客
-
视频滤镜:缩放、裁剪、旋转、添加水印、色彩调整等。
-
音频滤镜:音量调整、混音、回声、降噪等。
-
滤镜链,滤镜可以串联成链,实现复杂的处理效果。例如:
-
视频滤镜链:输入 → 缩放 → 裁剪 → 添加水印 → 输出。
-
音频滤镜链:输入 → 音量调整 → 混音 → 输出。
-
AVDevice:支持多种平台的音视频设备输入输出,提供虚拟设备功能。
-
跨平台支持:
-
macOS/iOS:使用 AVFoundation 调用底层音视频及共享桌面输入。
-
Windows:使用 DirectShow(dshow)作为音视频输入。
-
Linux:
-
音频设备:OSS、ALSA、Pulse Audio 等。
-
视频设备:OpenGL、Video4Linux2、X11grab 等。
-
-
-
虚拟设备:支持 lavfi 虚拟输入设备,允许使用 Libavfilter 的滤镜链或表达式作为输入或输出设备。
swscale:提供高效的图像缩放和像素格式转换功能。
-
swscale 模块通过高度优化的算法实现高效的图像转换。
-
与 libyuv 相比,swscale 在支持的色彩空间和缩放算法上更具优势。
swresample:提供高效的音频重采样、格式转换和通道布局调整功能。
性能优化
-
swresample 模块通过高度优化的算法实现高效的音频转换。
-
支持多种重采样选项和算法,以适应不同的应用场景。
FFmpeg编译
在 Linux 平台上,虽然许多发行版(如 Ubuntu、Fedora)的软件源中已经包含了 FFmpeg,但这些预编译的版本通常较老,可能不支持最新的编码格式(如 H.264、H.265)或流媒体协议(如 RTMP)。为了支持这些功能,通常需要手动编译 FFmpeg。
直接参考往期文章即可。
ubuntu编译ffmpeg_ubuntu ffmpeg 编译-优快云博客
windows环境编译ffmpeg +visual studio 2022_ffmpeg visual studio-优快云博客
FFmpeg 特性的选择与定制
FFmpeg 的核心设计理念是模块化,所有功能(如编码、封装、协议支持)都可以通过模块的方式挂载到 FFmpeg 框架中。在某些特定场景下,可能需要定制 FFmpeg 的功能,以满足特定需求。
1.查看 FFmpeg 支持的特性
./configure --list-decoders # 查看支持的解码器
./configure --list-encoders # 查看支持的编码器
./configure --list-muxers # 查看支持的封装格式
./configure --list-demuxers # 查看支持的解封装格式
./configure --list-protocols # 查看支持的流媒体协议
查看可用的外部库
可以找到类似 --enable-libx264
、--enable-libfdk-aac
的选项,这些选项用于启用特定的外部库。
./configure --help
常见的外部库
外部库 | 功能 | 编译选项 |
---|---|---|
libx264 | H.264 编码支持 | --enable-libx264 |
libx265 | H.265 编码支持 | --enable-libx265 |
libfdk-aac | AAC 编码支持 | --enable-libfdk-aac |
libmp3lame | MP3 编码支持 | --enable-libmp3lame |
libvpx | VP8/VP9 编码支持 | --enable-libvpx |
libopus | Opus 编码支持 | --enable-libopus |
libvorbis | Vorbis 编码支持 | --enable-libvorbis |
libass | 字幕渲染支持 | --enable-libass |
libfreetype | 字体渲染支持 | --enable-libfreetype |
libsdl2 | SDL2 支持(用于 ffplay) | --enable-sdl2 |
安装外部库
根据需要安装对应的外部库。
sudo apt install -y libx264-dev
sudo apt install -y libfdk-aac-dev
...
配置编译选项
./configure \
--enable-gpl \
--enable-libx264 \
--enable-libfdk-aac \
--enable-libmp3lame \
--enable-libvpx
编译与安装
验证定制的 FFmpeg
学习资料分享