ffmpeg中文版文档

Posted 狗蛋儿l

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg中文版文档相关的知识,希望对你有一定的参考价值。

1简介

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

2描述

ffmpeg是一个非常快速的视频和音频转换器,也可以从现场音频/视频源中获取。它还可以在任意采样率之间进行转换,并使用高质量的多相滤波器动态调整视频大小。

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

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

要在选项中引用输入文件,必须使用它们的索引(从0开始)。例如。第一个输入文件是0,第二个是1,等等。类似地,文件中的流由它们的索引引用。例如。 2:3指的是第三个输入文件中的第四个流。另请参阅Stream说明符章节。

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

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

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

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

要强制输出文件的帧速率为24 fps:

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

要强制输入文件的帧速率(仅对原始格式有效)为1 fps,输出文件的帧速率为24 fps:

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

原始输入文件可能需要format选项。

3详细说明

ffmpeg中每个输出的转码过程可以通过下图描述:

 _______              ______________
|       |            |              |
| input |  demuxer   | encoded data |   decoder
| file  | ---------> | packets      | -----+
|_______|            |______________|      |
                                           v
                                       _________
                                      |         |
                                      | decoded |
                                      | frames  |
                                      |_________|
 ________             ______________       |
|        |           |              |      |
| output | <-------- | encoded data | <----+
| file   |   muxer   | packets      |   encoder
|________|           |______________|

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

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

3.1过滤

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

3.1.1简单滤波器图

简单的过滤器图是那些只有一个输入和输出的过滤器图,它们都是相同的类型。 在上图中,只需在解码和编码之间插入一个额外的步骤即可表示它们:

 _________                        ______________
|         |                      |              |
| decoded |                      | encoded data |
| frames  |\\                   _ | packets      |
|_________| \\                  /||______________|
             \\   __________   /
  simple     _\\||          | /  encoder
  filtergraph   | filtered |/
                | frames   |
                |__________|

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

 _______        _____________        _______        ________
|       |      |             |      |       |      |        |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______|      |_____________|      |_______|      |________|

请注意,某些过滤器会更改帧属性但不会更改帧内容。 例如。 上例中的fps过滤器会更改帧数,但不会触及帧内容。 另一个例子是setpts过滤器,它只设置时间戳,否则不改变帧。

3.1.2复杂滤波器图

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

 _________
|         |
| input 0 |\\                    __________
|_________| \\                  |          |
             \\   _________    /| output 0 |
              \\ |         |  / |__________|
 _________     \\| complex | /
|         |     |         |/
| input 1 |---->| filter  |\\
|_________|     |         | \\   __________
               /| graph   |  \\ |          |
              / |         |   \\| output 1 |
 _________   /  |_________|    |__________|
|         | /
| input 2 |/
|_________|

复杂滤波器图使用-filter_complex选项配置。 请注意,此选项是全局的,因为复杂的过滤器图本质上不能明确地与单个流或文件关联。

-lavfi选项相当于-filter_complex。

复杂滤波器图的一个简单示例是覆盖滤波器,它具有两个视频输入和一个视频输出,其中一个视频覆盖在另一个之上。 它的音频对应物是amix过滤器。

3.2流复制

流复制是通过将复制参数提供给-codec选项而选择的模式。 它使ffmpeg省略了指定流的解码和编码步骤,因此它只进行解复用和多路复用。 它对于更改容器格式或修改容器级元数据很有用。 在这种情况下,上图将简化为:

 _______              ______________            ________
|       |            |              |          |        |
| input |  demuxer   | encoded data |  muxer   | output |
| file  | ---------> | packets      | -------> | file   |
|_______|            |______________|          |________|

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

4流选择

ffmpeg提供-map选项,用于手动控制每个输出文件中的流选择。用户可以跳过-map并让ffmpeg执行自动流选择,如下所述。 -vn / -an / -sn / -dn选项可用于分别跳过包含视频,音频,字幕和数据流,无论是手动映射还是自动选择,除了作为复杂滤波器图形输出的那些流。

4.1描述

以下子部分描述了流选择中涉及的各种规则。接下来的示例显示了这些规则在实践中的应用方式。

虽然我们尽一切努力准确地反映程序的行为,但FFmpeg正在不断发展,自撰写本文之后,代码可能已经发生了变化。

4.1.1自动选择流

在没有特定输出文件的任何映射选项的情况下,ffmpeg检查输出格式以检查可以包含哪种类型的流,即。视频,音频和/或字幕。对于每个可接受的流类型,ffmpeg将从所有输入中选择一个流(如果可用)。

它将根据以下标准选择该流:

对于视频,它是具有最高分辨率的流,
对于音频,它是具有最多频道的流,
对于字幕,它是第一个找到的字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且仅选择相同类型的字幕流。
在几个相同类型的流速率相等的情况下,选择具有最低索引的流。

数据或附件流不会自动选择,只能使用-map包含在内。

4.1.2手动流选择

使用-map时,只有用户映射的流包含在该输出文件中,下面描述了filtergraph输出的一个可能的例外。

