ffmpeg-命令行详解

前言

ffmpeg是一个多媒体开发库,提供了关于音频和视频的工具。这个项目的官网是这里。

下载地址

ffmpeg提供了方便地控制台命令,可以在下载页面下载。三个平台(windows,linux,macos)都有打包好的可执行文件,能够在命令行执行。windows系统还可以通过scoop包管理工具下载,参考scoop软件包管理。

参考文档

ffmpeg的文档中心提供了详细全面的使用说明,具体ffmpeg官方参考文档。

音视频基本处理流程

ffmpeg-命令行详解_第1张图片
输入文件首先通过分流器将文件分解为编码后的数据包,然后通过解码器把编码数据转成解码后的数据帧,处理之后,又把数据帧通过编码器转成编码后的数据包,最后通过混合器打包为输出文件。

概括起来五个步骤:

  • 分流
  • 解码
  • 处理
  • 编码
  • 混合

命令行工具

命令行工具大体可以分为三类:播放(ffplay),处理(ffmpeg),查询(ffprobe)。这里主要讲解关于【处理】的命令行,请参考ffmpeg和ffmpeg-all,前者是简单的文档,后者是详细的文档。本文着重讲解简单的文档,对ffmpeg有个大概的认识,形成基本概念。

语法

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指的是第三个输入文件中的第四个流。请参阅流说明符一章。

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

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

  • 将输出文件的视频比特率设置为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帧/秒,将输出文件的帧速率强制为24帧/秒:
    ffmpeg -r 1 -i input.m2v -r 24 output.avi

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

详细描述

ffmpeg中每个输出的转码过程如下图所示:

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

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

然后,编码的数据包被传递到解码器(除非为流选择streamcopy,请参阅进一步的描述)。解码器产生未压缩的帧(原始视频/PCM音频/…),可以通过过滤进一步处理(参见下一节)。经过过滤后,帧被传递给编码器,编码器对帧进行编码并输出已编码的数据包。最后,它们被传递给muxer, muxer将经过编码的包写入输出文件。

过滤

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

简单过滤器图

简单筛选图是指只有一个输入和输出,并且都是相同类型的。在上图中,它们可以简单地通过在解码和编码之间插入一个额外的步骤来表示:

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

简单的过滤器图配置为每个流-filter选项(视频和音频分别使用-vf和-af别名)。一个简单的视频过滤图可以这样看的例子:

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

注意,有些过滤器改变帧属性,但不改变帧内容。例如,上面例子中的fps过滤器改变了帧的数量,但是没有改变帧的内容。另一个例子是setpts过滤器,它只设置时间戳,以其他方式不改变传递帧。

复杂过滤器图

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

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

复杂筛选器图配置了-filter_complex选项。注意,这个选项是全局的,因为一个复杂的filtergraph,就其本质而言,不能明确地与单个流或文件相关联。

-lavfi选项相当于-filter_complex。

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

流复制

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

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

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

流选择

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

描述

下面的子部分描述了在流选择中涉及的各种规则。下面的例子展示了如何在实践中应用这些规则。
虽然已经尽了一切努力来准确地反映程序的行为,但是FFmpeg还在不断地开发中,而且从编写本文开始,代码可能已经发生了变化。

自动流选择

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

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

  • 对于视频,它是分辨率最高的流,
  • 对于音频,它是拥有最多频道的流,
  • 对于字幕,这是第一个字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且只会选择相同类型的字幕流。

在相同类型速率的多个流相同的情况下,选择索引最低的流。

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

手动流选择

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

复杂过滤器图

如果有任何带有未标记pad的复杂filtergraph输出流,它们将被添加到第一个输出文件中。如果输出格式不支持流类型,则会导致致命错误。在缺少map选项的情况下,包含这些流将导致跳过对其类型的自动流选择。如果有映射选项,除了映射的流之外,还包括这些filtergraph流。

带有标记pad的复杂filtergraph输出流必须映射一次,且精确地映射一次。

流处理

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

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

例子

下面的例子说明了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选项,因此ffmpeg将自动为这两个文件选择流。

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

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

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

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

对于第三个输出,音频流的编解码器选项被设置为copy,因此不会发生解码-过滤-编码操作。所选流的数据包应从输入文件中传送并在输出文件中进行封闭。

例子:自动字幕选择

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

虽然out1.mvk是一个Matroska容器文件,它接受字幕流,但只能选择一个视频和音频流。C.mvk的字幕流是基于图像的,而Matroska muxer的默认字幕编码器是基于文本的,因此对字幕的转码操作预计会失败,因此流没有被选中。然而,在out2.mkv,在命令中指定了字幕编码器,因此,除了视频流外,还选择了字幕流。-an的存在禁用了out2.mkv的音频流选择。

示例:未标记的filtergraph输出

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

这里使用-filter_complex选项设置了一个过滤器图,它由一个视频过滤器组成。覆盖过滤器需要恰好两个视频输入,但没有指定,所以前两个可用的视频流使用,A.avi和C.mkv。过滤器的输出pad没有标签,因此被发送到第一个输出文件out1.mp4。因此,跳过了对视频流的自动选择,这将选择B.mp4中的视频流。有多数通道的音频流,即B.mp4的stream 3,是自动选择的。但是没有选择字幕流,因为MP4格式没有注册默认的字幕编码器,用户也没有指定字幕编码器。

第二个输出文件out2.srt只接受基于文本的字幕流。因此,即使第一个可用的字幕流属于C.mkv,它是基于映像的,因此跳过。所选的流,B.mp4中的stream 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]的输出pad已经映射了两次。不处理任何输出文件。

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

上面的这个命令也会失败,因为色调过滤器输出有一个标签[outv],而且还没有被映射到任何地方。

该命令应该修改如下,

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的视频流被发送到hue过滤器,使用split过滤器克隆其输出,并标记两个输出。然后将每个副本映射到第一个和第三个输出文件。

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

aresample过滤器将发送第一个未使用的音频流,即A.avi的音频流。因为这个过滤器输出也是未标记的,所以它也被映射到第一个输出文件。存在-an只会抑制音频流的自动或手动流选择,而不会影响从过滤器图发送的输出。这两个映射的流都应该在out1.mp4中的映射流之前排序。

将视频、音频和字幕流映射到out2.mkv完全由自动流选择决定。

out3.mkv由来自hue过滤器的克隆视频输出和来自B.mp4的第一个音频流组成。

选项

所有数字选项(如果没有另外指定)都接受一个表示数字的字符串作为输入,该字符串后面可能有一个SI单位前缀,例如:’ K ‘、’ M ‘或’ G '。

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

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

流说明符

