3 详细描述
ffmpeg
中每个输出的代码转换过程可以用下图来描述:
- _______ ______________
- | | | |
- | 输入 | 分路 | 编码的数据分组| 解码
- | 文件 | --------->| | -----+
- |_______| |______________| |
- v
- _________
- | |
- | 解码 |
- | 帧率 |
- |_________|
- ________ ______________ |
- | | | | |
- | 输出 | <-------- |编码的数据分组 | <----+
- | 文件 | 复用器 | | 编码
- |________| |______________|
ffmpeg
调用libavformat库(包含demuxers)来读取输入文件并获取包含编码数据的数据包。 当有多个输入文件时, ffmpeg
会尝试通过跟踪任何活动输入流上的最低时间戳来使它们保持同步。
然后将编码的数据包传递给解码器(除非为数据流选择了流拷贝,请参阅进一步的描述)。 解码器产生未压缩的帧(原始视频/ PCM音频/ …),可以通过滤波进一步处理(参见下一节)。 在过滤之后,帧被传递给编码器,编码器对其进行编码并输出编码分组。 最后,这些被传递给复用器,它将编码的数据包写入输出文件。
3.1 过滤器
在编码之前, ffmpeg
可以使用libavfilter库中的过滤器处理原始音频和视频帧。 几个链式过滤器形成一个过滤器图形。 ffmpeg
区分两种类型的过滤器图形:简单和复杂。
3.1.1 简单过滤器
简单的过滤器图就是那些只有一个输入和输出的过滤器图 相同的类型。 在上面的图中,他们可以通过简单插入来表示 解码和编码之间的附加步骤:
- _________ ______________
- | | | |
- | 解码 | | 编码数据分组 |
- | 帧 |\ _ | |
- |_________| \ /||______________|
- \ __________ /
- 简单的 _\| | | / 编码器
- 过滤器图 | 过滤 |/
- | 帧 |
- |__________|
简单的过滤器图配置了per-stream-filter选项(分别为视频和音频使用-vf和-af别名)。 一个简单的视频滤镜可以看起来像这样:
- _______ _____________ _______ ________
- | | | | | | | |
- | 输入 | ---> | 逐行扫描 | ---> | 比例 | ---> | 输出 |
- |_______| |_____________| |_______| |________|
请注意,某些滤镜会更改帧属性,但不会改变帧内容。 例如。 上例中的 fps
过滤器会更改帧数,但不会触及帧内容。 另一个例子是 setpts
过滤器,它只设置时间戳并以其他方式传递帧。
3.1.2 复杂过滤器
复杂的滤波器图是那些不能简单描述为线性的滤波器图 处理链应用于一个流。 例如,当图形存在时,就是这种情况 多于一个输入和/或输出,或者输出流类型不同于 输入。 它们可以用下图表示:
- _________
- | |
- | 输入 0 |\ __________
- |_________| \ | |
- \ _________ /| 输出 0 |
- \ | | / |__________|
- _________ \| 复杂 | /
- | | | |/
- | 输入 1 |---->| 过滤 |\
- |_________| | | \ __________
- /| 图形 | \ | |
- / | | \| 输出 1 |
- _________ / |_________| |__________|
- | | /
- | 输入 2 |/
- |_________|
复杂的过滤器图使用 -filter_complex 选项进行配置。 请注意,这个选项是全球性的,因为一个复杂的过滤器图,就其性质而言, 不能明确地与单个流或文件相关联。
-lavfi 选项等同于 -filter_complex 。
一个复杂的filtergraph的简单例子是 overlay
过滤器 有两个视频输入和一个视频输出,其中一个视频覆盖在顶部 另一个。 它的音频对应是 amix
过滤器。
3.2 文件流复制
流式复制是通过向 copy
参数提供的模式选择的 -codec 选项。 它使得 ffmpeg
省略了解码和编码 步骤为指定的流,所以它只做demuxing和muxing。 它是有益的 用于更改容器格式或修改容器级元数据。该 在这种情况下,上图将简化为:
- _______ ______________ ________
- | | | | | |
- | 输入 | 分路 | 编码数据 | 复用器 | 输出 |
- | 文件 | ---------> | 分组 | -------> | 文件 |
- |_______| |______________| |________|
由于没有解码或编码,因此速度非常快,而且没有质量 失利。 但是,由于许多因素,它在某些情况下可能不起作用。应用 过滤器显然也是不可能的,因为过滤器处理未压缩的数据。