4.1.3复杂滤波器图

如果有任何带有未标记焊盘的复杂滤波器输出流,它们将被添加到第一个输出文件中。如果输出格式不支持流类型,则会导致致命错误。如果没有map选项,则包含这些流会导致跳过其类型的自动流选择。如果存在地图选项,则除了映射的流之外还包括这些滤波器流。

带有标记焊盘的复杂滤波器输出流必须一次映射一次。

4.1.4流处理

流处理与流选择无关,下面描述的字幕除外。流处理通过-codec选项设置,该选项针对特定输出文件中的流。特别是,在流选择过程之后,ffmpeg应用编解码器选项,因此不影响后者。如果没有为流类型指定-codec选项,ffmpeg将选择输出文件muxer注册的默认编码器。

字幕存在例外。如果为输出文件指定了字幕编码器,则将包括找到任何类型,文本或图像的第一个字幕流。 ffmpeg不验证指定的编码器是否可以转换所选的流,或者转换的流是否在输出格式中是可接受的。这通常也适用:当用户手动设置编码器时,流选择过程不能检查编码流是否可以复用到输出文件中。如果不能,则ffmpeg将中止,并且所有输出文件都将无法处理。

4.2例子

以下示例说明了ffmpeg的流选择方法的行为,怪癖和限制。

他们假设以下三个输入文件。

input file 'A.avi'
      stream 0: video 640x360
      stream 1: audio 2 channels
 
input file 'B.mp4'
      stream 0: video 1920x1080
      stream 1: audio 2 channels
      stream 2: subtitles (text)
      stream 3: audio 5.1 channels
      stream 4: subtitles (text)
 
input file 'C.mkv'
      stream 0: video 1280x720
      stream 1: audio 2 channels
      stream 2: subtitles (image)

示例:自动流选择

ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov

指定了三个输出文件,对于前两个,未设置-map选项,因此ffm​​peg将自动为这两个文件选择流。

out1.mkv是一个Matroska容器文件,接受视频,音频和字幕流,因此ffm​​peg将尝试选择每种类型中的一种。
对于视频,它将从B.mp4中选择stream 0,其在所有输入视频流中具有最高分辨率。
对于音频,它将从B.mp4中选择流stream 3,因为它具有最多的通道。
对于字幕,它将从B.mp4中选择流stream 2,这是A.avi和B.mp4中的第一个字幕流。

out2.wav只接受音频流,因此只选择来自B.mp4的stream 3。

对于out3.mov,由于设置了-map选项,因此不会进行自动流选择。 -map 1:一个选项将从第二个输入B.mp4中选择所有音频流。此输出文件中不包含其他流。

对于前两个输出,将对所有包含的流进行转码。选择的编码器将是每种输出格式注册的默认编码器,可能与所选输入流的编解码器不匹配。

对于第三个输出,音频流的编解码器选项已设置为复制,因此不会发生或可能发生解码 - 过滤 - 编码操作。所选流的数据包应从输入文件传送,并在输出文件中复用。

示例:自动字幕选择

ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv

尽管out1.mkv是Matroska容器文件,它接受字幕流,但只能选择视频和音频流。 C.mkv的字幕流是基于图像的,并且Matroska复用器的默认字幕编码器是基于文本的,因此字幕的转码操作预计会失败,因此不选择该流。 然而,在out2.mkv中,在命令中指定字幕编码器,因此,除了视频流之外,还选择字幕流。 -an的存在禁用out2.mkv的音频流选择。

示例:未标记的滤波器图输出

ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt

此处使用-filter_complex选项设置过滤器图,该过滤器图由单个视频过滤器组成。 叠加滤波器只需要两个视频输入,但没有指定,因此使用前两个可用视频流,即A.avi和C.mkv。 过滤器的输出板没有标签,因此被发送到第一个输出文件out1.mp4。 因此,跳过自动选择视频流,这将选择B.mp4中的流。 大多数频道的音频流即。 自动选择B.mp4中的流3。 然而,没有选择字幕流,因为MP4格式没有注册默认字幕编码器,并且用户没有指定字幕编码器。

第二个输出文件out2.srt仅接受基于文本的字幕流。 因此,即使可用的第一个字幕流属于C.mkv,它也是基于图像的,因此被跳过。 所选择的流,B.mp4中的流2,是第一个基于文本的字幕流。

示例:标记的filtergraph输出

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \\
       -map '[outv]' -an        out1.mp4 \\
                                out2.mkv \\
       -map '[outv]' -map 1:a:0 out3.mkv

上面的命令将失败,因为标记为[outv]的输出焊盘已被映射两次。 不应处理任何输出文件。

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \\
       -an        out1.mp4 \\
                  out2.mkv \\
       -map 1:a:0 out3.mkv

上面的命令也会失败,因为色调过滤器输出有一个标签[out],并且没有被映射到任何地方。
该命令应修改如下,

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \\
        -map '[outv1]' -an        out1.mp4 \\
                                  out2.mkv \\
        -map '[outv2]' -map 1:a:0 out3.mkv