一些选项应用于每流,如bitrate或codec。流说明符用于精确地指定给定选项属于哪个流。

流说明符是一个通常附加到选项名并以冒号分隔的字符串。例如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]
    将流与具有指定值的元数据标记键匹配。如果没有给定值,则将包含给定标记的流与任何值匹配。
  • u
    通过可用的配置匹配流,编解码器必须定义和必要的信息,如视频尺寸或音频采样率必须存在。

注意,在ffmpeg中,根据元数据进行匹配只适用于输入文件。

通用选项

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

选项 参数 说明
-L 显示许可证
-h, -?, -help, --help long:打印高级工具选项,除了基本的工具选项。
full:打印完整的选项列表,包括编码器、解码器、解码器、muxers、过滤器等的共享和私有选项。
decoder=decoder_name:打印名为decoder_name的解码器的详细信息。使用-decoders选项获得所有解码器的列表。
encoder=encoder_name:打印关于名为encoder_name的编码器的详细信息。使用-encoders选项获得所有编码器的列表。
demuxer=demuxer_name:打印关于名为demuxer_name的demuxer的详细信息。使用-formats选项获得所有反例和muxer的列表。
muxer=muxer_name:打印关于名为muxer_name的muxer的详细信息。使用-formats选项获取所有muxer和demuxer的列表。
filter=filter_name:打印有关筛选器名称filter_name的详细信息。使用-filters选项获得所有过滤器的列表。
bsf=bitstream_filter_name:打印有关bitstream过滤器名称bitstream_filter_name的详细信息。使用-bsfs选项获得所有位流过滤器的列表。
显示许可证
-version 显示版本
-formats 显示可用的格式(包括设备)
-demuxers 显示所有分包器
-muxers 显示所有打包器
-devices 显示所有可用的设备
-codecs 显示所有已知的编解码器
请注意,术语“codec”在整个文档中都被用作一种快捷方式,更准确地说,它是一种媒体位流格式
-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]前缀。这可以作为日志着色的另一种选择,例如在将日志转储到文件时。
还可以通过添加’ + ’ / ’ - '前缀单独使用标志来设置/重置单个标志,而不影响其他标志或更改日志级别。当同时设置标志和loglevel时,在最后一个标志值和loglevel之前应该有一个“+”分隔符。
loglevel是一个包含以下值之一的字符串或数字:
quiet, -8:什么也不显示;保持沉默
panic, 0:只显示可能导致进程崩溃的致命错误,例如断言失败。目前还没有任何用途
fatal, 8:只显示致命错误。这些错误之后,进程绝对无法继续
error, 16:显示所有错误,包括可以恢复的错误
warning, 24:显示所有警告和错误。任何与可能不正确或意外事件相关的消息都将显示。
info, 32:在处理过程中显示信息消息。这是警告和错误之外的内容。这是默认值
verbose, 40:与info相同,只是更冗长
debug, 48:显示所有内容,包括调试信息
trace, 56:显示跟踪信息
例如,要启用重复日志输出,请添加level前缀,并将loglevel设置为verbose:
ffmpeg -loglevel repeat+level+verbose -i input output
另一个例子,使重复日志输出,而不影响当前状态的水平前缀标志或loglevel:
ffmpeg […] -loglevel +repeat
默认情况下,程序会记录到stderr。如果终端支持着色,则使用颜色来标记错误和警告。可以禁用日志着色设置环境变量AV_LOG_FORCE_NOCOLOR,也可以强制设置环境变量AV_LOG_FORCE_COLOR。
设置日志级别和库使用的标志
-report 以下选项是公认的
file:设置报告要使用的文件名;将%p扩展为程序的名称,将%t扩展为时间戳,将%%扩展为普通%
level:使用数值设置日志详细级别(参见-loglevel)。
例如,要将报告输出到名为ffreport.log的文件中,使用的日志级别为32(日志级别信息的别名):
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 …
此选项的可能标志是:
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
将完整的命令行转储并将输出记录到当前目录下名为program- yyyymmdd - hhms .log的文件中。这个文件对于bug报告非常有用。它还意味着-loglevel debug
将环境变量FFREPORT设置为任意值具有相同的效果。如果值是’:‘分隔键=值序列,这些选项将影响报告;如果选项值包含特殊字符或选项分隔符’:’,则必须转义(请参阅ffmpeg-utils手册中的"引号和转义"部分)。

AV选项

这些选项由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的旧的未文档化的方法现在已经过时了,很快就会被删除。

主要选项

