3 详细描述

ffmpeg中每个输出的代码转换过程可以用下图来描述:

  1. _______ ______________
  2. | | | |
  3. | 输入 | 分路 | 编码的数据分组| 解码
  4. | 文件 | --------->| | -----+
  5. |_______| |______________| |
  6. v
  7. _________
  8. | |
  9. | 解码 |
  10. | 帧率 |
  11. |_________|
  12. ________ ______________ |
  13. | | | | |
  14. | 输出 | <-------- |编码的数据分组 | <----+
  15. | 文件 | 复用器 | | 编码
  16. |________| |______________|
  17.  
  18.  

ffmpeg调用libavformat库(包含demuxers)来读取输入文件并获取包含编码数据的数据包。 当有多个输入文件时, ffmpeg会尝试通过跟踪任何活动输入流上的最低时间戳来使它们保持同步。

然后将编码的数据包传递给解码器(除非为数据流选择了流拷贝,请参阅进一步的描述)。 解码器产生未压缩的帧(原始视频/ PCM音频/ …),可以通过滤波进一步处理(参见下一节)。 在过滤之后,帧被传递给编码器,编码器对其进行编码并输出编码分组。 最后,这些被传递给复用器,它将编码的数据包写入输出文件。

3.1 过滤器

在编码之前, ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。 几个链式过滤器形成一个过滤器图形。 ffmpeg区分两种类型的过滤器图形:简单和复杂。

3.1.1 简单过滤器

简单的过滤器图就是那些只有一个输入和输出的过滤器图 相同的类型。 在上面的图中,他们可以通过简单插入来表示 解码和编码之间的附加步骤:

  1. _________ ______________
  2. | | | |
  3. | 解码 | | 编码数据分组 |
  4. | |\ _ | |
  5. |_________| \ /||______________|
  6. \ __________ /
  7. 简单的 _\| | | / 编码器
  8. 过滤器图 | 过滤 |/
  9. | |
  10. |__________|
  11.  

简单的过滤器图配置了per-stream-filter选项(分别为视频和音频使用-vf和-af别名)。 一个简单的视频滤镜可以看起来像这样:

  1. _______ _____________ _______ ________
  2. | | | | | | | |
  3. | 输入 | ---> | 逐行扫描 | ---> | 比例 | ---> | 输出 |
  4. |_______| |_____________| |_______| |________|
  5.  

请注意,某些滤镜会更改帧属性,但不会改变帧内容。 例如。 上例中的 fps过滤器会更改帧数,但不会触及帧内容。 另一个例子是 setpts过滤器,它只设置时间戳并以其他方式传递帧。

3.1.2 复杂过滤器

复杂的滤波器图是那些不能简单描述为线性的滤波器图 处理链应用于一个流。 例如,当图形存在时,就是这种情况 多于一个输入和/或输出,或者输出流类型不同于 输入。 它们可以用下图表示:

  1. _________
  2. | |
  3. | 输入 0 |\ __________
  4. |_________| \ | |
  5. \ _________ /| 输出 0 |
  6. \ | | / |__________|
  7. _________ \| 复杂 | /
  8. | | | |/
  9. | 输入 1 |---->| 过滤 |\
  10. |_________| | | \ __________
  11. /| 图形 | \ | |
  12. / | | \| 输出 1 |
  13. _________ / |_________| |__________|
  14. | | /
  15. | 输入 2 |/
  16. |_________|
  17.  

复杂的过滤器图使用 -filter_complex 选项进行配置。 请注意,这个选项是全球性的,因为一个复杂的过滤器图,就其性质而言, 不能明确地与单个流或文件相关联。

-lavfi 选项等同于 -filter_complex

一个复杂的filtergraph的简单例子是 overlay 过滤器 有两个视频输入和一个视频输出,其中一个视频覆盖在顶部 另一个。 它的音频对应是 amix 过滤器。

3.2 文件流复制

流式复制是通过向 copy 参数提供的模式选择的 -codec 选项。 它使得 ffmpeg 省略了解码和编码 步骤为指定的流,所以它只做demuxing和muxing。 它是有益的 用于更改容器格式或修改容器级元数据。该 在这种情况下,上图将简化为:

  1. _______ ______________ ________
  2. | | | | | |
  3. | 输入 | 分路 | 编码数据 | 复用器 | 输出 |
  4. | 文件 | ---------> | 分组 | -------> | 文件 |
  5. |_______| |______________| |________|
  6.  

由于没有解码或编码,因此速度非常快,而且没有质量 失利。 但是,由于许多因素,它在某些情况下可能不起作用。应用 过滤器显然也是不可能的,因为过滤器处理未压缩的数据。