来自B.mp4的视频流被发送到色调过滤器,其输出使用分割滤波器克隆一次,并且两个输出都标记为。然后将每个副本映射到第一个和第三个输出文件。

需要两个视频输入的覆盖滤波器使用前两个未使用的视频流。这些是来自A.avi和C.mkv的流。叠加输出未标记,因此无论是否存在-map选项,它都会被发送到第一个输出文件out1.mp4。

aresample过滤器发送第一个未使用的音频流,即A.avi的音频流。由于此过滤器输出也未标记,因此它也映射到第一个输出文件。 -an的存在仅抑制音频流的自动或手动流选择,而不抑制从滤波器图发送的输出。这两个映射流都应在out1.mp4中的映射流之前进行排序。

映射到out2.mkv的视频,音频和字幕流完全由自动流选择确定。

out3.mkv包含来自色调过滤器的克隆视频输出和来自B.mp4的第一个音频流。

5选项

如果没有另外指定,所有数字选项接受表示数字作为输入的字符串,其后可以跟随SI单位前缀之一,例如:‘K’,‘M’或’G’。

如果将“i”附加到SI单位前缀,则完整前缀将被解释为二进制倍数的单位前缀,其基于1024的幂而不是1000的幂。将“B”附加到SI单位前缀乘以这允许使用例如:‘KB’,‘MiB’,'G’和’B’作为数字后缀。

不带参数的选项是布尔选项,并将相应的值设置为true。可以通过在选项名称前加上“no”来将它们设置为false。例如,使用“-nofoo”将名称为“foo”的布尔选项设置为false。

5.1流说明符

每个流应用一些选项,例如比特率或编解码器。流指定符用于精确指定给定选项所属的流。

流说明符是通常附加到选项名称并通过冒号与其分隔的字符串。例如。 -codec: a:1 ac3包含a:1流说明符,匹配第二个音频流。因此,它将为第二音频流选择ac3编解码器。

流说明符可以匹配多个流,以便将选项应用于所有流。例如。 -b:a 128k匹配所有音频流。

空流说明符匹配所有流。例如,-codec copy或-codec: copy将复制所有流而无需重新编码。

流说明符的可能形式是:

stream_index
使用此索引匹配流。例如。 -threads:1 4将第二个流的线程数设置为4.如果stream_index用作附加流说明符(见下文),则它从匹配流中选择流编号stream_index。流编号基于libavformat检测到的流的顺序,除非还指定了程序ID。在这种情况下,它基于程序中流的排序。

stream_type[:additional_stream_specifier]
stream_type是以下之一:视频为“v”或“V”,音频为“a”,副标题为“s”,数据为“d”,附件为“t”。 'v’匹配所有视频流,'V’仅匹配未附加图片,视频缩略图或封面艺术的视频流。如果使用additional_stream_specifier,则它匹配具有此类型并与additional_stream_specifier匹配的流。否则,它匹配指定类型的所有流。

p:program_id[:additional_stream_specifier]
使用id program_id匹配程序中的流。如果使用additional_stream_specifier,则它匹配两个都是程序一部分并与additional_stream_specifier匹配的流。

#stream_id or i:stream_id
通过流id匹配流(例如,MPEG-TS容器中的PID)。

m:key[:value]
使用具有指定值的元数据标记键匹配流。如果未给出value,则将包含给定标记的流与任何值匹配。

u
匹配具有可用配置的流,必须定义编解码器并且必须存在诸如视频维度或音频采样率之类的基本信息。

请注意,在ffmpeg中,按元数据匹配仅适用于输入文件。

5.2通用选项
这些选项在ff *工具中共享。

-L
显示许可证。

-h, - ?, - help, - help [arg]
显示帮助。可以指定可选参数以打印关于特定项目的帮助。如果未指定参数,则仅显示基本(非高级)工具选项。

arg的可能值是:


除基本工具选项外,还可以打印高级工具选项。

充分
打印完整的选项列表,包括编码器,解码器,分路器,复用器,滤波器等的共享和专用选项。

解码器= decoder_name
打印有关名为decoder_name的解码器的详细信息。使用-decoders选项获取所有解码器的列表。

编码器= encoder_name
打印有关名为encoder_name的编码器的详细信息。使用-encoders选项获取所有编码器的列表。

分路= demuxer_name
打印有关名为demuxer_name的分路器的详细信息。使用-formats选项获取所有解复用器和复用器的列表。

复用器= muxer_name
打印有关名为muxer_name的muxer的详细信息。使用-formats选项获取所有复用器和分路器的列表。

滤波器= FILTER_NAME
打印有关过滤器名称filter_name的详细信息。使用-filters选项获取所有过滤器的列表。

-版
显示版本。

-格式
显示可用格式(包括设备)。

-demuxers
显示可用的解复用器。

-muxers
显示可用的复用器。

-设备
显示可用设备。

-codecs
显示libavcodec已知的所有编解码器。