选项 参数 说明
-f fmt (input/output) 强制输入或输出文件格式。通常自动检测输入文件的格式,并根据输出文件的文件扩展名推测格式,因此在大多数情况下不需要此选项。
-i url (input) 输入文件的url
-y (global) 无需请求就覆盖输出文件
-n (global) 不要覆盖输出文件,如果指定的输出文件已经存在,则立即退出。
-stream_loop number (input) 设定输入流的循环次数。Loop 0表示没有Loop, Loop -1表示无限循环。
-c[:stream_specifier]
-codec[:stream_specifier]
codec (input/output,per-stream) 为一个或多个流选择编码器(在输出文件之前使用)或解码器(在输入文件之前使用)。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 (input/output) 当用作输入选项(在-i之前)时,限制从输入文件读取数据的时间。
当作为输出选项使用时(在输出url之前),在输出持续时间达到持续时间之后停止写入输出。
持续时间必须是时间持续时间规范,请参见ffmpeg-utils(1)手册中的时间持续时间部分(ffmpeg-utils)。
-to和-t是互斥的,-t有优先级。
-to position (input/output) 停止写入输出或在指定位置读取输入。位置必须是时间持续时间规范,请参见ffmpeg-utils(1)手册中的时间持续时间部分(ffmpeg-utils)。
-to和-t是互斥的,-t有优先级。
-fs limit_size (output) 设置文件大小限制,以字节表示。超过限制后,不再写入任何字节块。输出文件的大小略大于请求的文件大小。
-ss position (input/output) 当用作输入选项(在-i之前)时,在此输入文件中查找要定位的位置。注意,在大多数格式中,不可能精确地查找,因此ffmpeg将查找到位置前最近的查找点。当启用代码转换和-accurate_seek(默认)时,将对查找点和位置之间的这个额外段进行解码并丢弃。当执行流复制或使用-noaccurate_seek时,它将被保留。
当作为输出选项使用时(在输出url之前),解码但丢弃输入,直到时间戳到达位置。
位置必须是时间持续时间规范,请参见ffmpeg-utils(1)手册中的时间持续时间部分(ffmpeg-utils)。
-sseof position (input) 类似于-ss选项,但相对于“文件结束”。也就是说,负值在文件的前面,0在EOF
-itsoffset offset (input) 设置输入时间偏移量。
偏移量必须是一个时间持续时间规范,参见ffmpeg-utils(1)手册中的时间持续时间部分(ffmpeg-utils)。
偏移量被添加到输入文件的时间戳中。指定一个正偏移量意味着相应的流被偏移量中指定的持续时间延迟。
-itsscale scale (input,per-stream) 重新调节输入时间戳。scale应该是一个浮点数。
-timestamp date (output) 设置容器中的记录时间戳
日期必须是一个日期规范,请参见ffmpeg-utils(1)手册中的日期部分(ffmpeg-utils)。
-metadata[:metadata_specifier] key=value (output,per-metadata) 设置元数据键/值对。
可以提供一个可选的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 (output,per-stream) 设置流的配置。
此选项覆盖从输入流复制的配置。也可以通过将配置设置为0来删除它。
下列性格是公认的:
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
并不是所有的muxer都支持嵌入的缩略图,而且那些支持的只支持几种格式,比如JPEG或PNG。
-program [title=title:][program_num=program_num:]st=stream[:st=stream...] (output) 创建具有指定标题program_num的程序,并向其添加指定的流。
-target type (output) 指定目标文件类型(vcd, svcd, dvd, dv, dv50)。type可以加上pal-, ntsc-或film-以使用相应的标准。所有的格式选项(比特率,编解码器,缓冲区大小)然后自动设置。你可以输入:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
不过,您可以指定其他选项,只要您知道它们与标准不冲突,如:
ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
-dn (input/output) 作为输入选项,阻止文件的所有数据流被过滤或自动选择或映射到任何输出。参见-丢弃选项来禁用单独的流。
作为输出选项,禁止数据记录,即自动选择或映射任何数据流。要进行完全手动控制,请查看-map选项。
-dframes number (output) 设置输出的数据帧数。这是一个过时的别名-frames:d,你应该使用代替。
-frames[:stream_specifier] framecount (output,per-stream) 在帧加载帧之后停止对流的写入。
-q[:stream_specifier]
-qscale[:stream_specifier]
q (output,per-stream) 采用固定质量比例尺(VBR)。q/qscale的含义依赖于编解码器。如果使用qscale没有stream_specifier然后它仅适用于视频流,这是保持兼容以前的行为和指定相同的编解码器特定值两种不同的编解码器,是音频和视频通常不是当没有stream_specifier使用目的是什么。
-filter[:stream_specifier] filtergraph (output,per-stream) 创建filtergraph指定的过滤器图,并使用它过滤流。
filtergraph是应用于流的filtergraph的描述,它必须具有与流相同类型的单个输入和单个输出。在过滤器图中,输入与标签in相关联,输出与标签out相关联。有关过滤器语法的更多信息,请参见ffmpeg-filters手册。
如果您希望创建具有多个输入和/或输出的过滤器图,请参阅-filter_complex选项。
-filter_script[:stream_specifier] filename (output,per-stream) 这个选项与-filter类似,唯一的区别是它的参数是要从中读取一个过滤器描述的文件的名称。
-filter_threads nb_threads (global) 定义用于处理过滤器管道的线程数。每个管道将生成一个线程池,其中有这么多可用于并行处理的线程。默认值是可用cpu的数量。
-pre[:stream_specifier] preset_name (output,per-stream) 指定匹配流的预置。
-stats (global) 打印编码进度/统计数据。默认情况下它是开启的,要显式禁用它,您需要指定-nostats。
-progress url (global) 发送程序友好的进展信息到url。
进度信息大约每秒钟写一次,并且在编码过程的末尾写。它由“key=value”行组成。键只由字母数字字符组成。进度信息序列的最后一个键总是“progress”。
-stdin 在标准输入上启用交互。除非使用标准输入作为输入,否则默认为打开。要显式禁用交互,需要指定-nostdin。
禁用标准输入上的交互是有用的,例如,如果ffmpeg在后台进程组中。使用ffmpeg …< /dev/null可以得到大致相同的结果,但它需要shell。
-debug_ts (global) 打印时间戳信息。默认是关闭的。此选项主要用于测试和调试目的,并且输出格式可能随着版本的不同而变化,因此可移植脚本不应该使用此选项。
-attach filename (output) 向输出文件添加附件。一些格式如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 (input,per-stream) 将匹配的附件流提取到名为filename的文件中。如果filename为空,那么将使用filename元数据标签的值。
例如,提取名为“out.ttf”文件的第一个附件:
ffmpeg -dump_attachment:t:0 out.ttf -i INPUT
将所有附件提取到由filename标签确定的文件:
ffmpeg -dump_attachment:t "" -i INPUT
技术说明-附件被实现为编解码器引渡,所以这个选项实际上可以用于从任何流提取引渡,而不仅仅是附件。
-noautorotate 禁用基于文件元数据的自动旋转视频。

视频选项

选项 参数 说明
-vframes number (output) 设置输出的视频帧数。这是一个过时的别名-frames:v,你应该使用代替。
-r[:stream_specifier] fps (input/output,per-stream) 设置帧速率(Hz值、分数或缩写)。
作为输入选项,可以忽略文件中存储的任何时间戳,而是假设恒定帧速率fps生成时间戳。这与用于一些输入格式(如image2或v4l2)的-framerate选项不同(在旧版本的FFmpeg中也是如此)。如果有疑问,使用-帧率代替输入选项-r。
作为输出选项,复制或删除输入帧,以实现恒定的输出帧速率fps。
-s[:stream_specifier] size (input/output,per-stream) 设置帧大小。
作为一个输入选项,这是video_size私有选项的一个快捷方式,一些demuxer认识到,帧大小要么没有存储在文件中,要么是可配置的——例如原始视频或视频抓取器。
作为一个输出选项,它将scale视频过滤器插入到相应的filtergraph的末尾。请直接使用scale滤镜将其插入开始处或其他地方。
格式是’ wxh '(默认-与源相同)。
-aspect[:stream_specifier] aspect (output,per-stream) 设置按方面指定的视频显示宽高比。
方面可以是浮点数字符串,也可以是形式为num:den的字符串,其中num和den是高宽比的分子和分母。例如,“4:3”、“16:9”、“1.3333”和“1.7777”都是有效的参数值。
如果与-vcodec副本一起使用,它将影响存储在容器级别的纵横比,但不会影响存储在编码帧中的纵横比(如果存在的话)。
-vn (input/output) 作为一个输入选项,阻止文件的所有视频流被过滤或自动选择或映射到任何输出。参见-丢弃选项来禁用单独的流。
作为输出选项,禁用视频录制,即自动选择或映射任何视频流。要进行完全手动控制,请查看-map选项。
-vcodec codec (output) 设置视频编解码器。这是-codec:v的别名。
-pass[:stream_specifier] n (output,per-stream) 选择通道号(1或2)。它用于进行双通道视频编码。视频的统计信息在第一次传递中被记录到一个日志文件中(请参阅选项-passlogfile),在第二次传递中,该日志文件被用于以精确的请求比特率生成视频。在通过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 (output,per-stream) 设置两遍日志文件名前缀为prefix,默认文件名前缀为“ffmpeg2pass”。完整的文件名是PREFIX-N.log,其中N是特定于输出流的数字
-vf filtergraph (output) 创建filtergraph指定的过滤器图,并使用它过滤流。
这是-filter:v的别名,参见-filter选项。

