语法

ffmpeg [global_options] {[input_file_options] -i input_url} … {[output_file_options] output_url} …

描述

FFmpeg 是一款通用的媒体转换器,可以读取各种类型的输入(包括实时抓取/录制设备),过滤和转码它们为多种输出格式。

FFmpeg 从由 -i 选项指定的任意数量的输入“文件”(可以是常规文件、管道、网络流、抓取设备等)中读取,并将任意数量的输出“文件”写入,这些输出“文件”由纯输出URL指定。在命令行上找到的任何无法解释为选项的内容都被视为输出URL。

原则上,每个输入或输出URL都可以包含不同类型(视频/音频/字幕/附件/数据)的任意数量的流。允许的流数量和/或类型可能受到容器格式的限制。选择哪些输入中的哪些流将进入哪个输出可以是自动完成的,也可以使用 -map 选项(请参阅流选择一章)。

要在选项中引用输入文件,您必须使用它们的索引(基于0)。例如,第一个输入文件是 0,第二个是 1,依此类推。同样,文件中的流也由其索引引用。例如,2:3 引用第三个输入文件中的第四个流。另请参阅流指定符一章。

一般来说,选项应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。每次出现都会应用于下一个输入或输出文件。此规则的例外是全局选项(例如详细程度级别),应首先指定。

不要混合输入和输出文件 - 首先指定所有输入文件,然后指定所有输出文件。也不要混合属于不同文件的选项。所有选项仅适用于下一个输入或输出文件,并在文件之间重置。

以下是一些简单的示例:

将输入媒体文件转换为不同的格式,通过重新编码媒体流实现:

  1. ffmpeg -i input.avi output.mp4

将输出文件的视频比特率设置为64 kbit/s:

  1. ffmpeg -i input.avi -b:v 64k -bufsize 64k output.mp4

强制将输出文件的帧率设置为24 fps:

  1. ffmpeg -i input.avi -r 24 output.mp4

将输入文件的帧率强制为1 fps(仅适用于原始格式),并将输出文件的帧率强制为24 fps:

  1. ffmpeg -r 1 -i input.m2v -r 24 output.mp4

对于原始输入文件,可能需要使用格式选项。

详细描述

每个输出的 ffmpeg 转码过程可以用以下图表描述: ffmpeg 命令行文档 - 图1

FFmpeg 调用 libavformat 库(包含解复用器)来读取输入文件并从它们中获取包含编码数据的包。当存在多个输入文件时,FFmpeg 通过跟踪任何活动输入流上的最低时间戳来尝试保持它们的同步。

然后,编码的数据包被传递给解码器(除非为该流选择了streamcopy,请参阅进一步说明)。解码器生成未压缩的帧(原始视频/PCM音频/…),这些帧可以经过过滤(参见下一节)进行处理。过滤后,将帧传递给编码器,编码器对其进行编码并输出编码的数据包。最后,这些数据包被传递给复用器,复用器将编码的数据包写入输出文件。

3.1 Filtering - 过滤器

在编码之前,FFmpeg 可以使用来自 libavfilter 库的过滤器处理原始音频和视频帧。多个链接在一起的过滤器形成一个过滤器图。 FFmpeg 区分了两种类型的过滤器图:简单和复杂。

3.1.1 Simple filtergraphs - 简单过滤器图

简单过滤器图是指只有一个输入和一个输出,且它们都是相同类型的过滤器。在上面的图表中,可以通过在解码和编码之间简单地插入一个额外的步骤来表示: ffmpeg 命令行文档 - 图2

简单过滤器图可以通过每个流的 -filter 选项进行配置(分别使用 -vf 和 -af 作为视频和音频的别名)。例如,对于视频的简单过滤器图可能如下所示: ffmpeg 命令行文档 - 图3

请注意,某些过滤器可以更改帧属性而不是帧内容。例如,上面示例中的 fps 过滤器可以更改帧数,但不会更改帧内容。另一个例子是 setpts 过滤器,它仅设置时间戳而不改变帧内容。