请注意,本文档中使用术语“编解码器”作为更正确称为媒体比特流格式的快捷方式。

-decoders
显示可用的解码器。

-encoders
显示所有可用的编码器。

-bsfs
显示可用的比特流过滤器。

-protocols
显示可用协议。

-filters
显示可用的libavfilter过滤器。

-pix_fmts
显示可用的像素格式。

-sample_fmts
显示可用的样本格式。

-layouts
显示频道名称和标准频道布局。

-colors
显示已识别的颜色名称

-sources device [,opt1 = val1 [,opt2 = val2] …]
显示输入设备的自动检测源。某些设备可能提供无法自动检测的系统相关源名称。不能假定返回的列表总是完整的。

ffmpeg -sources pulse,server=192.168.0.4

-sinks device [,opt1 = val1 [,opt2 = val2] …]
显示输出设备的自动检测接收器。 某些设备可能提供无法自动检测的与系统相关的接收器名称。 不能假定返回的列表总是完整的。

ffmpeg -sinks pulse,server=192.168.0.4

-loglevel [flags +] loglevel | -v [flags +] loglevel
设置库使用的日志记录级别和标志。

可选的标志前缀可以包含以下值:

‘repeat’
表示重复的日志输出不应压缩到第一行,并且将省略“最后重复消息n次”行。

‘level’
表示日志输出应为每个消息行添加[level]前缀。这可以用作对数着色的替代方案,例如,将日志转储到文件时。

标志也可以单独使用,添加’+’/’ - ‘前缀来设置/重置单个标志,而不会影响其他标志或更改日志级别。设置flags和loglevel时,最后一个标志值和loglevel之间需要一个’+'分隔符。

loglevel是一个字符串或包含以下值之一的数字:

‘quiet, -8’
什么都不显示;安静。

‘panic, 0’
仅显示可能导致进程崩溃的致命错误,例如断言失败。目前还没有用于任何目的。

‘fatal, 8’
只显示致命错误。这些是错误,在此之后该过程绝对无法继续。

‘error, 16’
显示所有错误,包括可以从中恢复的错误。

‘warning, 24’
显示所有警告和错误。将显示与可能不正确或意外事件相关的任何消息。

‘info, 32’
在处理过程中显示信息性消息。这是警告和错误的补充。这是默认值。

‘verbose, 40’
与信息相同,除了更详细。

‘debug, 48’
显示所有内容,包括调试信息。

‘trace, 56’
例如,要启用重复日志输出,请添加级别前缀,并将loglevel设置为verbose:

ffmpeg -loglevel repeat+level+verbose -i input output

另一个允许重复日志输出而不影响级别前缀标志或loglevel的当前状态的示例:

ffmpeg [...] -loglevel +repeat

默认情况下,程序会记录到stderr。 如果终端支持着色,则使用颜色标记错误和警告。 可以禁用日志着色设置环境变量AV_LOG_FORCE_NOCOLOR或NO_COLOR,也可以强制设置环境变量AV_LOG_FORCE_COLOR。 不推荐使用环境变量NO_COLOR,将在以后的FFmpeg版本中删除。

-report
将完整命令行和控制台输出转储到当前目录中名为program-YYYYMMDD-HHMMSS.log的文件。 此文件可用于错误报告。 它还意味着-loglevel调试。

将环境变量FFREPORT设置为任何值具有相同的效果。 如果值为’:’ - 分隔键=值序列,则这些选项将影响报告; 如果选项值包含特殊字符或选项分隔符’:’,则必须对其进行转义(请参阅ffmpeg-utils手册中的“引用和转义”部分)。

可识别以下选项:

file
设置用于报告的文件名; %p扩展为程序名称,%t扩展为时间戳,%%扩展为普通%

level
使用数值设置日志详细级别(请参阅-loglevel)。

例如,要使用日志级别32(日志级别信息的别名)将报告输出到名为ffreport.log的文件:

FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output

解析环境变量时的错误不是致命的,并且不会出现在报告中。

-hide_banner
抑制打印横幅。

所有FFmpeg工具通常都会显示版权声明,构建选项和库版本。 此选项可用于禁止打印此信息。

-cpuflags flags (global)
允许设置和清除cpu标志。 此选项用于测试。 除非你知道自己在做什么,否则不要使用它。

ffmpeg -cpuflags -sse+mmx ...
ffmpeg -cpuflags mmx ...
ffmpeg -cpuflags 0 ...

此选项的可能的flag是:

'x86'
  'mmx'
  'mmxext'
  'sse'
  'sse2'
  'sse2slow'
  'sse3'
  'sse3slow'
  'ssse3'
  'atom'
  'sse4.1'
  'sse4.2'
  'avx'
  'avx2'
  'xop'
  'fma3'
  'fma4'
  '3dnow'
  '3dnowext'
  'bmi1'
  'bmi2'
  'cmov'
'ARM'
  'armv5te'
  'armv6'
  'armv6t2'
  'vfp'
  'vfpv3'
  'neon'
  'setend'