高级视频选项

选项 参数 说明
-pix_fmt[:stream_specifier] format (input/output,per-stream) 设置像素格式。使用-pix_fmts显示所有支持的像素格式。如果选择的像素格式不能被选择,ffmpeg将打印一个警告并选择编码器支持的最佳像素格式。如果pix_fmt的前缀是一个 +, ffmpeg将退出,如果请求的像素格式不能被选择,并在过滤器内部的自动转换被禁用。如果pix_fmt是单个+,ffmpeg选择相同的像素格式作为输入(或图形输出)和自动转换被禁用。
-sws_flags flags (input/output) 设置SwScaler标识。
-rc_override[:stream_specifier] override (output,per-stream) 速率控制覆盖特定的间隔,格式化为“int,int,int”列表,以斜杠分隔。第一个值是开始帧数和结束帧数,最后一个是用于正的量化器,或负的质量因子。
-ilme 强制交错支持在编码器(MPEG-2和MPEG-4仅)。如果您的输入文件是隔行的,并且您希望保持隔行格式以减少损失,请使用此选项。另一种方法是用-deinterlace去除输入流,但是去除会带来损失。
-psnr 计算压缩帧的PSNR。
-vstats 将视频编码统计信息转储到vstats_hhmms.log。
-vstats_file file 转储视频编码统计到文件。
-vstats_version file 指定要使用哪个版本的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
version > 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 (output,per-stream) top=1/bottom=0/auto=-1 field first
-dc precision Intra_dc_precision。
-vtag fourcc/tag (output) 强制视频tag/fourcc。这是-tag:v的别名。
-qphist (global) 显示QP直方图
-vbsf bitstream_filter 弃用看-bsf
-force_key_frames[:stream_specifier] time[,time…] (output,per-stream)

expr:expr (output,per-stream)

source (output,per-stream)
force_key_frames可以采用以下形式的参数:
time[,time…]:如果参数包含时间戳,ffmpeg将根据编码器的时间基数将指定的时间取整到最接近的输出时间戳,并在第一个帧强制设置一个关键帧,该帧的时间戳等于或大于计算的时间戳。注意,如果编码器的时间基数太粗,那么关键帧可能会被强制在时间戳低于指定时间的帧上。默认编码器的时间基是输出帧率的倒数,但可以通过-enc_time_base进行其他设置。
如果其中一个时间是“章节[增量]”,则将其扩展为文件中所有章节开始的时间,通过增量进行移动,以秒表示时间。此选项有助于确保在章节标记处或输出文件中的任何其他指定位置出现查找点。
例如,在5分钟插入关键帧,在每章开始前0.1秒插入关键帧:
-force_key_frames 0:05:00,chapters-0.1
expr:expr:如果参数以expr:作为前缀,字符串expr被解释为一个表达式,并为每一帧计算。在求值非零的情况下,强制使用关键帧。
expr中的表达式可以包含以下常量:
n:当前已处理帧的数目,从0开始
n_forced:受迫帧的数量
prev_forced_n:前一强制帧的个数,未强制关键帧时为NAN
prev_forced_t:前一强制帧的时间,未强制关键帧时为NAN
t:当前被处理帧的时间
例如,每5秒强制一个关键帧,你可以指定:
-force_key_frames expr:gte(t,n_forced*5)
从第二帧13开始,在最后一帧之后的5秒内强制某一关键帧:
-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))
source:如果参数是source,如果正在编码的当前帧在其源中被标记为关键帧,ffmpeg将强制执行关键帧。
请注意,强制使用太多关键帧对某些编码器的预先算法是非常有害的:使用fixed-GOP选项或类似的选项会更有效。
-copyinkf[:stream_specifier] (output,per-stream) 当做流复制时,也复制在开始发现的非关键帧。
-init_hw_device type[=name][:device[,key=value...]] 使用给定的设备参数初始化名为name类型的新硬件设备。如果没有指定名称,它将接收表单“type%d”的默认名称。
device和以下参数的含义取决于设备类型:
cuda:设备为CUDA设备的编号。
dxva2:设备号是Direct3D 9显示适配器。
vaapi:设备可以是一个X11显示名,也可以是一个DRM渲染节点。如果没有指定,它将尝试打开默认的X11显示($DISPLAY),然后打开第一个DRM渲染节点(/dev/dri/renderD128)。
vdpau:设备是一个X11显示名称。如果没有指定,它将尝试打开默认的X11显示($DISPLAY)。
qsv:设备在’ MFX_IMPL_* ‘中选择一个值。允许的值是:
auto,sw,hw,auto_any,hw_any,hw2,hw3,hw4
如果未指定,则使用’auto_any’。(注意,通过创建适合于平台的子设备('dxva2’或’vaapi '),然后从中派生出QSV设备,可能更容易实现QSV所需的结果。)
opencl:device选择平台和设备为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设备。
vulkan:如果设备是整数,它根据设备在系统相关的设备列表中的索引来选择该设备。如果device是任何其他字符串,它将选择名称中包含该字符串的第一个设备作为子字符串。
以下选项是公认的:
debug:如果设置为1,则启用验证层(如果已安装)。
linear_images:如果设置为1,hwcontext分配的图像将是线性的,并且可以在本地映射。
instance_extensions:要启用的附加实例扩展列表。
device_extensions:要启用的附加设备扩展的单独列表。
例子:
-init_hw_device vulkan:1:选择系统上的第二个设备。
-init_hw_device vulkan:RADV:选择第一个名称包含字符串RADV的设备。
-init_hw_device vulkan:0,instance_extensions=VK_KHR_wayland_surface+VK_KHR_xcb_surface:选择第一个设备并启用Wayland和XCB实例扩展。
-init_hw_device type[=name]@source 初始化名为name类型的新硬件设备,从名为source的现有设备派生它。
-init_hw_device list 列出此版本中支持的所有硬件设备类型。
-filter_hw_device name 将硬件设备的名称传递给任何筛选器图中的所有筛选器。这可以用于使用hwupload过滤器设置要上载的设备,或者使用hwmap过滤器设置要映射到的设备。其他过滤器在需要硬件设备时也可以使用此参数。请注意,这通常只在输入不在硬件帧时才需要—当它在硬件帧时,过滤器将从作为输入的帧的上下文派生出它们需要的设备。
这是一个全局设置,因此所有过滤器将接收相同的设备。
-hwaccel[:stream_specifier] hwaccel (input,per-stream) 使用硬件加速来解码匹配的流。hwaccel允许的值为:
none:不要使用任何硬件加速(默认)。
auto:自动选择硬件加速方法。
vdpau:使用VDPAU(视频解码和表示API的Unix)硬件加速。
dxva2:使用DXVA2 (DirectX视频加速)硬件加速。
vaapi:使用VAAPI(视频加速API)加速硬件。
使用Intel QuickSync视频加速进行视频转码。
与大多数其他值不同,这个选项不启用加速译码(当qsv译码器被选中时自动使用),而是加速转码,而不将帧复制到系统内存中。
为了它工作,解码器和编码器必须支持QSV加速和没有过滤器必须被使用。
如果所选的hwaccel不可用或所选解码器不支持,则此选项无效。
注意,大多数加速方法是为回放而设计的,不会比现代cpu上的软件解码快。另外,ffmpeg通常需要将解码帧从GPU内存复制到系统内存中,从而导致进一步的性能损失。因此,该选项主要用于测试。
-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream) 选择要用于硬件加速的设备。
这个选项只有在也指定了-hwaccel选项时才有意义。它可以根据名称引用使用-init_hw_device创建的现有设备,也可以按照’ -init_hw_device '类型创建新设备:hwaccel_device在前面被立即调用。
-hwaccels 列出在此构建的ffmpeg中支持的所有硬件加速方法。