'AArch64'
  'armv8'
  'vfp'
  'neon'
'PowerPC'
  'altivec'
'Specific Processors'
  'pentium2'
  'pentium3'
  'pentium4'
  'k6'
  'k62'
  'athlon'
  'athlonxp'
  'k8'

5.3 AVOptions

这些选项由libavformat,libavdevice和libavcodec库直接提供。 要查看可用AVOptions列表,请使用-help选项。 它们分为两类:

generic
可以为任何容器,编解码器或设备设置这些选项。 容器/设备的AVFormatContext选项和编解码器的AVCodecContext选项下列出了通用选项。

private
这些选项特定于给定的容器,设备或编解码器。 私有选项列在其相应的容器/设备/编解码器下。

例如,要将ID3v2.3标头而不是默认ID3v2.4写入MP3文件,请使用MP3 muxer的id3v2_version私有选项:

ffmpeg -i input.flac -id3v2_version 3 out.mp3

所有编解码器AVOptions都是每个流,因此应该附加一个流说明符:

ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4

在上面的示例中,多声道音频流被映射两次以进行输出。 第一个实例用编解码器ac3和比特率640k编码。 将第二个实例缩混为2个通道,并使用编解码器aac进行编码。 使用输出流的绝对索引为其指定128k的比特率。

注意:-nooption语法不能用于布尔AVOptions,请使用-option 0 / -option 1。

注意:通过将v / a / s添加到选项名称之前指定每个流AVOptions的旧的未记录方式现在已过时,将很快删除。

5.4主要选择

-f fmt(输入/输出)
强制输入或输出文件格式。 通常会自动检测输入文件的格式,并从输出文件的文件扩展名中猜测,因此在大多数情况下不需要此选项。

-i url(输入)
输入文件网址

-y(glodal)
无需询问即可覆盖输出文件。

-n(glodal)
不要覆盖输出文件,如果已存在指定的输出文件,请立即退出。

-stream_loop号码(输入)
设置输入流的循环次数。 循环0表示无循环,循环-1表示无限循环。

-c [:stream_specifier]编解码器(输入/输出,每个流)
-codec [:stream_specifier]编解码器(输入/输出,每个流)
为一个或多个流选择编码器(在输出文件之前使用时)或解码器(在输入文件之前使用时)。 codec是解码器/编码器的名称或特殊值副本(仅输出),表示不重新编码流。

例如

ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT

使用libx264对所有视频流进行编码并复制所有音频流。

对于每个流,应用最后一个匹配的c选项,因此

ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

将复制除第二个视频(将使用libx264编码)和第138个音频(将使用libvorbis编码)之外的所有流。

-t duration(输入/输出)
当用作输入选项(在-i之前)时,限制从输入文件读取的数据的持续时间。

当用作输出选项(在输出URL之前)时,在其持续时间达到持续时间后停止写入输出。

duration必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分。

-to和-t是互斥的,-t具有优先权。

-to position(输入/输出)
停止写入输出或读取位置输入。 position必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分。

-to和-t是互斥的,-t具有优先权。

-fs limit_size(输出)
设置文件大小限制,以字节为单位。 超出限制后不再写入更多的字节块。 输出文件的大小略大于请求的文件大小。

-ss position (输入/输出)

当用作输入选项(在-i之前)时,在此输入文件中寻找位置。 请注意,在大多数格式中,无法精确搜索,因此ffmpeg将在位置之前寻找最接近的搜索点。 当启用转码和-accurate_seek(默认值)时,搜索点和位置之间的这个额外段将被解码并丢弃。 在进行流复制时或使用-noaccurate_seek时,它将被保留。

当用作输出选项(在输出URL之前)时,解码但丢弃输入,直到时间戳到达位置。

position必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分。

-sseof position (输入)

与-ss选项类似,但相对于“文件结束”。 这是负值在文件中较早,0表示在EOF。

-itsoffset offset(输入)
设置输入时间偏移。

offset必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分。

偏移量将添加到输入文件的时间戳中。指定正偏移意味着相应的流延迟了offset中指定的持续时间。

-itsscale scale(输入,每个流)
重新调整输入时间戳。 scale应该是一个浮点数。

-timestamp date(输出)
在容器中设置录制时间戳。

date必须是日期规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)Date部分。

-metadata [:metadata_specifier] key = value(输出,每元数据)
设置元数据键/值对。

可以给出可选的metadata_specifier以在流,章节或程序上设置元数据。有关详细信息,请参阅-map_metadata文档。

此选项将覆盖使用-map_metadata设置的元数据。也可以使用空值删除元数据。

例如,要在输出文件中设置标题:

ffmpeg -i in.avi -metadata title="my title" out.flv

要设置第一个音频流的语言:

ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT

-disposition [:stream_specifier] value(输出,每个流)

设置流的处置。

此选项会覆盖从输入流复制的处置。 也可以通过将其设置为0来删除处置。

以下dispositions被认可:

default
dub
original
comment
lyrics
karaoke
forced
hearing_impaired
visual_impaired
clean_effects
attached_pic
captions
descriptions
dependent
metadata

例如,要将第二个音频流设为默认流:

ffmpeg -i in.mkv -c copy -disposition:a:1 default out.mkv

要使第二个字幕流成为默认流,并从第一个字幕流中删除默认处置:

ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv

要添加嵌入式封面/缩略图:

ffmpeg -i in.mp4 -i IMAGE -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out.mp4

并非所有的复用器都支持嵌入式缩略图,而且那些只支持一些格式,如JPEG或PNG。

-program [title=title:][program_num=program_num:]st=stream[:st=stream…] (输出)

创建具有指定标题program_num的程序,并将指定的流添加到该程序。

-target type (输出)

指定目标文件类型(vcd,svcd,dvd,dv,dv50)。 类型可以使用pal-,ntsc-或film-作为前缀,以使用相应的标准。 然后自动设置所有格式选项(比特率,编解码器,缓冲区大小)。 你可以输入:

ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

但是,只要您知道它们与标准不冲突,您就可以指定其他选项,如:

ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg

-dn(输入/输出)
作为输入选项,阻止文件的所有数据流被过滤或自动选择或映射以用于任何输出。请参阅-discard选项以单独禁用流。

作为输出选项,禁用数据记录,即自动选择或映射任何数据流。有关完全手动控制的信息,请参阅-map选项。

-dframes number(输出)
设置要输出的数据帧数。这是-frames:d的过时别名,您应该使用它。

-frames [:stream_specifier] framecount(输出,每个流)
在framecount帧之后停止写入流。

-q [:stream_specifier] q(输出,每个流)
-qscale [:stream_specifier] q(输出,每个流)
使用固定质量标度(VBR)。 q / qscale的含义取决于编解码器。如果在没有stream_specifier的情况下使用qscale,那么它仅适用于视频流,这是为了保持与先前行为的兼容性,并且为2个不同的编解码器指定相同的编解码器特定值,音频和视频通常不是没有stream_specifier时的意图用来。

-filter [:stream_specifier] filtergraph(输出,每个流)
创建filtergraph指定的filtergraph并使用它来过滤流。

filtergraph是要应用于流的filtergraph的描述,并且必须具有单个输入和相同类型的流的单个输出。在filtergraph中,输入与标签输入相关联,输出与标签输出相关联。有关filtergraph语法的详细信息,请参阅ffmpeg-filters手册。

如果要创建具有多个输入和/或输出的过滤器图形,请参阅-filter_complex选项。

-filter_script [:stream_specifier] filename(输出,每个流)
此选项类似于-filter,唯一的区别是它的参数是要从中读取过滤器图形描述的文件的名称。

-filter_threads nb_threads(全局)
定义用于处理过滤器管道的线程数。每个管道都会产生一个线程池,这个线程可用于并行处理。默认值是可用CPU的数量。

-pre [:stream_specifier] preset_name(输出,每个流)
指定匹配流的预设。

-stats(全球)
打印编码进度/统计信息。默认情况下,要显式禁用它,您需要指定-nostats。

-progress url(全局)
将程序友好的进度信息发送到url。

大约每秒和编码过程结束时写入进度信息。它由“key = value”行组成。 key仅包含字母数字字符。一系列进度信息的最后一个键始终是“进度”。

-stdin
启用标准输入的交互。默认情况下启用,除非使用标准输入作为输入。要显式禁用交互,您需要指定-nostdin。

禁用标准输入上的交互很有用,例如,如果ffmpeg位于后台进程组中。使用ffmpeg … </ dev / null可以获得大致相同的结果,但它需要一个shell。

-debug_ts(全球)
打印时间戳信息。它默认是关闭的。此选项主要用于测试和调试,输出格式可能会从一个版本更改为另一个版本,因此便携式脚本不应使用它。

另请参阅选项-fdebug ts。

-attach filename(输出)
将附件添加到输出文件。这有一些格式支持,如Matroska,例如用于渲染字幕的字体。附件是作为特定类型的流实现的,因此该选项将向文件添加新流。然后可以通常的方式在此流上使用每个流选项。使用此选项创建的附件流将在所有其他流(即使用-map或自动映射创建的流)之后创建。

请注意,对于Matroska,您还必须设置mimetype元数据标记:

ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv

(假设附件流将在输出文件中排在第三位)。

-dump_attachment [:stream_specifier] filename(输入,每个流)
将匹配的附件流提取到名为filename的文件中。 如果filename为空,则将使用文件名元数据标记的值。

例如。 提取名为’out.ttf’的文件的第一个附件:

ffmpeg -dump_attachment:t:0 out.ttf -i INPUT

要提取由filename标记确定的文件的所有附件:

ffmpeg -dump_attachment:t "" -i INPUT

技术说明 - 附件是作为编解码器extradata实现的,因此该选项实际上可用于从任何流中提取extradata,而不仅仅是附件。

-noautorotate
禁用基于文件元数据自动旋转视频。