音频选项

选项 参数 说明
-aframes number (output) 设置输出的音频帧数。这是一个过时的-frames:a别名,您应该使用替代。
-ar[:stream_specifier] freq (input/output,per-stream) 设置音频采样频率。对于输出流,默认设置为对应输入流的频率。对于输入流,此选项仅对音频抓取设备和原始demuxer有意义,并映射到相应的demuxer选项。
-aq q (output) 设置音频质量(编码特定,VBR)。这是-q:a的别名。
-ac[:stream_specifier] channels (input/output,per-stream) 设置音频通道的数量。对于输出流,默认设置为输入音频通道的数量。对于输入流,此选项仅对音频抓取设备和原始demuxer有意义,并映射到相应的demuxer选项。
-an (input/output) 作为一个输入选项,阻止文件的所有音频流被过滤或自动选择或映射到任何输出。参见-丢弃选项来禁用单独的流。
作为输出选项,禁用音频记录,即自动选择或映射任何音频流。要进行完全手动控制,请查看-map选项。
-acodec codec (input/output) 设置音频编解码器。这是-codec:a的别名。
-sample_fmt[:stream_specifier] sample_fmt (output,per-stream) 设置音频样本格式。使用-sample_fmts获取支持的示例格式列表。
-af filtergraph (output) 创建filtergraph指定的过滤器图,并使用它过滤流。
这是-filter:a的别名,参见-filter选项。

高级音频选项

选项 参数 说明
-atag fourcc/tag (output) 强制音频tag/fourcc。这是-tag:a的一个别名。
-absf bitstream_filter 弃用,看-bsf
-guess_layout_max channels (input,per-stream) 如果某些输入通道的布局是未知的,试着猜测它是否最多对应指定数量的通道。例如,2告诉ffmpeg识别1通道为单声道,2通道为立体声,但不识别6通道为5.1。默认情况是总是尝试猜测。使用0禁用所有猜测。

字幕选项

选项 参数 说明
-scodec codec (input/output) 设置副标题编解码器。这是-codec:s的别名。
-sn (input/output) 作为一个输入选项,可以阻止文件的所有字幕流被过滤或自动选择或映射到任何输出。参见-discard选项来禁用单独的流。
作为输出选项,禁止字幕记录,即自动选择或映射任何字幕流。要进行完全手动控制,请查看-map选项。
-sbsf bitstream_filter 弃用,看-bsf

高级字幕选项

选项 参数 说明
-fix_sub_duration 修复字幕时间。对于每个字幕,等待同一流中的下一个包,并调整第一个包的持续时间以避免重叠。对于一些字幕编解码器,特别是DVB字幕,这是必要的,因为原始信息包中的持续时间只是一个粗略的估计,而最终实际上是由一个空字幕帧标记的。如果在必要时不使用此选项,可能会导致延长时间或由于非单调时间戳而导致muxing失败。
注意,这个选项将延迟所有数据的输出,直到下一个字幕包被解码:它可能会增加内存消耗和延迟。
-canvas_size size 设置用于呈现字幕的画布的大小。

高级选项