5.5视频选项

-vframes number(输出)
设置要输出的视频帧数。这是-frames:v的过时别名,您应该使用它。

-r [:stream_specifier] fps(输入/输出,每个流)
设置帧速率(Hz值,分数或缩写)。

作为输入选项,忽略存储在文件中的任何时间戳,而是假设帧速率fps保持不变,生成时间戳。这与某些输入格式(如image2或v4l2)使用的-framerate选项不同(在旧版FFmpeg中它曾经是相同的)。如果有疑问,请使用-framerate而不是输入选项-r。

作为输出选项,复制或丢弃输入帧以实现恒定的输出帧速率fps。

-s [:stream_specifier] size(输入/输出,每个流)
设置框架大小。

作为输入选项,这是video_size private选项的快捷方式,由一些分路器识别,其帧大小未存储在文件中或者是可配置的 - 例如,原始视频或视频采集卡。

作为输出选项,这会将scale视频滤镜插入相应滤镜图的末尾。请直接使用scale过滤器将其插入开头或其他位置。

格式为’wxh’(默认 - 与源相同)。

-aspect [:stream_specifier] aspect(输出,每个流)
设置由aspect指定的视频显示宽高比。

aspect可以是浮点数字符串,也可以是num:den形式的字符串,其中num和den是宽高比的分子和分母。例如,“4:3”,“16:9”,“1.3333”和“1.7777”是有效的参数值。

如果与-vcodec副本一起使用,它将影响存储在容器级别的宽高比,但不会影响存储在编码帧中的宽高比(如果存在)。

-vn(输入/输出)
作为输入选项,阻止文件的所有视频流被过滤或自动选择或映射以用于任何输出。请参阅-discard选项以单独禁用流。

作为输出选项,禁用视频记录,即自动选择或映射任何视频流。有关完全手动控制的信息,请参阅-map选项。

-vcodec codec(输出)
设置视频编解码器。这是-codec:v的别名。

-pass [:stream_specifier] n(输出,每个流)
选择通行证号码(1或2)。它用于进行双通视频编码。视频的统计信息在第一次传递中记录到日志文件中(另请参见-passlog文件选项),在第二次传递中,该日志文件用于以精确请求的比特率生成视频。在第1阶段,您可能只是停用音频并将输出设置为null,Windows和Unix的示例:

ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null

-passlogfile [:stream_specifier] prefix(输出,每个流)
将两遍日志文件名前缀设置为前缀,默认文件名前缀为“ffmpeg2pass”。 完整的文件名将是PREFIX-N.log,其中N是特定于输出流的数字

-vf filtergraph(输出)
创建filtergraph指定的filtergraph并使用它来过滤流。

这是-filter:v的别名,请参阅-filter选项。

5.6高级视频选项

-pix_fmt [:stream_specifier] format(输入/输出,每个流)
设置像素格式。使用-pix_fmts显示所有支持的像素格式。如果无法选择所选的像素格式,ffmpeg将打印警告并选择编码器支持的最佳像素格式。如果pix_fmt以+为前缀,则如果无法选择所请求的像素格式,ffmpeg将退出并显示错误,并且禁用过滤器图形内的自动转换。如果pix_fmt是单个+,则ffmpeg选择与输入(或图形输出)相同的像素格式,并禁用自动转换。

-sws_flags flags(输入/输出)
设置SwScaler标志。

-rc_override [:stream_specifier] override(输出,每个流)
特定间隔的速率控制覆盖,格式为“int,int,int”列表,用斜杠分隔。两个第一个值是开始和结束帧数,最后一个是量化器,如果是正值则使用,或者质量因子,如果是负数。

-ilme
强制编码器中的隔行扫描支持(仅限MPEG-2和MPEG-4)。如果您的输入文件是隔行扫描并且您希望保持隔行扫描格式以获得最小损失,请使用此选项。另一种方法是使用-deinterlace对输入流进行去隔行,但是去隔行会引入损失。

-psnr
计算压缩帧的PSNR。

-vstats
将视频编码统计信息转储到vstats_HHMMSS.log。

-vstats_file文件
将视频编码统计转储到文件。

-vstats_version文件
指定要使用的vstats格式的版本。默认值为2。

version = 1:

frame =%5d q =%2.1f PSNR =%6.2f f_size =%6d s_size =%8.0fkB time =%0.3f br =%7.1fkbits / s avg_br =%7.1fkbits / s

版本> 1:

out =%2d st =%2d frame =%5d q =%2.1f PSNR =%6.2f f_size =%6d s_size =%8.0fkB time =%0.3f br =%7.1fkbits / s avg_br =%7.1fkbits / s

-top [:stream_specifier] n(输出,每个流)
top = 1 / bottom = 0 / auto = -1 field first

-dc precision
Intra_dc_precision。

-vtag fourcc / tag(输出)
强制视频标签/ fourcc。这是-tag:v的别名。

-qphist(global)
显示QP直方图

-vbsf bitstream_filter
不推荐见-bsf

-force_key_frames [:stream_specifier] time [,time …](输出,每个流)
-force_key_frames [:stream_specifier] expr:expr(输出,每个流)
在指定的时间戳强制关键帧,更准确地说是在每个指定时间后的第一帧。

如果参数以expr:为前缀,则字符串expr将被解释为表达式,并针对每个帧进行求值。在评估为非零的情况下强制关键帧。

如果其中一个时间是“chapters[delta]”,则将其扩展到文件中所有章节开始的时间,移动增量,表示为以秒为单位的时间。此选项可用于确保在章节标记或输出文件中的任何其他指定位置存在搜索点。

例如,要在每个章节开始前的5分钟插入关键帧,加上关键帧0.1秒:

-force_key_frames 0:05:00,chapters-0.1

expr中的表达式可以包含以下常量:

n
当前处理帧的数量,从0开始

n_forced
强制帧的数量

prev_forced_n
前一个强制帧的编号,当没有强制关键帧时它是NAN

prev_forced_t
在前一个强制帧的时间,当没有强制关键帧时,它是NAN

t
当前处理帧的时间

例如,要每5秒强制一个关键帧,您可以指定:

-force_key_frames expr:gte(t,n_forced*5)

要在最后一次强制时间后5秒强制关键帧,从13秒开始:

-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))

请注意,强制使用太多关键帧对某些编码器的先行算法非常有害:使用固定GOP选项或类似选项会更有效。

-copyinkf [:stream_specifier](输出,每个流)
进行流复制时,还要复制开头找到的非关键帧。

-init_hw_device type [= name] [:device [,key = value …]]
使用给定的设备参数初始化名为name的类型类型的新硬件设备。如果未指定名称,则将收到“type%d”形式的默认名称。

设备的含义和以下参数取决于设备类型:

cuda
device是CUDA设备的编号。

dxva2
device是Direct3D 9显示适配器的编号。

vaapi
device是X11显示名称或DRM渲染节点。如果未指定,它将尝试打开默认的X11显示($ DISPLAY),然后打开第一个DRM渲染节点(/ dev / dri / renderD128)。

vdpau
device是X11显示名称。如果未指定,它将尝试打开默认的X11显示($ DISPLAY)。

qsv
设备选择’MFX_IMPL_ *'中的值。允许的值是:

auto
sw
hw
auto_any
hw_any
wh2
hw3
hw4
如果未指定,则使用“auto_any”。 (注意,通过创建适合平台的子设备(‘dxva2’或’vaapi’)然后从中导出QSV设备,可能更容易实现QSV的预期结果。)

opencl
设备选择平台和设备作为platform_index.device_index。

还可以使用键值对来过滤该组设备,以仅查找与特定平台或设备字符串匹配的设备。

可用作过滤器的字符串是:

platform_profile
platform_version
platform_name
platform_vendor
platform_extensions
device_name
device_vendor
driver_version
device_version
device_profile
device_extensions
device_type

索引和过滤器必须一起唯一地选择设备。

例子:
-init_hw_device opencl:0.1
在第一个平台上选择第二个设备。

-init_hw_device opencl:,device_name = Foo9000
选择名称中包含字符串Foo9000的设备。

-init_hw_device opencl:1,device_type = gpu,device_extensions = cl_khr_fp16
在支持cl_khr_fp16扩展的第二个平台上选择GPU设备。

-init_hw_device type [= name] @source
初始化名为name的类型类型的新硬件设备,从名为source的现有设备派生它。

-init_hw_device list
列出此ffmpeg版本中支持的所有硬件设备类型。

-filter_hw_device name
将名为name的硬件设备传递给任何过滤器图形中的所有过滤器。这可用于设置要使用hwupload过滤器上传到的设备,或使用hwmap过滤器映射到的设备。其他过滤器在需要硬件设备时也可以使用此参数。请注意,这通常仅在输入尚未存在于硬件帧中时才需要 - 如果是,则过滤器将从它们作为输入接收的帧的上下文中获取它们所需的设备。

这是一个全局设置,因此所有过滤器都将接收相同的设备。

-hwaccel [:stream_specifier] hwaccel(输入,每个流)
使用硬件加速来解码匹配的流。 hwaccel的允许值为:

none
不要使用任何硬件加速(默认)。

auto
自动选择硬件加速方法。

vdpau
使用VDPAU(用于Unix的视频解码和Presentation API)硬件加速。

dxva2
使用DXVA2(DirectX视频加速)硬件加速。

vaapi
使用VAAPI(视频加速API)硬件加速。

qsv

以上是关于ffmpeg中文版文档的主要内容,如果未能解决你的问题,请参考以下文章

使用 ffmpeg 生成单个 MPEG-Dash 片段

PHP ffmpeg_php测试片段

ffmpeg转码重置文件的开始时间

如何用ffmpeg截取视频片段&截取时间不准确的坑

如何利用ffmpeg将一小段视频截取成图片

FFmpeg实现音视频同步的精准片段拼接