选项 参数 说明
-map [-]input_file_id[:stream_specifier][?][,sync_file_id[:stream_specifier]] | [linklabel] (output) 指定一个或多个输入流作为输出文件的源。每个输入流由输入文件中的输入文件索引input_file_id和输入文件中的输入流索引input_stream_id标识。两个指标都从0开始。如果指定,sync_file_id:stream_specifier将设置使用哪个输入流作为显示同步引用。
命令行上的第一个-map选项指定输出流0的源,第二个-map选项指定输出流1的源,等等。
流标识符前的-字符创建一个“负”映射。它禁止从已经创建的映射匹配流。
流索引之后的尾部?将允许映射是可选的:如果映射不匹配流,映射将被忽略而不是失败。注意,如果使用了无效的输入文件索引,映射仍然会失败;例如,如果映射指向不存在的输入。
另一种形式是[linklabel],它将复杂过滤器图的输出(参见-filter_complex选项)映射到输出文件。linklabel必须对应于图中定义的输出链接标签。
例如,将第一个输入文件中的所有流映射到输出
ffmpeg -i INPUT -map 0 output
例如,如果第一个输入文件中有两个音频流,那么这些流由“0:0”和“0:1”标识。您可以使用-map来选择在输出文件中放置哪些流。例如:
ffmpeg -i INPUT -map 0:1 out.wav
将“0:1”标识的输入流映射到out.wav中的(单个)输出流。
例如,从输入文件a中选择索引2的流。mov(由标识符“0:2”指定)和索引为6的流。mov(标识符“1:6”指定),并复制到输出文件中。
ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov
从输入文件中选择所有视频和第三音频流:
ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT
要映射除第二个音频之外的所有流,请使用负映射
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
映射视频和音频流从第一个输入,并使用尾部?,忽略音频映射,如果没有音频流存在,在第一个输入:
ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT
选择英语音频流:
ffmpeg -i INPUT -map 0:a:m:language:eng OUTPUT
注意,使用此选项将禁用此输出文件的默认映射。
-ignore_unknown 忽略未知类型的输入流,而不是尝试复制这些流时失败。
-copy_unknown 允许复制未知类型的输入流,而不是在尝试复制此类流时失败。
-map_channel [input_file_id.stream_specifier.channel_id|-1][?][:output_file_id.stream_specifier] 将音频通道从给定的输入映射到输出。如果output_file_id.stream_specifier未设置时,音频通道将映射到所有音频流上。
使用“-1”而不是input_file_id.stream_specifier。channel_id将映射一个哑光通道。
尾部?将允许map_channel是可选的:如果map_channel不匹配任何通道,map_channel将被忽略而不是失败。
例如,假设输入是一个立体声音频文件,您可以切换两个音频通道与以下命令:
ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT
如果你想静音的第一个通道和保留第二个:
ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT
"-map_channel"选项的顺序指定了输出流中通道的顺序。输出通道的布局是根据所映射的通道的数量来猜测的(mono如果一个“-map_channel”,立体声如果两个,等等)。如果输入和输出通道布局不匹配,那么使用“-ac”组合“-map_channel”可以更新通道增益级别(例如两个“-map_channel”选项和“-ac 6”)。
还可以将输入的每个通道提取为特定输出;以下命令提取输入音频流的两个通道(文件0,流0),分别输出到OUTPUT_CH0和OUTPUT_CH1:
ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1
下面的例子将一个立体声输入的通道分割为两个单独的流,它们被放入相同的输出文件:
ffmpeg -i stereo.wav -map 0:0 -map 0:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg
注意,目前每个输出流只能包含来自单个输入流的通道;例如,您不能使用“-map_channel”来选择包含在不同流中的多个输入音频通道(来自相同或不同的文件),并将它们合并到单个输出流中。因此,目前还不可能,例如,把两个单独的单声道流变成一个单一的立体声流。然而,将一个立体声流分割成两个单声道单声道流是可能的。
如果您需要这个特性,一个可能的解决方案是使用amerge过滤器。例如,如果你需要合并一个媒体(这里input.mkv)与两个单声道音频流到一个单一的立体声音频流(并保留视频流),你可以使用以下命令:
ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv
要映射第一个输入的前两个音频通道,并使用尾部?,忽略音频通道映射,如果第一个输入是单声道而不是立体声:
ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT
-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (output,per-metadata) 设置来自infile的下一个输出文件的元数据信息。注意,这些是文件索引(从零开始),而不是文件名。可选的metadata_spec_in/out参数指定要复制的元数据。元数据说明符可以有以下形式:
g:全局元数据,即应用于整个文件的元数据
s[:stream_spec]:每个流的元数据。stream_spec是流说明符一章中描述的一个流说明符。在输入元数据说明符中,复制第一个匹配流。在输出元数据说明符中,将复制到所有匹配的流。
c:chapter_index:按章元数据。chapter_index是从零开始的章节索引。
p:program_index:每个程序元数据。program_index是从零开始的程序索引。
如果省略元数据说明符,则默认为全局。
默认情况下,全局元数据将从第一个输入文件中复制,每个流和每个章节的元数据将与流/章节一起复制。通过创建相关类型的任何映射,可以禁用这些默认映射。负面文件索引可用于创建一个虚拟映射,该映射仅禁止自动复制。
例如,将元数据从输入文件的第一个流复制到输出文件的全局元数据:
ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3
反向操作,即复制全局元数据到所有音频流:
ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv
注意,在这个示例中,简单的0也可以工作,因为默认情况下假定了全局元数据。
-map_chapters input_file_index (output) 从索引input_file_index的输入文件中复制章节到下一个输出文件。如果没有指定章节映射,则从至少有一个章节的第一个输入文件中复制章节。使用负面文件索引来禁用任何章节复制。
-benchmark (global) 在编码的末尾显示基准测试信息。显示真实的,系统和用户使用的时间和最大内存消耗。不是所有系统都支持最大内存消耗,如果不支持,它通常会显示为0。
-benchmark_all (global) 在编码期间显示基准测试信息。显示在不同步骤(音频/视频编码/解码)中使用的真实、系统和用户时间。
-timelimit duration (global) 在ffmpeg在CPU用户时间中运行数秒后退出。
-dump (global) 将每个输入包转储到stderr。
-hex (global) 在转储包时,也要转储有效负载。
-re (input) 以本机帧速率读取输入。主要用于模拟抓取设备,或实时输入流(例如,读取文件时)。不应该与实际抓取设备或实时输入流一起使用(在那里它可能导致包丢失)。默认情况下,ffmpeg尝试尽可能快地读取输入。这个选项会将输入的读取速度降低到输入的本地帧速率。它对于实时输出(例如直播流)很有用。
-vsync parameter 视频同步方法。出于兼容性考虑,可以将旧值指定为数字。新添加的值必须始终指定为字符串。
0, passthrough:每一帧连同它的时间戳从demuxer传递到muxer。
1, cfr:帧将被复制和删除,以达到所要求的恒定帧速率。
2, vfr:帧与它们的时间戳一起传递或丢弃,以防止两个帧具有相同的时间戳。
drop:作为透传,但会破坏所有时间戳,从而使muxer根据帧速率生成新的时间戳。
-1, auto:根据muxer的能力在1和2之间进行选择。这是默认的方法。
注意,在此之后,时间戳可能会被muxer进一步修改。例如,在启用了格式选项avoid_negative_ts的情况下。
使用-map,您可以选择从哪个流获取时间戳。您可以保持视频或音频不变,并将其余流同步到未更改的流。
-frame_drop_threshold parameter 帧下降阈值,它指定视频帧在被删除之前可以落后多少。在帧速率单位中,1.0是1帧。默认值是-1.1。一种可能的用途是在有噪声的时间戳的情况下避免帧移,或者在有精确的时间戳的情况下增加帧移精度。
-async samples_per_second 音频同步方法。“拉伸/压缩”音频流以匹配时间戳,该参数是音频每秒改变的最大样本数。async 1是一种特殊情况,其中只有音频流的开始被纠正,没有任何后期的纠正。
注意,在此之后,时间戳可能会被muxer进一步修改。例如,在启用了格式选项avoid_negative_ts的情况下。
此选项已被弃用。使用aresample音频过滤器代替。
-copyts 不要处理输入时间戳,而是保留它们的值,而不要对它们进行清理。特别是,不要移除初始的开始时间偏移值。
注意,根据vsync选项或特定的muxer处理(例如启用format选项avoid_negative_ts),即使选择了该选项,输出时间戳也可能与输入时间戳不匹配。
-start_at_zero 当与复制一起使用时,将输入时间戳移位,使它们从0开始。
这意味着,使用例如-ss 50将使输出时间戳从50秒开始,而不管输入文件从哪个时间戳开始。
-copytb mode 指定在流复制时如何设置编码器的时间基。mode为整数数值,可以假设为以下值之一:
1:使用demuxer时间基。
将时间基从相应的输入解调器复制到输出编码器。这有时需要避免非单调地增加时间戳时,复制视频流与可变帧率。
0:使用解码器的时间基。
将时间基从相应的输入解码器复制到输出编码器。
-1:为了生成合理的输出,请尝试自动进行选择。
默认值是-1。
-enc_time_base[:stream_specifier] timebase (output,per-stream) 设置编码器的时间基准。timebase为浮点数,可以假设以下值之一:
0:根据媒体类型指定默认值。
视频使用1/帧率,音频使用1/采样。
-1:尽可能使用输入流时间基。
如果输入流不可用,将使用默认的时间基。
>0:使用提供的数字作为时间基准。
这个字段可以是两个整数的比率(例如1:24,1:48000)或浮点数(例如0.04166,2.0833e-5)
默认值为0。
-bitexact (input/output) 为(de)muxer和(de/en)编码器启用精确位模式
-shortest (output) 当最短的输入流结束时完成编码。
-dts_delta_threshold 时间戳不连续delta阈值。
-dts_error_threshold seconds seconds 时间戳错误delta阈值。这个阈值用于丢弃疯狂的/损坏的时间戳,默认为30小时,这是任意选择的,相当保守。
-muxdelay seconds (output) 设置最大的解码器延迟。
-muxpreload seconds (output) 设置初始的解码延迟。
-streamid output-stream-index:new-value (output) 为输出流分配一个新的流id值。此选项应在其应用的输出文件名之前指定。对于存在多个输出文件的情况,可以将streamid重新分配为不同的值。
例如,设置流0 PID为33,流1 PID为36输出mpegts文件:
ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts
-bsf[:stream_specifier] bitstream_filters (output,per-stream) 为匹配流设置位流过滤器。bitstream_filters是一个逗号分隔的位流过滤器列表。使用-bsfs选项获取位流过滤器列表。
ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt
-tag[:stream_specifier] codec_tag (input/output,per-stream) 对于匹配流,强制使用tag/ 4cc。
-timecode hh:mm:ssSEPff 指定写入的时间码。SEP是:表示非下降时码,而下降时码是’;’(或’ . ')。
ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
-filter_complex filtergraph (global) 定义一个复杂的过滤器图,即一个具有任意数量的输入和/或输出的过滤器图。对于具有相同类型的一个输入和一个输出的简单图形,请参见-filter选项。filtergraph是对filtergraph的描述,如ffmpeg-filters手册的“filtergraph语法”部分所述。
输入链接标签必须使用[file_index:stream_specifier]语法引用输入流(即与-map使用的相同)。如果stream_specifier匹配多个流,那么将使用第一个流。未标记的输入将连接到匹配类型的第一个未使用的输入流。
输出链接标签用-map引用。未标记的输出被添加到第一个输出文件中。
注意,有了这个选项,就可以只使用lavfi源文件而不使用普通的输入文件。
例如,在视频上覆盖图像
ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map '[out]' out.mkv
此处[0:v]为第一个输入文件中的第一个视频流,该文件链接到覆盖滤波器的第一个(主)输入。同样,第二个输入中的第一个视频流链接到overlay的第二个(overlay)输入。
假设在每个输入文件中只有一个视频流,我们可以省略输入标签,因此上面等价于
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map '[out]' out.mkv
此外,我们可以省略输出标签,过滤器图的单个输出将自动添加到输出文件中,因此我们可以简单地编写
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv
生成5秒纯红色视频使用lavfi彩色源:
ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
-filter_complex_threads nb_threads (global) 定义用于处理filter_complex图形的线程数。类似于filter_threads,但仅用于-filter_complex图形。默认值是可用cpu的数量。
-lavfi filtergraph (global) 定义一个复杂的过滤器图,即一个具有任意数量的输入和/或输出的过滤器图。相当于-filter_complex。
-filter_complex_script filename (global) 这个选项类似于-filter_complex,唯一的区别是它的参数是要从中读取复杂过滤器图描述的文件的名称。
-accurate_seek (input) 此选项使用-ss选项启用或禁用输入文件中的精确查找。它在默认情况下是启用的,因此在转码时查找是准确的。使用-noaccurate_seek来禁用它,这可能是有用的,例如,当复制一些流和转编码其他。
-seek_timestamp (input) 此选项使用-ss选项启用或禁用在输入文件中按时间戳查找。默认情况下是禁用的。如果启用,-ss选项的参数被认为是一个实际的时间戳,并且不受文件的开始时间的偏移。这只对不从时间戳0开始的文件有影响,比如传输流。
-thread_queue_size size (input) 此选项设置从文件或设备读取时排队的数据包的最大数量。低延迟/高速率的实时流,数据包可能被丢弃,如果他们没有及时读取;提高这个值可以避免它。
-sdp_file file (global) 打印一个输出流的sdp信息到文件。这允许在至少有一个输出不是rtp流时转储sdp信息。(要求至少有一种输出格式是rtp)。
-discard (input) 允许从流中丢弃特定的流或帧。任何输入流都可以被完全丢弃,使用值all,然而从流中选择丢弃帧发生在demuxer,并且不是所有的demuxer都支持。
none:不丢弃任何帧。
default:默认,不丢弃帧。
noref:放弃所有的非参考帧。
bidir:丢弃所有双向帧。
nokey:丢弃除关键帧外的所有帧。
all:抛弃所有的帧。
-abort_on flags (global) 在各种情况下停止和中止。可以使用以下标志:
empty_output:没有数据包被传递给muxer,输出为空。
empty_output_stream:在某些输出流中,没有数据包被传递给muxer。
-xerror (global) 在出现错误时停止并退出
-max_muxing_queue_size packets (output,per-stream) 当转换音频和/或视频流时,ffmpeg将不会开始写入输出,直到它为每个这样的流有一个包。在等待这种情况发生时,其他流的数据包被缓冲。此选项设置匹配输出流的数据包中的缓冲区大小。
这个选项的默认值对于大多数情况应该足够高,所以只有在确定需要时才使用这个选项。

作为一个特殊的例外,您可以使用位图字幕流作为输入:它将被转换为与文件中最大视频相同大小的视频,如果没有视频,则转换为720x576。注意,这是一个实验性的临时解决方案。它将被删除一旦libavfilter有适当的字幕支持。

例如,硬编码字幕上的DVB-T录音存储在MPEG-TS格式,延迟字幕1秒:

ffmpeg -i input.ts -filter_complex \
  '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
  -sn -map '#0x2dc' output.mkv

(0x2d0、0x2dc和0x2ef分别是视频流、音频流和字幕流的MPEG-TS pid;0:0, 0:3和0:7也可以)

预置文件

预设文件包含一系列option=value对,每一行一个,指定一系列在命令行上难于指定的选项。以哈希(’#’)字符开头的行将被忽略,并用于提供注释。检查FFmpeg源树中的presets目录以获得示例。

预置文件有两种类型:ffpreset和avpreset文件。

ffpreset文件

使用vpre、apre、spre和fpre选项指定ffpreset文件。fpre选项采用预设的文件名而不是预设名称作为输入,可以用于任何类型的编解码器。对于vpre、apre和spre选项,预置文件中指定的选项应用于与预置选项相同类型的当前选择的编解码器。

传递给vpre、apre和spre预置选项的参数标识了要按照以下规则使用的预置文件:

首先,ffmpeg搜索一个名为arg.ffpreset的文件在目录$FFMPEG_DATADIR(如果设置)和$HOME/.ffmpeg,和在配置时定义的datadir中(通常是PREFIX/share/ffmpeg),或者在win32上的可执行文件的ffpresets文件夹中,按照这个顺序。例如,如果参数是libvpx-1080p,它将搜索libvpx-1080p.ffpreset文件。

如果没有找到这样的文件,那么ffmpeg将搜索一个名为codec_name-arg的文件。在上述目录中,codec_name是应用预设文件选项的编解码器的名称。例如,如果选择-vcodec libvpx的视频编解码器并使用-vpre 1080p,那么它将搜索libvpx-1080p.ffpreset文件。

avpreset文件

avpreset文件是用pre选项指定的。它们的工作原理类似于ffperset文件,但它们只允许编码器特定的选项。因此,不能使用指定编码器的option=value对。

当指定了pre选项时,ffmpeg将在$AVCONV_DATADIR(如果设置)和$HOME/.avconv,和在配置时定义的datadir中(通常是PREFIX/share/ffmpeg),目录中查找后缀为.avpreset的文件,按照这个顺序。

首先,ffmpeg搜索一个名为codec_name-arg.avpreset的文件。在上述目录中,codec_name是应用预设文件选项的编解码器的名称。例如,如果选择-vcodec libvpx的视频编解码器并使用-pre 1080p,那么它将搜索libvpx-1080p.avpreset文件。

如果没有找到这样的文件,那么ffmpeg将在相同的目录搜索一个名为arg.avpreset的文件。

例子

视频和音频采集

如果您指定了输入格式和设备,那么ffmpeg可以直接抓取视频和音频。

ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg

或与ALSA音频源(单声道输入,卡id 1)而不是OSS:

ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg

注意,在使用任何电视查看器(如Gerd Knorr的xawtv)启动ffmpeg之前,必须先激活正确的视频源和频道。你还必须用标准混频器正确地设置音频录制水平。

X11采集

通过ffmpeg抓取X11显示

ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg

0.0是X11服务器的display.screen编号,与DISPLAY环境变量相同。

ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg

0.0是X11服务器的display.screen编号,与DISPLAY环境变量相同。10是采集的x偏移,20是采集的y偏移。

视频和音频文件格式转换

任何支持的文件格式和协议都可以作为ffmpeg的输入:

例子:

您可以使用YUV文件作为输入:

ffmpeg -i /tmp/test%d.Y /tmp/out.mpg

它将使用文件:

/tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,
/tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...

Y文件的分辨率是U和V文件的两倍。它们是原始文件,没有头。它们可以由所有像样的视频解码器生成。如果ffmpeg无法猜测,则必须使用-s选项指定图像的大小。

您可以从原始YUV420P文件输入:

ffmpeg -i /tmp/test.yuv /tmp/out.avi

test.yuv是一个包含原始yuv平面数据的文件。每一帧都是由Y平面和后面的U、V平面组成,具有半垂直和半水平分辨率。

您可以输出到一个原始YUV420P文件:

ffmpeg -i mydivx.avi hugefile.yuv

您可以设置几个输入文件和输出文件:

ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg

转换音频文件a.wav和原始的YUV视频文件a.yuv到MPEG文件a.mpg。

您还可以做音频和视频转换在同一时间:

ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2

转换a.wav到MPEG音频在22050赫兹的采样率。

你可以编码到几个格式在同一时间和定义一个映射从输入流到输出流:

ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2

将a.wav转换为a.mp2在64 kbits和b.mp2在128 kbits。’ -map file:index '按照输出流定义的顺序指定每个输出流使用哪个输入流。

您可以转码解密的VOBs:

ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi

这是一个典型的DVD撷取的例子;输入是一个VOB文件,输出是一个带有MPEG-4视频和MP3音频的AVI文件。注意,在这个命令中,我们使用b帧,所以MPEG-4流兼容DivX5,而GOP大小为300,这意味着每10秒就有一个内帧用于29.97fps的输入视频。此外,音频流是mp3编码的,因此您需要通过--enable-libmp3lame来配置来启用LAME支持。映射对于DVD转码以获得所需的音频语言特别有用。

注意:要查看支持的输入格式,请使用ffmpeg -demuxers

您可以提取图像从一个视频,或创建视频从许多图像:

从视频中提取图像:

ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg

这将每秒从视频中提取一个视频帧,并将它们输出到名为foo-001.jpeg、foo-002.jpeg等文件中。图像将被调整以适应新的WxH值。

如果只想提取有限数量的帧,可以结合使用上述命令和-frames:v-t选项,或者结合使用-ss从某个时间点开始提取。

从许多图像创建一个视频:

ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi

语法foo-%03d.jpeg指定使用一个十进制数,该十进制数由三个数字组成,并用零填充,以表示序列号。它与C printf函数支持的语法相同,但是只有接受普通整数的格式才适用。

在导入图像序列时,-i还支持在内部展开类似shell的通配符模式(globbing),通过选择特定于映像的-pattern_type glob选项。

例如,创建一个视频从文件名匹配的glob模式foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

你可以把许多相同类型的流在输出:

ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut

结果输出文件test12.nut将以相反的顺序包含输入文件中的前四个流。

强制CBR视频输出:

ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v

四个选项lmin, lmax, mblmin和mblmax使用’ lambda ‘单位,但您可以使用QP2LAMBDA常数轻松转换’ q '单位:

ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext

你可能感兴趣的:(音视频,ffmpeg)