网站翻译由林建有提供支持
1 概要
ffmpeg [全局选项] {[输入文件选项] -iinput_url} ... {[输出文件选项] output_url} ...
2 描述
ffmpeg
是一个通用媒体转换器。它可以读取广泛的输入,包括实时抓取/录制设备,过滤并转码为各种输出格式。
ffmpeg
从任意数量的输入“文件”(可以是普通文件、管道、网络流、抓取设备等)读取数据,由-i
选项指定,并写入任意数量的输出“文件”,这些由简单输出URL指定。命令行中任何无法解释为选项的内容都被认为是输出URL。
每个输入或输出URL理论上可以包含任意数量的不同类型的流(视频、音频、字幕、附件、数据)。容器格式可能会限制允许的流数和类型。从哪些输入选择哪些流进入哪些输出,要么自动完成,要么使用-map
选项(参见流选择章节)。
要在选项中引用输入文件,必须使用其索引(从0开始)。例如,第一个输入文件是0
,第二个是1
,依此类推。同样,文件中的流也根据其索引来引用。例如2:3
指第三个输入文件中的第四个流。此外,请参见流指定符章节。
作为一般规则,选项会应用于下一个指定的文件。因此,顺序很重要,并且可以在命令行中多次使用相同的选项。每次出现都应用于下一个输入或输出文件。此规则的例外是全局选项(例如,详细级别),应最先指定。
不要混合输入和输出文件——先指定所有输入文件,然后指定所有输出文件。也不要混合属于不同文件的选项。所有选项仅适用于下一个输入或输出文件,并在文件之间重置。
以下是一些简单的示例。
- 通过重新编码媒体流将输入媒体文件转换为不同格式:
ffmpeg -i input.avi output.mp4
- 将输出文件的视频比特率设为64 kbit/s:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.mp4
- 强制输出文件的帧速率为24 fps:
ffmpeg -i input.avi -r 24 output.mp4
- 强制输入文件的帧速率(仅对原始格式有效)为1 fps,并强制输出文件的帧速率为24 fps:
ffmpeg -r 1 -i input.m2v -r 24 output.mp4
对于原始输入文件,可能需要格式选项。
3 详细描述
转码过程可以用以下图示来描述:ffmpeg
for each output can be described by
the following diagram:
_______ ______________ | | | | | 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
区分两种类型的过滤图:简单和复杂。
3.1.1 简单过滤图
简单过滤图为具有一个输入和一个输出且类型相同的过滤图。在上述图示中,它们可以表示为在解码和编码之间简单插入一个额外步骤:
_________ ______________ | | | | | decoded | | encoded data | | frames |\ _ | packets | |_________| \ /||______________| \ __________ / simple _\|| | / encoder filtergraph | filtered |/ | frames | |__________|
简单过滤图通过每个流的-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 option is equivalent to -filter_complex.
一个复杂过滤图的简单例子是overlay
滤镜,它有两个视频输入和一个视频输出,将一个视频叠加在另一个视频之上。其音频对应滤镜是amix
滤镜。
3.2 流拷贝
流拷贝是一种通过向copy
选项提供-codec参数选择的模式,它使得ffmpeg
跳过编码和解码步骤,仅对指定流进行解复用和复用。这对于更改容器格式或修改容器级元数据很有用,在上述图示中,它将简化为:
_______ ______________ ________ | | | | | | | input | demuxer | encoded data | muxer | output | | file | ---------> | packets | -------> | file | |_______| |______________| |________|
由于没有解码或编码,速度非常快并且没有质量损失。然而,由于很多因素,它在某些情况下可能不起作用。在这种模式下显然也是无法应用滤镜的,因为滤镜作用于未压缩数据。
3.3 循环解码器
虽然解码器通常与解复用器流相关联,但也可以创建“循环解码器”,解码来自某编码器的输出并允许其回馈复杂过滤图。这通过-dec
指令完成,参数为应解码的输出流索引。每个此类指令创建一个新的循环解码器,从零开始依次编号。这些编号应在复杂过滤图链接标签中用于引用循环解码器,详见-filter_complex.
的文档。-dec
前传递给循环解码器,与输入/输出选项类似。
例如以下示例:
ffmpeg -i INPUT \ -map 0:v:0 -c:v libx264 -crf 45 -f null - \ -threads 3 -dec 0:0 \ -filter_complex '[0:v][dec:0]hstack[stack]' \ -map '[stack]' -c:v ffv1 OUTPUT
读取一个输入视频并
- (第2行)以低质量通过
libx264
编码; - (第3行)使用3个线程解码此编码流;
- (第4行)将解码后的视频与原始输入视频并排放置;
- (第5行)合并后的视频以无损方式编码并写入OUTPUT.
4 流选择
ffmpeg
提供了-map
选项用于手动控制每个输出文件中的流选择。用户可以跳过-map
选项,让ffmpeg执行自动流选择,如以下描述。-vn / -an / -sn / -dn
选项可用于跳过执行复杂过滤图自动选择的音视频、字幕和数据流的包含,无论是手动映射还是自动选择的,除非它们是复杂过滤图的输出流。
4.1 描述
以下子章节描述了与流选择相关的各种规则。接下来的示例展示了这些规则在实践中的应用。
尽一切努力准确反映程序的行为,但FFmpeg处于持续开发状态,代码可能已经自撰写本文时发生了改变。
4.1.1 自动流选择
在特定输出文件缺乏任何映射选项的情况下,ffmpeg检查输出格式以确定可以包含的流类型,例如视频、音频和/或字幕。对于每种可接受的流类型,当可用时,ffmpeg会从所有输入中选择一个流。
它将根据以下标准选择流:
- 对于视频,为分辨率最高的流,
- 对于音频,为通道数量最多的流,
- 对于字幕,为找到的第一个字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本或者基于图像的,只有同类型的字幕流会被选择。
当同类型流的评分相同时,选择索引最低的流。
数据或附件流不会被自动选择,仅可以通过-map
.
4.1.2 手动流选择
当-map
选项被使用时,只有用户映射的流会被包含进输出文件中,唯一的可能例外是过滤图输出,详见下文。
4.1.3 复杂过滤图
如果存在复杂过滤图输出流但其没有标记的输出插口,这些流将被添加到第一个输出文件中。如果流类型不被输出格式支持,这会导致致命错误。在缺乏映射选项的情况下,这些流的包含会导致跳过自动流选择它们的类型。如果映射选项存在,这些过滤图流会与映射流一起被包含。
带有标记插口的复杂过滤图输出流必须映射一次且仅一次。
4.1.4 流处理
流处理与流选择独立,唯一的例外是字幕。流处理通过-codec
选项设置,对特定输出文件中的流进行处理。尤其是,编解码器选项会被ffmpeg在流选择过程之后应用,因此不会影响流选择。如果没有为某类型流指定 file. In particular, codec options are applied by ffmpeg after the
stream selection process and thus do not influence the latter. If no -codec
选项,ffmpeg将选择由输出文件复用器注册的默认编码器。
字幕存在一个例外。如果为输出文件指定了字幕编码器,找到的任何类型的第一个字幕流(文本或图像)将被包含。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
选项被设置,因此ffmpeg会自动为这两个文件选择流。
out1.mkv是一个Matroska容器文件,可以接受视频、音频和字幕流,因此ffmpeg将尝试选择每种类型的一个流。
对于视频,它会选择stream 0
中的B.mp4,它是所有输入视频流中分辨率最高的。
对于音频,它会选择stream 3
中的B.mp4,因为它的声道数量最多。
对于字幕,它会选择stream 2
中的B.mp4,这是在A.avi和B.mp4.
out2.wav中第一个出现的字幕流。stream 3
只接受音频流,所以仅选择了B.mp4中的
。对于out3.mov,由于设置了一个-map
选项,没有发生自动流选择。-map 1:a
选项会选择第二个输入中的所有音频流。其他流不会包含在这个输出文件中。B.mp4. No other streams will be included in this output file.
对于前两个输出,所有包含的流将被转码。选定的编码器是每种输出格式注册的默认编码器,可能与选定的输入流的编解码器不匹配。
对于第三个输出,音频流的编解码器选项已被设置为copy
,因此不会发生解码-过滤-编码操作,但是可能会发生。选定流的数据包会从输入文件传输并在输出文件内混合。 occur.
Packets of selected streams shall be conveyed from the input file and muxed within the output
file.
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
选项设置的滤镜图表由一个单一的视频滤镜构成。overlay
滤镜需要完全匹配两个视频输入,但没有指定视频流,因此选择了两个可用的第一个视频流,即A.avi和C.mkv中的流。滤镜没有标签的输出端被发送到第一个输出文件out1.mp4。因此跳过了自动视频流选择,否则它会选择B.mp4中的流。音频流选择最大的声道stream 3
中音频流的B.mp4自动选择。然而未选择任何字幕流,因为MP4格式没有默认注册的字幕编码器,而用户也未指定字幕编码器。
第二个输出文件out2.srt只接受基于文本的字幕流。因此,即使第一个可用的字幕流属于C.mkv它是基于图像的,因此被跳过。选择的流stream 2
来自B.mp4,是第一个基于文本的字幕流。
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
上述命令也会失败,因为色调滤镜输出设置了一个标签[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的视频流被发送到色调滤镜,该输出被一次克隆使用分离滤镜,使两个输出分别标记。然后每个副本映射到第一个和第三个输出文件。
需要两个视频输入的叠加滤镜使用了两个未使用的视频流。这些流来自A.avi和C.mkv。叠加输出没有标记,所以它被发送到第一个输出文件out1.mp4,不论是否存在-map
选项。
音频重采样滤镜使用了第一个未使用的音频流,来自A.avi。由于此滤镜输出也未标记,它也被映射到第一个输出文件。-an
仅压制音频流的自动或手动选择,而不会影响从滤镜图表发送来的输出。映射的这两个流将在out1.mp4.
中的流以前排序。out2.mkv
视频、音频和字幕流的映射完全由自动流选择决定。
out3.mkv包含色调滤镜克隆输出和来自B.mp4.
的第一个音频流。
所有数字选项,如果没有另行说明,接受一个字符串表示数字作为输入,字符串可以后加一个SI单位前缀,例如:’K’,’M’或’G’。
如果SI单位前缀后加’i’,整个前缀将被解释为二进制倍数单位前缀,它基于1024的倍数而不是1000的倍数。附加’B’到SI单位前缀会将值乘以8。这允许使用例如:‘KB’,‘MiB’,‘G’和‘B’作为数值后缀。
不带参数的选项为布尔选项,设置对应值为true。可以通过在选项名称前添加"no"将其设置为false。例如使用"-nofoo"将布尔选项名称"foo"设置为false。
带参数选项支持一种特殊语法,其中命令行中给出的参数会被解释为文件路径,实际选项值从该文件中加载。要使用此功能,在选项名称前直接增加一个正斜杠’/’(紧跟在破折号后)。例如:
ffmpeg -i INPUT -/filter:v filter.script OUTPUT
将从文件filter.script.
加载滤镜图表描述。
某些选项应用于每个流,诸如比特率或编解码器。流指定符用于准确地指定给定选项属于哪个流。
流指定符通常是一个字符串附加到选项名,并通过冒号与选项名分隔。例如:-codec:a:1 ac3
包含流指定符a:1
匹配第二个音频流。因此,它会为第二个音频流选择ac3编解码器。
流指定符可以匹配多个流,以便该选项应用于所有这些流。例如:-b:a 128k
中的流指定符匹配所有音频流。
空流指定符匹配所有流。例如:-codec copy
或-codec: copy
将复制所有流而不再重新编码。
流指定符可能的形式有:
- 流索引
匹配具有此索引的流。例如:
-threads:1 4
将为第二个流设置线程数为4。如果流索引被用作额外的流指定符(见下文),那么它会选择匹配流中的第流索引号流。流编号基于libavformat检测流的顺序,除非额外指定了流组或节目ID。在此情况下,它基于组或节目中的流顺序。- 流类型[:额外流指定符]
流类型是以下之一:‘v’或‘V’表示视频,‘a’表示音频,‘s’表示字幕,‘d’表示数据,‘t’表示附件。‘v’匹配所有视频流,‘V’只匹配未附带图片、视频缩略图或封面艺术的视频流。如果额外流指定符被使用,那么它匹配的既是此类型又符合额外流指定符的流。否则,它匹配所有指定类型的流。
- g:组指定符[:额外流指定符]
匹配在组中拥有指定符的流。如果. if 额外流指定符被使用,那么它匹配的既是在组中属于指定的流又符合额外流指定符. 组指定符可以是以下之一:
- 组索引
匹配具有此组索引的流。
- #组ID or i:组ID
匹配具有此组ID的流。
- p:节目ID[:额外流指定符]
匹配在节目中拥有指定ID的流。如果. If 额外流指定符被使用,那么它匹配的既是属于节目并且符合额外流指定符.
- #流ID or i:流ID
通过流ID匹配流(例如:MPEG-TS容器中的PID)。
- m:键[:值]
匹配具有指定的元数据标签键并且值符合指定的流。如果值未给定,匹配所有包含具有任意值的给定标签的流。
- disp:播放行为[:额外流指定符]
匹配具有指定播放行为的流。播放行为是一个或多个播放行为(由-dispositions选项打印)以‘+’连接的字符串组合。
- u
匹配具有可用配置的流,编解码器必须已定义,并且像视频尺寸或音频采样率这样的基本信息必须存在。
注意在
ffmpeg
中,通过元数据匹配只会对输入文件正常工作。
5.2 通用选项
这些选项在ff*工具中是共享的。
- -L
显示许可。
- -h, -?, -help, --help [参数]
显示帮助。可以指定一个可选的参数以打印有关某一特定项的帮助。如果未指定参数,则仅显示基本(非高级)工具选项。
可能的参数值有:
- long
打印高级工具选项以及基本工具选项。
- full
打印完整选项列表,包括编码器、解码器、去混器、混流器、滤镜等的共享和私有选项。
- decoder=解码器名称
打印关于解码器名称解码器名称的详细信息。使用-decoders选项获得所有解码器列表。
- encoder=编码器名称
打印关于编码器名称编码器名称的详细信息。使用-encoders选项获得所有编码器列表。
- demuxer=去混流器名称
打印关于去混流器名称去混流器名称的详细信息。使用-formats选项获得所有去混流器和混流器列表。
- muxer=混流器名称
打印关于混流器名称混流器名称的详细信息。使用-formats选项获得所有混流器和去混流器列表。
- filter=过滤器名称
打印关于过滤器名称过滤器名称的详细信息。使用-filters选项获得所有过滤器列表。
- bsf=比特流过滤器名称
打印关于比特流过滤器名称比特流过滤器名称的详细信息。使用-bsfs选项获得所有比特流过滤器列表。
- protocol=协议名称
打印关于协议名称协议名称的详细信息。使用-protocols选项获得所有协议列表。
- -version
显示版本。
- -buildconf
显示版本构建配置,每行一个选项。
- -formats
显示可用的格式(包括设备)。
- -demuxers
显示可用的去混流器。
- -muxers
显示可用的混流器。
- -devices
显示可用的设备。
- -codecs
显示所有libavcodec已知的编解码器。
注意,‘编解码器’这个术语在整个文档中用作更正确的‘媒体比特流格式’的简写。
- -decoders
显示可用的解码器。
- -encoders
显示所有可用的编码器。
- -bsfs
显示可用的比特流过滤器。
- -protocols
显示可用的协议。
- -filters
显示可用的libavfilter过滤器。
- -pix_fmts
显示可用的像素格式。
- -sample_fmts
显示可用的采样格式。
- -layouts
显示频道名称和标准频道布局。
- -dispositions
显示流播放行为。
- -colors
显示识别的颜色名称。
- -sources 设备[,选项1=值1[,选项2=值2]...]
显示输入设备的自动检测源。 某些设备可能提供无法自动检测的依赖于系统的源名称。 返回的列表不能保证始终是完整的。
ffmpeg -sources pulse,server=192.168.0.4
- -sinks 设备[,选项1=值1[,选项2=值2]...]
显示输出设备的自动检测接收器。 某些设备可能提供无法自动检测的依赖于系统的接收器名称。 返回的列表不能保证始终是完整的。
ffmpeg -sinks pulse,server=192.168.0.4
- -loglevel [标志+]日志级别 | -v [标志+]日志级别
设置库使用的日志级别和标志。
可选的标志前缀可以包含以下值:
- ‘repeat’
表示重复的日志输出不应压缩到第一行,并且“最后的消息重复了 n 次”这一行将被省略。
- ‘level’
表示日志输出应该向每条消息行添加一个
[level]
前缀。这可以作为日志着色的替代,例如在将日志转储到文件时使用。
标志还可以单独使用,通过添加‘+’或‘-’前缀来设置或重置单个标志,而不会影响其他标志或更改日志级别。当同时设置标志和日志级别时,预期在最后一个标志值之后和日志级别.
日志级别是一个字符串或包含以下值之一的数字:
- ‘quiet, -8’
完全不显示任何内容;保持安静。
- ‘panic, 0’
仅显示可能导致进程崩溃的致命错误,例如断言失败。 目前未用于任何用途。
- ‘fatal, 8’
仅显示致命错误。这是进程绝对无法继续后的错误。
- ‘error, 16’
显示所有错误,包括可以恢复的错误。
- ‘warning, 24’
显示所有警告和错误。任何可能相关于不正确或意外情况的消息都会被显示。
- ‘info, 32’
在处理过程中显示信息性消息。这是继警告和错误消息之后的默认值。
- ‘verbose, 40’
与
info
相同,但更详细。- ‘debug, 48’
显示所有内容,包括调试信息。
- ‘trace, 56’
例如要启用重复日志输出,添加
level
前缀并设置日志级别为verbose
:ffmpeg -loglevel repeat+level+verbose -i input output
另一个示例,启用重复日志输出,而不影响
level
前缀标志或日志级别:ffmpeg [...] -loglevel +repeat
默认情况下,程序将日志记录到标准错误(stderr)。如果终端支持颜色,颜色会用于标记错误和警告。 通过设置环境变量
AV_LOG_FORCE_NOCOLOR
可以禁用日志着色,也可以通过设置环境变量AV_LOG_FORCE_COLOR
.- -report
将完整命令行和日志输出转储到名为
程序-YYYYMMDD-HHMMSS.log
的文件中。 此文件对于错误报告可能很有用。 它还暗示着-loglevel debug
.设置环境变量
FFREPORT
为任意值会产生相同的效果。如果值是一个由‘:’分隔的key=value序列,这些选项将影响报告;选项值必须进行转义以包含特殊字符或选项分隔符‘:’(请参阅ffmpeg-utils手册中的“引用和转义”部分)。以下选项被识别:
- file
设置用于报告的文件名;
%p
扩展为程序名,%t
扩展为时间戳,%%
扩展为普通%
- level
使用数值设置日志详细级别(请参阅
-loglevel
).
例如,要将报告输出到文件名为ffreport.log的文件,并使用日志级别
32
(日志级别的别名)info
):FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
解析环境变量中的错误不会导致失败,并且不会出现在报告中。
- -hide_banner
抑制打印横幅。
所有FFmpeg工具通常会显示版权声明、构建选项和库版本。此选项可以用于抑制打印这些信息。
- -cpuflags flags (全局)
允许设置和清除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’
- ‘Specific Processors’
- ‘pentium2’
- ‘pentium3’
- ‘pentium4’
- ‘k6’
- ‘k62’
- ‘athlon’
- ‘athlonxp’
- ‘k8’
- -cpucount 计数 (全局)
覆盖CPU计数的检测。此选项仅用于测试。 除非明确知道如何操作,否则不要使用它。
ffmpeg -cpucount 2
- -max_alloc 字节
设置通过ffmpeg的malloc函数分配堆块的最大大小限制。在使用此选项时,请极度谨慎。如果不完全理解这样做的后果,则不要使用。 默认值为INT_MAX。
5.3 AVOptions
这些选项由libavformat、libavdevice和libavcodec库直接提供。 要查看可用AVOptions的列表,请使用-help选项。它们分为两类:
- generic
这些选项可以为任何容器、编码器或设备设置。通用选项列在容器/设备的AVFormatContext选项下,以及编解码器的AVCodecContext选项下。
- private
这些选项是针对给定容器、设备或编解码器的特定选项。 私有选项列在其对应的容器/设备/编解码器下。
例如,要在MP3文件中写入ID3v2.3头而不是默认的ID3v2.4头,请使用id3v2_versionMP3复用器的私有选项:
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 格式 (输入/输出)
强制输入或输出文件格式。对于输入文件,格式通常是自动检测的;对于输出文件,从文件扩展名猜测格式。因此,在大多数情况下不需要此选项。
- -i URL (输入)
输入文件URL
- -y (全局)
不询问,直接覆盖输出文件。
- -n (全局)
不覆盖输出文件,如果指定的输出文件已存在则立即退出。
- -stream_loop 数字 (输入)
设置输入流应循环的次数。循环0表示不循环,循环-1表示无限循环。
- -recast_media (全局)
允许强制解码器与解复用器检测或指定的媒体类型不同。 这对于解码以数据流复用的媒体数据很有用。
- -c[:流说明符] 编解码器 (输入/输出,每流)
- -codec[:流说明符] 编解码器 (输入/输出,每流)
为一个或多个流选择编解码器(在输出文件之前使用时是编码器,在输入文件之前使用时是解码器)。编解码器是编解码器的名称,也可以是一个特殊值
copy
(仅输出)来表示该流不会被重新编码。例如
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 持续时间 (输入/输出)
作为输入选项时(在
-i
之前)限制从输入文件读取的数据的持续时间。作为输出选项时(在输出URL之前),当输出的持续时间达到持续时间.
持续时间必须是时间持续时间规格,参见(ffmpeg-utils)ffmpeg-utils(1)手册中的“时间持续时间”部分.
-to 和 -t 是互斥的,并且 -t 优先。
- -to 位置 (输入/输出)
停止写入输出或读取输入到位置. 位置必须是时间持续时间规格,参见(ffmpeg-utils)ffmpeg-utils(1)手册中的“时间持续时间”部分.
-to 和 -t 是互斥的,并且 -t 优先。
- -fs 限制大小 (输出)
设置文件大小限制,以字节表示。 在超出限制后,不再写入额外字节块。 输出文件大小略大于请求的文件大小。
- -ss 位置 (输入/输出)
作为输入选项使用(在
-i
之前),在该输入文件中跳转到位置。请注意,在大多数格式中,不可能完全精确跳转,因此ffmpeg
将跳转到最接近的跳转点之前的位置。 在转码时-accurate_seek启用(默认值),跳转点和位置之间的额外段将被解码并丢弃。 在进行流复制或使用-noaccurate_seek时,这段将被保留。作为输出选项使用(在输出URL之前),解码但丢弃输入,直到时间戳达到位置.
位置必须是时间持续时间规格,参见(ffmpeg-utils)ffmpeg-utils(1)手册中的“时间持续时间”部分.
- -sseof 位置 (输入)
-
与
-ss
选项类似,但相对于文件末尾。 负值表示文件中的较早位置,0表示EOF。 - -isync 输入索引 (输入)
分配一个输入作为同步源。
这将取目标和参考输入的起始时间的差值,并用该差值偏移目标文件的时间戳。 两个输入的源时间戳应来自相同的时钟源以获得预期结果。如果
copyts
已设置,则start_at_zero
也必须设置。如果任何一个输入没有起始时间戳,则不会进行同步调整。可接受的值是指有效的ffmpeg输入索引的那些值。如果同步参考是目标本身的索引或-1,则不会对目标时间戳进行调整。同步参考本身不得与任何其他输入同步。
默认值为-1.
- -itsoffset 偏移 (输入)
设置输入时间偏移。
偏移必须是时间延迟规格,参见(ffmpeg-utils)ffmpeg-utils(1)手册中的“时间持续时间”部分.
偏移量添加到输入文件的时间戳上。指定正偏移意味着对应的流将延迟偏移.
- -itsscale 比例 (输入,每流)
重新调整输入时间戳。比例应为浮点数。
- -timestamp 日期 (输出)
在容器中设置录制时间戳。
日期必须是日期规格,参见(ffmpeg-utils)ffmpeg-utils(1)手册中的“日期”部分.
- -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] 值 (输出,每流)
设置流的处置。
默认情况下,处置从输入流复制,除非此选项应用的输出流由复杂过滤器图提供数据——在这种情况下默认情况下处置被取消设置。
值是一系列以‘+’或‘-’分隔的项目。 第一个项目还可以带有‘+’或‘-’前缀,在这种情况下该选项修改默认值。 否则(第一个项目没有前缀),该选项覆盖默认值。‘+’前缀添加给定的处置,‘-’则将其移除。 也可以通过将其设置为0来清除处置。
如果没有
-disposition
为输出文件指定选项时,如果在输出文件中有多种类型的多个流,但没有标记为默认类型的流,ffmpeg将自动将“默认”属性设置为每种类型的第一个流。该
-dispositions
选项列出了已知属性。例如,将第二个音频流设置为默认流:
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=标题:][program_num=节目编号:]st=流[:st=流...] (输出)
-
创建具有指定标题, 节目编号的节目并将指定的流添加到其中。
- -stream_group [map=输入文件编号=流组][type=类型:]st=流[:st=流][:stg=流组][:id=流组编号...] (输出)
-
创建具有指定类型和流组编号的流组,或通过映射输入组,添加指定的流和/或之前定义的流组到其中。
类型可以是以下之一:
- iamf_audio_element
对属于同一IAMF音频元素的流进行分组
对于此组类型,提供以下选项:
- audio_element_type
音频元素类型。支持以下值:
- channel
可扩展通道音频表示
- scene
Ambisonics表示
- demixing
用于重建可扩展通道音频表示的混音信息。此选项必须用“,”与其他选项分隔,并接受以下键=值选项:
- parameter_id
帧中参数块可引用的标识符
- dmixp_mode
预定义的混音参数组合
- recon_gain
用于重建可扩展通道音频表示的增益信息。此选项必须用“,”与其他选项分隔,并接受以下键=值选项:
- parameter_id
帧中参数块可引用的标识符
- layer
定义音频元素中通道布局的层。此选项必须用“,”与其他选项分隔。可以定义多个“,”分隔的条目,且必须至少设置一个。
它接受以下":"分隔的键=值选项:
- ch_layout
层的通道布局
- flags
提供以下标志:
- recon_gain
是否标识参数块中是否存在增益元数据
- output_gain
- output_gain_flags
哪些通道应用了输出增益。提供以下标志:
- FL
- FR
- BL
- BR
- TFL
- TFR
- ambisonics_mode
Ambisonics模式。如果音频元素类型设置为通道,则此选项无效。
支持以下值:
- mono
每个Ambisonics通道作为组中的单独单声道流编码
- default_w
默认权重值
- iamf_mix_presentation
对属于IAMF音频元素同一IAMF混合表示中引用的所有元素的流进行分组
对于此组类型,提供以下选项:
- submix
在混合表示中定义一个子混合。此选项必须用“,”与其他选项分隔。可以定义多个“,”分隔的条目,且必须至少设置一个。
它接受以下":"分隔的键=值选项:
- parameter_id
帧中参数块可能引用的标识符,用于后处理混合音频信号以生成播放所需的音频信号。
- parameter_rate
帧中参数块引用此参数标识符的持续时间字段以采样率表示。
- default_mix_gain
当没有共享相同参数标识符的参数块时,应用的默认混合增益值。
- element
引用混合表示中用于生成最终输出音频信号的音频元素。 此选项必须用“|”与其他选项分隔。可以定义多个“|”分隔的条目,且必须至少设置一个。
它接受以下":"分隔的键=值选项:
- stg
该流组编号是该子混合所引用的音频元素的编号。
- parameter_id
帧中参数块可能引用的标识符,用于对引用和渲染的音频元素应用任何处理,然后与其他处理过的音频元素相加。
- parameter_rate
帧中参数块引用此参数标识符的持续时间字段以采样率表示。
- default_mix_gain
当没有共享相同参数标识符的参数块时,应用的默认混合增益值。
- annotations
描述子混合元素的键=值字符串,其中"key"是符合BCP-47的字符串,指定"value"字符串的语言。"key"必须与混合的注释
- headphones_rendering_mode
指示在耳机上回放时输入基于通道的音频元素是渲染为立体扬声器还是通过双耳渲染器进行空间化。 如果引用的音频元素的音频元素类型设置为通道,则此设置无效。
支持以下值:
- stereo
- binaural
- layout
指定测量响度信息的子混合布局。 此选项必须用“|”与其他选项分隔。可以定义多个“|”分隔的条目,且必须至少设置一个。
它接受以下":"分隔的键=值选项:
- layout_type
-
- loudspeakers
布局遵循ITU-2051-3的扬声器声音系统约定。
- binaural
布局为双耳。
- sound_system
通道布局匹配ITU-2051-3的A到J声音系统之一,以及7.1.2和3.1.2 如果布局类型设置为双耳,则此选项无效。
- integrated_loudness
程序综合响度信息,定义于ITU-1770-4中。
- digital_peak
音频信号的数字(采样)峰值,定义于ITU-1770-4中。
- true_peak
音频信号的真正峰值,定义于ITU-1770-4中。
- dialog_anchored_loudness
对话响度信息,定义于ITU-1770-4中。
- album_anchored_loudness
专辑响度信息,定义于ITU-1770-4中。
- annotations
描述混合的键=值字符串,其中"key"是符合BCP-47的字符串,指定"value"字符串的语言。"key"必须与所有子混合元素的注释的值一致。
例如,从多个WAV输入文件创建一个可扩展的5.1 IAMF文件:
ffmpeg -i front.wav -i back.wav -i center.wav -i lfe.wav -map 0:0 -map 1:0 -map 2:0 -map 3:0 -c:a opus -stream_group type=iamf_audio_element:id=1:st=0:st=1:st=2:st=3, demixing=parameter_id=998, recon_gain=parameter_id=101, layer=ch_layout=stereo, layer=ch_layout=5.1, -stream_group type=iamf_mix_presentation:id=2:stg=0:annotations=en-us=Mix_Presentation, submix=parameter_id=100:parameter_rate=48000|element=stg=0:parameter_id=100:annotations=en-us=Scalable_Submix|layout=sound_system=stereo|layout=sound_system=5.1 -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 output.iamf
将具有四个流的输入IAMF文件中的两个流组(音频元素和混合表示)复制到一个MP4输出文件中:
ffmpeg -i input.iamf -c:a copy -stream_group map=0=0:st=0:st=1:st=2:st=3 -stream_group map=0=1:stg=0 -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 output.mp4
- -target 类型 (输出)
指定目标文件类型(
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
为每个目标设置的参数如下。
VCD
PAL制式: -f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324 -s 352x288 -r 25 -codec:v mpeg1video -g 15 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680 -ar 44100 -ac 2 -codec:a mp2 -b:a 224k NTSC制式: -f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324 -s 352x240 -r 30000/1001 -codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680 -ar 44100 -ac 2 -codec:a mp2 -b:a 224k 影片: -f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324 -s 352x240 -r 24000/1001 -codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680 -ar 44100 -ac 2 -codec:a mp2 -b:a 224k
SVCD
PAL制式: -f svcd -packetsize 2324 -s 480x576 -pix_fmt yuv420p -r 25 -codec:v mpeg2video -g 15 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1 -ar 44100 -codec:a mp2 -b:a 224k NTSC制式: -f svcd -packetsize 2324 -s 480x480 -pix_fmt yuv420p -r 30000/1001 -codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1 -ar 44100 -codec:a mp2 -b:a 224k 影片: -f svcd -packetsize 2324 -s 480x480 -pix_fmt yuv420p -r 24000/1001 -codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1 -ar 44100 -codec:a mp2 -b:a 224k
DVD
PAL制式: -f dvd -muxrate 10080k -packetsize 2048 -s 720x576 -pix_fmt yuv420p -r 25 -codec:v mpeg2video -g 15 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008 -ar 48000 -codec:a ac3 -b:a 448k NTSC制式: -f dvd -muxrate 10080k -packetsize 2048 -s 720x480 -pix_fmt yuv420p -r 30000/1001 -codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008 -ar 48000 -codec:a ac3 -b:a 448k 影片: -f dvd -muxrate 10080k -packetsize 2048 -s 720x480 -pix_fmt yuv420p -r 24000/1001 -codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008 -ar 48000 -codec:a ac3 -b:a 448k
DV
PAL制式: -f dv -s 720x576 -pix_fmt yuv420p -r 25 -ar 48000 -ac 2 NTSC制式: -f dv -s 720x480 -pix_fmt yuv411p -r 30000/1001 -ar 48000 -ac 2 影片: -f dv -s 720x480 -pix_fmt yuv411p -r 24000/1001 -ar 48000 -ac 2
该
dv50
目标与dv
目标相同,只是为所有三个标准设置的像素格式是yuv422p
。用户为上述某个参数设置的任何值将覆盖目标预设值。在这种情况下,输出可能不符合目标标准。
- -dn (输入/输出)
作为输入选项,阻止文件的所有数据流过滤或自动选择或映射到任何输出。请参阅
-discard
选项以单独禁用流。作为输出选项,禁用数据记录,即不自动选择或映射任何数据流。有完全手动控制,请参阅
-map
选项。- -dframes 数量 (输出)
设置输出的数据帧的数量。这是
-frames:d
的过时别名,您应该改用。- -frames[:流说明符] 帧数 (输出,每流)
在写入帧数帧后停止。
- -q[:流说明符] 质量 (输出,每流)
- -qscale[:流说明符] 质量 (输出,每流)
使用固定的质量比例(可变比特率)。质量/质量比例的意义是编解码器依赖的。 如果质量比例未与流说明符一起使用,则仅适用于视频流,这是为了保持与先前行为的兼容性。因为如果对两个不同的编解码器(即音频和视频)指定相同的编解码器特定值,通常并不是未指定流说明符时的意图。
- -filter[:流说明符] 滤镜图 (输出,每流)
创建由滤镜图指定的滤镜图并用它来过滤流。
滤镜图是要应用于流的滤镜图的描述,必须具有与流相同类型的单输入和单输出。在滤镜图中,输入与标签
in
关联,输出与标签out
关联。有关滤镜图语法的详细信息,请参阅ffmpeg-filters手册。有关创建具有多个输入和/或输出的滤镜图,请参阅-filter_complex选项。 if you want to create filtergraphs with multiple inputs and/or outputs.
- -reinit_filter[:流说明符] 整数 (输入,每流)
此布尔选项决定当输入帧参数在流中途发生变化时,此流所馈送的滤镜图是否会重新初始化。默认启用,因为大多数视频和所有音频滤镜无法处理输入帧属性的变化。 重新初始化时,现有滤镜状态会丢失,例如某些滤镜中的帧计数参考。重新初始化时缓冲的任何帧将丢失。 触发重新初始化的属性变化包括,对于视频为帧分辨率或像素格式;对于音频为采样格式、采样率、通道数或通道布局。
n
reference available in some filters. Any frames buffered at time of reinitialization are lost. The properties where a change triggers reinitialization are, for video, frame resolution or pixel format; for audio, sample format, sample rate, channel count or channel layout.- -filter_threads 线程数 (全局)
定义处理滤镜管道时使用的线程数。每个管道将创建一个拥有指定数量线程的线程池以实现并行处理。默认值为可用CPU数量。
- -pre[:流说明符] 预设名称 (输出,每流)
为匹配的流指定预设。
- -stats (全局)
打印编码进度/统计信息。默认为开启状态,要显式禁用需要指定
-nostats
.- -stats_period 时间 (全局)
设置编码进度/统计信息的更新周期。默认为0.5秒。
- -progress URL (全局)
将程序友好的进度信息发送至URL.
进度信息会定期写入,并在编码过程结束时写入。其格式由"键=值"行组成。键仅由字母和数字组成。一段进度信息的最后一个键始终为"progress"。
更新周期由
-stats_period
.- -stdin
启用标准输入交互。默认为启用状态,除非标准输入用作输入。要显式禁用交互,需要指定
-nostdin
.禁用标准输入的交互对于ffmpeg作为后台进程组时有用。例如,可以用
ffmpeg ... < /dev/null
实现差不多相同的效果,但需要使用shell。- -debug_ts (全局)
打印时间戳/延迟信息。默认为关闭状态。此选项主要用于测试和调试目的,其输出格式可能会随着版本变化,因此不应由可移植脚本使用。
另请参阅选项
-fdebug ts
.- -attach 文件名 (输出)
将附件添加到输出文件。这受到某些格式的支持,例如Matroska,用于指定渲染字幕时用到的字体等。附件作为一种特定类型的流实现,因此此选项会向文件添加一个新流。然后,可以按照通常方式对这个流使用每流选项。使用此选项创建的附件流将在所有其他流后创建(即那些用
-map
或自动映射创建的流之后)。请注意,对于 Matroska 格式,您还需要设置 mimetype 元数据标签:
ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv
(假设附件流将在输出文件中是第三个流)。
- -dump_attachment[:流选择器] 文件名 (输入,按流)
将匹配的附件流提取到名为文件名的文件中。如果文件名为空,则使用
filename
元数据标签的值。例如,将第一个附件提取到名为 'out.ttf' 的文件:
ffmpeg -dump_attachment:t:0 out.ttf -i INPUT
要根据
filename
标签提取所有附件:ffmpeg -dump_attachment:t "" -i INPUT
技术说明——附件作为编解码器的额外数据实现,因此此选项实际上可以用于从任何流(不仅仅是附件)提取额外数据。
5.5 视频选项
- -vframes 数量 (输出)
设置输出的视频帧数。这是
-frames:v
的一个过时别名,您应该使用它。- -r[:流选择器] fps (输入/输出,按流)
设置帧率(Hz 值、分数或缩写)。
作为输入选项,忽略文件中存储的任何时间戳,而是fps生成假定为恒定帧率的时间戳。这与某些输入格式(如 image2 或 v4l2)使用的-framerate选项不同(在较旧版本的 FFmpeg 中,它们曾经相同)。如果有疑问,请使用-framerate代替输入选项-r.
作为输出选项:
- video encoding
在编码前复制或丢弃帧以实现恒定输出帧率fps.
- video streamcopy
指示复用器fps是流的帧率。在这种情况下没有数据被丢弃或重复。如果fps与通过数据包时间戳计算的实际流帧率不匹配,则可能会生成无效文件。另请参见
setts
比特流过滤器。
- -fpsmax[:流选择器] fps (输出,按流)
设置最大帧率(Hz 值、分数或缩写)。
当输出帧率自动设置且高于此值时,限制输出帧率。在批处理或输入帧率被错误检测为非常高时很有用。它不能与
-r
一起设置。在流拷贝期间它被忽略。- -s[:流选择器] 大小 (输入/输出,按流)
设置帧大小。
作为输入选项,这是video_size私人选项的快捷方式,被某些解复用器识别,这些解复用器不在文件中存储帧大小或帧大小是可配置的——例如原始视频或视频采集器。
作为输出选项,这会将
scale
视频过滤器插入到对应过滤图的末尾。请直接使用 of the corresponding filtergraph. Please use thescale
过滤器将其插入到开头或其他位置。格式为 'wxh'(默认 - 与源相同)。
- -aspect[:流选择器] 纵横比 (输出,按流)
设置视频显示纵横比,由纵横比指定.
纵横比可以是浮点数字符串,或者格式为num:den的字符串,其中num和den是纵横比的分子和分母。例如 "4:3"、"16:9"、"1.3333" 和 "1.7777" 都是有效的参数值。
如果与-vcodec copy一起使用,它将影响容器级存储的纵横比,但不影响编码帧中存储的纵横比(如果存在的话)。
- -display_rotation[:流选择器] 旋转 (输入,按流)
设置视频旋转元数据。
旋转是一个十进制数字,指定视频在显示之前逆时针旋转的角度。
此选项会覆盖文件中存储的旋转/显示变换元数据(如果有)。当视频被转码(而不是拷贝)并且启用了
-autorotate
时,视频将在过滤阶段旋转。否则,如果复用器支持,则元数据会写入输出文件。如果
-display_hflip
和/或-display_vflip
选项被提供,它们将在此选项指定的旋转之后应用。- -display_hflip[:流选择器] (输入,按流)
设置图像显示时是否应水平翻转。
有关详细信息,请参见
-display_rotation
选项。- -display_vflip[:流选择器] (输入,按流)
设置图像显示时是否应垂直翻转。
有关详细信息,请参见
-display_rotation
选项。- -vn (输入/输出)
作为输入选项,阻止文件的所有视频流被过滤或自动选择或映射到任何输出。有关单独禁用流,请参见
-discard
选项。作为输出选项,禁用视频录制,即自动选择或映射任何视频流。有关完全手动控制,请参见
-map
选项。- -vcodec 编解码器 (输出)
设置视频编解码器。这是
-codec:v
.- -pass[:的一个别名。] n (输出,按流)
选择传递编号(1 或 2)。它用于进行两遍视频编码。在第一次传递中,视频的统计信息记录在日志文件中(另请参见 -passlogfile 选项),在第二次传递中使用该日志文件生成精确要求比特率的视频。 在第一次传递中,您可以只禁用音频并将输出设置为 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[:流选择器] 前缀 (输出,按流)
将两遍日志文件名前缀设置为前缀,默认文件名前缀为 “ffmpeg2pass”。完整的文件名将是PREFIX-N.log,其中 N 是特定于输出流的编号
- -vf 过滤图 (输出)
创建指定的过滤图过滤图并使用它来过滤流。
这是
-filter:v
的一个别名,请参见-filter 选项.- -autorotate
根据文件元数据自动旋转视频。默认启用,使用-noautorotate禁用。
- -autoscale
根据第一帧的分辨率自动缩放视频。默认启用,使用-noautoscale禁用。当禁用自动缩放时,过滤图的所有输出帧可能不具有相同分辨率,可能不适合某些编码器/复用器。因此,除非您确实知道自己在做什么,否则不建议禁用。禁用自动缩放需自行承担风险。
5.6 高级视频选项
- -pix_fmt[:流选择器] 格式 (输入/输出,按流)
设置像素格式。使用
-pix_fmts
显示所有支持的像素格式。如果选择的像素格式不能被选择,ffmpeg 将打印警告并选择编码器支持的最佳像素格式。如果pix_fmt以+
开头,若无法选择请求的像素格式,ffmpeg 将以错误状态退出,并且过滤图内的自动转换将被禁用。如果pix_fmt是单个+
,ffmpeg 将选择与输入(或过滤图输出)相同的像素格式,并禁用自动转换。- -sws_flags 标志 (输入/输出)
为 libswscale 库设置默认标志。这些标志由自动插入的
scale
过滤器以及简单过滤图中的过滤器使用,如果未在过滤图定义中覆盖。参见(ffmpeg-scaler)ffmpeg-scaler 手册以获取缩放器选项列表。
- -rc_override[:流选择器] 覆盖 (输出,按流)
为特定区间设置速率控制覆盖,格式为 "int,int,int" 的列表,以斜杠分隔。前两个值是起始和结束帧号,最后一个是正值时所用的量化器,负值时所用的质量因子。
- -vstats
将视频编码统计信息转储到vstats_HHMMSS.log中。参见vstats 文件格式部分以了解格式描述。
- -vstats_file 文件
将视频编码统计信息转储到文件中。参见vstats 文件格式部分以了解格式描述。
- -vstats_version 文件
指定使用哪个版本的 vstats 格式。默认是
2
。参见vstats 文件格式部分以了解格式描述。- -vtag fourcc/tag (输出)
强制视频标签/fourcc。这是
-tag:v
.- -force_key_frames[:的别名。] 时间[,时间...] (输出,按流)
- -force_key_frames[:流选择器] expr:表达式 (输出,按流)
- -force_key_frames[:流选择器] source (输出,按流)
-
force_key_frames可以接受以下形式的参数:
- 时间[,时间...]
如果参数由时间戳组成,ffmpeg 将根据编码器的时间基舍入指定的时间戳到最近的输出时间戳,并将在具有等于或大于计算时间戳的第一个帧上强制关键帧。请注意,如果编码器的时间基太粗糙,则关键帧可能被强制到时间戳低于指定时间的帧上。编码器的默认时间基是输出帧率的倒数,但可以通过将
-enc_time_base
.设置为其他值。
chapters
[delta]",它将扩展到文件中所有章节起始时间加上delta,以秒为单位表示的时间。此选项可以确保在章节标记或输出文件中任何其他指定位置存在一个查找点。例如,要在 5 分钟时插入一个关键帧,并在每个章节开始前 0.1 秒插入关键帧:
-force_key_frames 0:05:00,chapters-0.1
- 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)
为了在最后一个强制帧时间后的 5 秒插入一个关键帧,从第 13 秒开始:
-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))
- source
如果参数是
source
,那么如果当前正在编码的帧在其源中被标记为关键帧,ffmpeg 将强制关键帧。在必须删除此特定源帧的情况下,强制下一个可用帧成为关键帧。
请注意,强制太多关键帧对某些编码器的预查看前算法非常有害:使用固定 GOP 选项或类似选项会更有效。
- -apply_cropping[:流选择器] 来源 (输入,按流)
根据文件的元数据,解码后自动裁剪视频。默认是全部.
- none (0)
不要应用任何裁剪元数据。
- all (1)
应用编解码器和容器级别的裁剪。这是默认模式。
- codec (2)
应用编解码器级别的裁剪。
- container (3)
应用容器级别的裁剪。
- -copyinkf[:流选择器] (输出,按流)
在进行流拷贝时,也复制在开头找到的非关键帧。
- -init_hw_device 类型[=名称][:设备[,键=值...]]
初始化一个新硬件设备,类型为类型名为名称,使用给定的设备参数。如果未指定名称,它将收到一个默认名称,如 "类型%d"。
设备和后续参数的含义取决于设备类型: and the following arguments depends on the device type:
- cuda
设备是 CUDA 设备编号。
以下选项被识别:
- primary_ctx
如果设置为 1,则使用主设备上下文而不是创建一个新上下文。
例如:
- -init_hw_device cuda:1
选择系统上的第二个设备。
- -init_hw_device cuda:0,primary_ctx=1
选择第一个设备并使用主设备上下文。
- dxva2
设备是 Direct3D 9 显示适配器编号。
- d3d11va
设备是 Direct3D 11 显示适配器编号。如果未指定它,将尝试使用默认 Direct3D 11 显示适配器或硬件 VendorId 由“vendor_id’.
指定的第一个 Direct3D 11 显示适配器。例如:
- -init_hw_device d3d11va
在默认的Direct3D 11显示适配器上创建一个d3d11va设备。
- -init_hw_device d3d11va:1
在索引为1的Direct3D 11显示适配器上创建一个d3d11va设备。
- -init_hw_device d3d11va:,vendor_id=0x8086
在硬件VendorId为0x8086的第一个Direct3D 11显示适配器上创建一个d3d11va设备。
- vaapi
设备可以是X11显示名称、DRM渲染节点或DirectX适配器索引。如果未指定,它将尝试打开默认的X11显示 ($DISPLAY),然后是第一个DRM渲染节点 (/dev/dri/renderD128) 或Windows上的默认DirectX适配器。
以下选项被识别:
- kernel_driver
当设备未指定时,使用此选项指定与所需设备相关的内核驱动程序的名称。此选项仅在硬件加速方法drm和vaapi启用时可用。
- vendor_id
当设备和kernel_driver未指定时,使用此选项指定与所需设备相关的供应商ID。此选项仅在硬件加速方法drm和vaapi启用并且kernel_driver未指定时可用。
示例:
- -init_hw_device vaapi
在默认设备上创建一个vaapi设备。
- -init_hw_device vaapi:/dev/dri/renderD129
在DRM渲染节点上创建一个vaapi设备/dev/dri/renderD129.
- -init_hw_device vaapi:1
在DirectX适配器1上创建一个vaapi设备。
- -init_hw_device vaapi:,kernel_driver=i915
在与内核驱动程序‘i915’相关的设备上创建一个vaapi设备i915’.
- -init_hw_device vaapi:,vendor_id=0x8086
在与供应商ID‘0x8086’相关的设备上创建一个vaapi设备0x8086’.
- vdpau
设备是一个X11显示名称。如果未指定,它将尝试打开默认X11显示 ($DISPLAY).
- qsv
设备选择‘MFX_IMPL_*’中的一个值。允许的值为:
- auto
- sw
- hw
- auto_any
- hw_any
- hw2
- hw3
- hw4
如果未指定,则使用‘auto_any’。 (请注意,通过创建适合平台的子设备(‘dxva2’或‘d3d11va’或‘vaapi’),然后从中派生QSV设备,可能更容易实现所需结果。)
以下选项被识别:
- child_device
在Linux上指定一个DRM渲染节点或在Windows上指定DirectX适配器。
- child_device_type
选择适合平台的子设备类型。在Windows上,‘d3d11va’是在配置时间指定时默认的子设备类型,‘
--enable-libvpl
is specified at configuration time, ‘dxva2’是在配置时间指定时默认的子设备类型。在Linux上,用户只能使用‘--enable-libmfx
is specified at configuration time. On Linux user can use ‘vaapi’作为子设备类型。
示例:
- -init_hw_device qsv:hw,child_device=/dev/dri/renderD129
在DRM渲染节点上以‘MFX_IMPL_HARDWARE’创建QSV设备/dev/dri/renderD129.
- -init_hw_device qsv:hw,child_device=1
在DirectX适配器1上以‘MFX_IMPL_HARDWARE’创建QSV设备。
- -init_hw_device qsv:hw,child_device_type=d3d11va
选择类型为‘d3d11va’的GPU子设备,并用‘MFX_IMPL_HARDWARE’.
- -init_hw_device qsv:hw,child_device_type=dxva2
选择类型为‘dxva2’的GPU子设备,并用‘MFX_IMPL_HARDWARE’.
- -init_hw_device qsv:hw,child_device=1,child_device_type=d3d11va
在DirectX适配器1上使用子设备类型‘MFX_IMPL_HARDWARE’创建QSV设备,名称为‘d3d11va’.
- -init_hw_device vaapi=va:/dev/dri/renderD129 -init_hw_device qsv=hw1@va
在va上创建一个名为‘/dev/dri/renderD129’的VAAPI设备,然后从设备‘hw1’派生一个名为‘va’.
- 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设备。
- vulkan
如果设备是整数,则按设备列表中的索引选择设备。如果设备是其他字符串,则选择第一个名称包含该子字符串的设备。
以下选项被识别:
- debug
如果设置为1,启用验证层(如果已安装)。
- linear_images
如果设置为1,由硬件上下文分配的图像将是线性且局部可映射的。
- 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.
- -init_hw_device list
列出此FFmpeg版本中支持的所有硬件设备类型。
- -filter_hw_device 名称
将硬件设备name传递给任何过滤器图中的所有过滤器。这可以用于设置要上传到的设备
hwupload
过滤器,或映射到的设备hwmap
过滤器。其他过滤器也可能在需要硬件设备时使用此参数。注意,这通常只在输入尚未处于硬件帧状态时需要 - 当输入已处于硬件帧状态时,过滤器将从作为输入接收的帧的上下文中派生它们需要的设备。这是一个全局设置,因此所有过滤器将接收相同的设备。
- -hwaccel[:流标识符] 硬件加速 (输入,每流)
使用硬件加速解码匹配的流。硬件加速的允许值为:硬件加速包括:
- none
不使用任何硬件加速(默认)。
- auto
自动选择硬件加速方法。
- vdpau
使用VDPAU(Unix视频解码和演示API)硬件加速。
- dxva2
使用DXVA2(DirectX视频加速)硬件加速。
- d3d11va
使用D3D11VA(DirectX视频加速)硬件加速。
- vaapi
使用VAAPI(视频加速API)硬件加速。
- qsv
使用Intel QuickSync视频加速进行视频转码。
与大多数其他值不同,此选项不启用加速解码(选择QSV解码器时会自动使用),而是加速转码,无需将帧复制到系统内存。
要使其工作,解码器和编码器都必须支持QSV加速,且不得使用任何过滤器。
如果所选硬件加速不可用或所选解码器不支持,则此选项无效。
注意,大多数加速方法通常是为回放设计的,在现代CPU上可能并不比软件解码更快。此外,
ffmpeg
通常需要将解码的帧从GPU内存复制到系统内存,导致进一步的性能损失。因此,此选项主要用于测试。- -hwaccel_device[:流标识符] 硬件加速设备 (输入,每流)
选择用于硬件加速的设备。
此选项仅在-hwaccel选项也已指定时有意义。它可以通过名称引用一个已创建的设备,也可以类似于‘-init_hw_device调用立即创建一个新的设备。-init_hw_device’ 类型:硬件加速设备’
- -hwaccels
列出此FFmpeg版本中启用的所有硬件加速组件。实际运行时可用性取决于硬件及其安装的驱动程序是否合适。
- -fix_sub_duration_heartbeat[:流标识符]
根据特定的输出视频流(称为心跳流)选择的基础上切分字幕,并在接收到随机访问包时立即推送正在进行中的字幕。
这会降低字幕在未收到结束包或后续字幕时的延迟。缺点是,这很可能会导致字幕事件的重复,以覆盖完整的持续时间,因此当处理字幕事件传递时间不重要的用例时,不应使用此选项。
要求-fix_sub_duration为相关输入字幕流设置才能对此产生影响,并且输入字幕流必须直接映射到包含心跳流的相同输出。
5.7 音频选项
- -aframes 数字 (输出)
设置输出音频帧的数量。这是一个过时的别名,建议使用
-frames:a
,您应该使用这个。- -ar[:流标识符] 频率 (输入/输出,每流)
设置音频采样频率。对于输出流,默认设置为对应输入流的频率。对于输入流,此选项仅对音频采集设备和原始解封装器有意义,并映射到相应的解封装器选项。
- -aq 质量 (输出)
设置音频质量(特定编解码器,VBR)。这是-q:a的别名。
- -ac[:流标识符] 声道 (输入/输出,每流)
设置音频信道的个数。对于输出流,默认设置为输入音频信道的个数。对于输入流,此选项仅对音频采集设备和原始解包装器有意义,并映射到相应的解包装器选项。
- -an (输入/输出)
作为输入选项,阻止文件中的所有音频流被过滤或被自动选择或映射到任何输出。请参阅
-discard
选项以单独禁用流。作为输出选项,禁用音频记录,即音频流的自动选择或映射。有关完全手动控制,请参阅
-map
选项。- -acodec 编解码器 (输入/输出)
设置音频编解码器。这是
-codec:a
.- -sample_fmt[:流标识符] 样本格式 (输出,每流)
设置音频样本格式。使用
-sample_fmts
获取支持的样本格式列表。- -af 过滤器图 (输出)
创建由过滤器图指定的过滤器图,并使用它来过滤音频流。
这是
-filter:a
的别名,请参阅-filter 选项.
5.8 高级音频选项
- -atag fourcc/标签 (输出)
强制音频标签/fourcc。这是
-tag:a
.- -ch_layout[:流标识符] 布局 (输入/输出,每流)
为
-channel_layout
.- -channel_layout[:流标识符] 布局 (输入/输出,每流)
设置音频通道布局。对于输出流,默认为输入通道布局。对于输入流,则覆盖输入的通道布局。并非所有解码器都尊重该覆盖。此选项还设置音频采集设备和原始解封装器的通道布局,并映射到相应的解封装器选项。
- -guess_layout_max 声道 (输入,每流)
如果某些输入通道布局未知,仅在其通道数最多为指定值的情况下尝试猜测。例如,2表示
ffmpeg
尝试将1个通道识别为单声道,将2个通道识别为立体声,但不会将6个通道识别为5.1环绕声。默认情况下,始终尝试猜测。使用-channel_layout
选项显式指定输入布局也会禁用猜测。
5.9 字幕选项
- -scodec 编解码器 (输入/输出)
设置字幕编解码器。这是的别名
-codec:s
.- -sn (输入/输出)
作为输入选项,阻止文件中的所有字幕流被过滤或被自动选择或映射到任何输出中。参见
-discard
选项以单独禁用流。作为输出选项,禁用字幕录制,即自动选择或映射任何字幕流。要获得完整的手动控制,请参阅
-map
选项。
5.10 高级字幕选项
- -fix_sub_duration
修复字幕持续时间。对于每个字幕,等待同一流中的下一个数据包并调整第一个数据包的持续时间以避免重叠。这对于某些字幕编解码器(特别是 DVB 字幕)是必要的,因为原始数据包中的持续时间只是一个大致估计,实际结束标志是一个空字幕帧。如果在需要时未使用此选项,可能会导致持续时间夸大或由于非单调时间戳造成复用失败。
请注意,此选项会延迟所有数据的输出直到下一个字幕数据包被解码:这可能会大大增加内存消耗和延迟。
- -canvas_size 大小
设置用于渲染字幕的画布大小。
5.11 高级选项
- -map [-]输入文件标识[:流说明符][:视图说明符][?] | [链接标签] (输出)
-
在输出文件中创建一个或多个流。此选项有两种形式来指定数据源:第一种形式从某些输入文件中选择一个或多个流(用
-i
指定),第二种形式从复杂过滤器图表的一些输出中选择(用-filter_complex
).指定)。在第一种形式中,为输入文件中索引为的每个流创建一个输出流。如果流说明符被指定,则仅使用与说明符匹配的流(参见流说明符部分以获得流说明符的语法)。
-
-
字符添加在流标识符前面会创建一个“否定”映射。它会从已创建的映射中禁用匹配流。可以在流说明符后提供可选的视图说明符,对于多视图视频,指定要使用的视图。视图说明符可以具有以下格式之一:
- view:视图ID
按ID选择视图;视图ID可以设置为“所有”以将所有视图交织成一个流使用;
- vidx:视图索引
按索引选择视图;例如,0是基本视图,1是第一个非基本视图,以此类推。
- vpos:位置
按显示位置选择视图;位置可以是
left
或right
对于转码,默认是仅使用基本视图,即等同于
vidx:0
的操作。对于流复制,视图说明符不受支持,始终复制所有视图。在流索引后添加一个尾随的
?
将允许映射可选:如果映射未匹配到任何流,则忽略该映射而不是失败。注意:如果使用了无效的输入文件索引,例如映射指向不存在的输入,则映射仍然会失败。一种替代形式[链接标签]会将复杂过滤器图表的输出映射到输出文件(参见-filter_complex选项)。链接标签必须对应于图表中定义的一个输出链接标签。
此选项可以多次指定,每次将在输出文件中添加更多流。任何给定的输入流也可以多次映射为不同输出流的数据源,例如为了使用不同的编码选项和/或过滤器。流按照
-map
选项在命令行中出现的顺序创建到输出中。使用此选项会禁用此输出文件的默认映射。
示例:
- 映射所有内容
将第一个输入文件的所有流映射到输出:
ffmpeg -i INPUT -map 0 output
- 选择特定流
如果第一个输入文件中有两个音频流,这些流分别以0:0和0:1标识。可以使用
-map
来选择要放置在输出文件中的流。例如:ffmpeg -i INPUT -map 0:1 out.wav
将第一个输入文件中的第二个流映射到INPUT中的(单个)输出流。out.wav.
- 创建多个流
从输入文件a.mov中选择索引为2的流(由标识符0:2指定)和从另一个输入文件b.mov中索引为6的流(由标识符1:6指定),并将它们复制到输出文件中:out.mov:
ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov
- 创建多个流 2
从输入文件中选择所有视频和第三个音频流:
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:m:language:eng OUTPUT
- -ignore_unknown
在尝试复制未知类型的输入流时,如果失败,则忽略它们。
- -copy_unknown
允许复制未知类型的输入流,而不会失败。
- -map_metadata[:元数据说明符 - 输出] 输入文件名[:元数据说明符 - 输入] (输出,针对每个元数据)
从输入文件中设置下一个输出文件的元数据信息。注意:这些是文件索引(从零开始),而不是文件名。 可选的. Note that those are file indices (zero-based), not filenames. Optional 元数据输入/输出说明符参数用于指定需要复制的元数据。 元数据说明符可以具有以下形式:
- g
全局元数据,即应用于整个文件的元数据
- s[:流说明符]
逐流元数据。流说明符是一个流说明符,如流说明符章节中所述。在输入元数据说明符中,复制第一个匹配的流。在输出元数据说明符中,复制到所有匹配的流。 chapter. In an input metadata specifier, the first matching stream is copied from. In an output metadata specifier, all matching streams are copied to.
- c:章节索引
逐章节元数据。章节索引是从零开始的章节索引。
- p:程序索引
逐程序元数据。程序索引是从零开始的程序索引。
如果省略了元数据说明符,则默认为全局。
默认情况下,全局元数据从第一个输入文件复制,逐流和逐章节元数据与流/章节一起复制。这些默认映射通过创建任何相关类型的映射被禁用。可以通过负文件索引创建一个仅禁用自动复制的虚拟映射。
例如,将输入文件的第一个流的元数据复制到输出文件的全局元数据:
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 输入文件索引 (输出)
将带有索引为输入文件索引的输入文件的章节复制到下一个输出文件。如果未指定章节映射,则从第一个具有至少一个章节的输入文件复制章节。使用负文件索引可禁用任何章节复制。
- -benchmark (全局)
在编码结束时显示基准测试信息。 显示使用的实际时间、系统时间和用户时间以及最大内存消耗。 最大内存消耗并非所有系统都支持,通常在不支持时显示为0。
- -benchmark_all (全局)
在编码期间显示基准测试信息。 显示在各个步骤(音频/视频编码/解码)中使用的实际时间、系统时间和用户时间。
- -timelimit 持续时间 (全局)
在ffmpeg运行到持续时间秒的CPU用户时间后退出。
- -dump (全局)
将每个输入数据包转储到stderr。
- -hex (全局)
转储数据包时,还转储其有效载荷。
- -readrate 速度 (输入)
限制输入读取速度。
其值是一个浮点正数,表示媒体最大时长(以秒为单位),应该以一秒钟的墙钟时间进行读取。 默认值为0,表示没有对读取速度施加限制。 值
1
表示实时速度,相当于-re
.主要用于模拟捕获设备或实时输入流(例如从文件读取时)。 如果输入是实际捕获设备或实时流,则不要使用较低的值,可能会导致数据包丢失。
在输出数据包流速重要的情况下,例如实时流媒体,这非常有用。
- -re (输入)
以原生帧速率读取输入。这相当于设置
-readrate 1
.- -readrate_initial_burst 秒
设置初始读取突发时间(以秒为单位),在此时间之后-re/-readrate将被执行。
- -vsync 参数 (全局)
- -fps_mode[:流说明符] 参数 (输出,逐流)
设置视频同步方法/帧率模式。vsync适用于所有输出视频流,但可以通过设置fps_mode为某个流覆盖。vsync已被弃用,将在未来移除。
出于兼容性原因,可以将vsync的值以数字指定(如下表中的括号中显示)。
- passthrough (0)
每帧通过解复器的时间戳传递到复用器。
- cfr (1)
将复制并丢弃帧以精确达到请求的固定帧率。
- vfr (2)
帧将通过其时间戳传递或被丢弃,以防止两个帧具有相同的时间戳。
- auto (-1)
根据复用器的能力,在cfr和vfr之间选择。这是默认方法。
请注意,时间戳可以进一步由复用器修改,例如在启用avoid_negative_ts格式选项的情况下。
使用-map可以选择时间戳应从哪个流中获取。可以保留视频或音频不变,并将剩余流同步到未更改的流。
- -frame_drop_threshold 参数
帧丢弃阈值,指定视频帧的延迟量(以帧率单位衡量),超过此值时将丢弃帧。默认值为-1.1。一种可能的用例是避免因为噪声时间戳导致的帧丢失,或者提高对于精确时间戳的帧丢弃精度。
- -apad 参数 (输出,逐流)
填充输出音频流。这相当于应用
-af apad
参数是由滤镜参数构成的字符串,与apad
滤镜的构成方式相同。-shortest
必须为此输出设置此选项以生效。- -copyts
不要处理输入时间戳,而是保留其值,不尝试对其进行清理。特别是不要去除初始起始时间偏移值。
请注意,这取决于选项vsync或特定复用器处理(例如在启用avoid_negative_ts格式选项的情况下),输出时间戳可能与输入时间戳不匹配,即便选择了此选项。
- -start_at_zero
与copyts一起使用时,将输入时间戳偏移,使其从零开始。
这意味着,例如使用
-ss 50
将使输出时间戳从50秒开始,不管输入文件从何时开始。- -copytb 模式
指定流复制时如何设置编码器时间基准。模式是一个整数值,可以是以下值之一:
- 1
使用解复用器时间基准。
时间基准从对应的输入解复用器复制到输出编码器。有时需要这样做,以避免在复制具有可变帧率的视频流时出现非单调增加的时间戳。
- 0
使用解码器时间基准。
时间基准从对应的输入解码器复制到输出编码器。
- -1
尝试自动做出选择,以生成合理的输出。
默认值为-1。
- -enc_time_base[:流说明符] 时间基 (输出,每个流)
设置编码器时间基。时间基可以采用以下值之一:
- 0
根据媒体类型分配默认值。
对于视频-使用 1/帧率,对于音频-使用 1/采样率。
- demux
使用来自解复用器的时间基。
- filter
使用来自过滤器图的时间基。
- a positive number
使用提供的数字作为时间基。
此字段可以表示为两个整数的比率(例如 1:24, 1:48000)或作为小数(例如 0.04166, 2.0833e-5)。
默认值是 0。
- -bitexact (输入/输出)
启用比特精确模式以供(解)复用器和(解/编)码器使用。
- -shortest (输出)
当最短的输出流结束时完成编码。
注意,此选项可能需要缓冲帧,从而引入额外延迟。此延迟的最大量可通过
-shortest_buf_duration
选项控制。- -shortest_buf_duration 持续时间 (输出)
该
-shortest
选项可能需要缓冲潜在的大量数据,当至少一个流是“稀疏”的情况下(即帧之间有大间隙——这通常发生在字幕流中)。此选项控制缓冲帧的最大持续时间,以秒为单位。较大的值可能允许
-shortest
选项产生更准确的结果,但会增加内存使用量和延迟。默认值为 10 秒。
- -dts_delta_threshold 阈值
时间戳不连续性增量阈值,以秒的小数形式表达。
此选项启用的时间戳不连续性校正仅应用于接受时间戳不连续性的输入格式(标有
AVFMT_TS_DISCONT
标记的格式),例如 MPEG-TS 和 HLS,并在采用-copyts
选项时自动禁用(除非检测到包装)。如果检测到时间戳不连续性,其绝对值大于阈值,ffmpeg 将通过减少/增加当前 DTS 和 PTS 值来消除不连续性。
默认值为 10。
- -dts_error_threshold 阈值
时间戳错误增量阈值,以秒的小数形式表达。
此选项启用的时间戳校正仅应用于不接受时间戳不连续性的输入格式(未标有
AVFMT_TS_DISCONT
标记的格式)。如果检测到时间戳不连续性,其绝对值大于阈值,ffmpeg 将丢弃 PTS/DTS 时间戳值。
默认值是
3600*30
(30 小时),该值是任意选择的,并且非常保守。- -muxdelay 秒 (输出)
设置最大解复用-解码延迟。
- -muxpreload 秒 (输出)
设置初始解复用-解码延迟。
- -streamid 输出流索引:新值 (输出)
为输出流分配一个新的 stream-id 值。此选项应在其应用的输出文件名之前指定。在存在多个输出文件的情况下,streamid 可以被重新分配为不同的值。
例如,将流 0 的 PID 设置为 33,将流 1 的 PID 设置为 36 以用于输出 mpegts 文件:
ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts
- -bsf[:流说明符] 比特流滤波器 (输入/输出,每个流)
将比特流滤波器应用于匹配的流。这些滤波器在从解复用器接收到每个数据包时应用(作为输入选项使用时),或在发送给复用器之前应用(作为输出选项使用时)。
比特流滤波器是一个用逗号分隔的比特流滤波器说明列表,每个格式如下
滤波器[=选项名0=选项值0:选项名1=选项值1:...]
任何作为选项值一部分的 ’,=:’ 字符都需要用反斜杠进行转义。
使用
-bsfs
选项获取比特流滤波器列表。例如。
ffmpeg -bsf:v h264_mp4toannexb -i h264.mp4 -c:v copy -an out.h264
应用
h264_mp4toannexb
比特流滤波器(将 MP4 封装的 H.264 流转换为 Annex B)到输入视频流。另一方面,
ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt
应用
mov2textsub
比特流滤波器(从 MOV 字幕中提取文本)到输出字幕流。但是需要注意的是,由于两个例子都使用-c copy
,无论滤波器是在输入还是输出时应用,这个区别都不重要 —— 如果发生转码,情况将会改变。- -tag[:流说明符] 编解码标记 (输入/输出,每个流)
强制为匹配流设定标记/四字符代码。
- -timecode 小时:分钟:秒SEP帧
指定用于写入的时间码。分隔符对于非丢帧时间码是 ’:’,对于丢帧时间码是 ’;’(或 ’.’)。
ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
- -filter_complex 滤波图 (全局)
定义一个复杂的滤波图,即具有任意数量的输入和/或输出的图。对于简单图——那些具有一个输入和一个同类型输出的图——请参见-filter选项。滤波图是描述滤波图的说明,如 ffmpeg-filters 手册的“滤波图语法”部分所述。此选项可以指定多次——每次使用都会创建一个新的复杂滤波图。
复杂滤波图的输入可以来自不同的源类型,通过相应链接标签的格式区分:
- 要连接输入流,请使用
[file_index:stream_specifier]
(即与-map语法相同)。如果流说明符与多个流匹配,则使用第一个流。对于多视角视频,流说明符后可以加上视角说明符,请参阅-map选项的文档了解其语法。 - 要连接环回解码器,请使用 [dec:dec_idx],其中dec_idx是要连接到给定输入的环回解码器的索引。对于多视角视频,解码器索引后可加上视角说明符,请参阅-map选项的文档了解其语法。
- 要连接来自另一个复杂滤波图的输出,请使用其链接标签。例如,以下示例:
ffmpeg -i input.mkv \ -filter_complex '[0:v]scale=size=hd1080,split=outputs=2[for_enc][orig_scaled]' \ -c:v libx264 -map '[for_enc]' output.mkv \ -dec 0:0 \ -filter_complex '[dec:0][orig_scaled]hstack[stacked]' \ -map '[stacked]' -c:v ffv1 comparison.mkv
读取一个输入视频并
- (第 2 行)使用一个具有一个输入和两个输出的复杂滤波图将视频缩放到 1920x1080,并将结果复制到两个输出;
- (第 3 行)使用
libx264
对一个缩放后的输出进行编码并将结果写入output.mkv; - (第 4 行)使用环回解码器解码此编码流;
- (第 5 行)将环回解码器的输出(即
libx264
编码视频)与缩放后的原始输入并排排列; - (第 6 行)组合视频随后被无损编码并写入comparison.mkv.
注意,这两个滤波图不能合并为一个,因为这样会在转码管道中形成循环(滤波图输出用于编码,从那里进行解码,然后返回到相同的图中),而这种循环是不允许的。
未标记的输入将连接到匹配类型的第一个未使用输入流。
输出链接标签可用-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
作为一个特殊例外,可以使用位图字幕流作为输入:它将被转换为与文件中最大视频大小相同的视频,或者如果没有视频则为 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 也可以使用)
使用 lavfi 生成 5 秒纯红色视频
color
源:ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
- 要连接输入流,请使用
- -filter_complex_threads 线程数量 (全局)
定义处理 filter_complex 图时使用的线程数量。类似于 filter_threads,但用于
-filter_complex
图。默认值为可用的 CPU 数量。- -lavfi 滤波图 (全局)
定义一个复杂的滤波图,即具有任意数量的输入和/或输出的图,与-filter_complex.
- -accurate_seek (输入)
此选项启用或禁用带有-ss选项的输入文件的准确定位。默认情况下启用,因此在转码时定位是准确的。使用-noaccurate_seek禁用它,这可能在复制某些流并转码其他流时有用。
- -seek_timestamp (输入)
此选项启用或禁用带有-ss选项的输入文件按时间戳定位。默认情况下禁用。如果启用,传递给-ss选项的参数被视为实际时间戳,而不是文件开始时间的偏移量。这仅对未从时间戳 0 开始的文件有影响,例如传输流。
- -thread_queue_size 大小 (输入/输出)
对于输入,此选项设置从文件或设备读取时最大排队数据包数量。对于低延迟/高速率的直播流,如果未及时读取数据包,可能会被丢弃;设置此值可以强制 ffmpeg 使用单独的输入线程,并在数据包到达时立即读取它们。默认情况下,仅在指定多个输入时 ffmpeg 才会这样做。
对于输出,此选项指定每个复用线程可以排队的最大数据包数量。
- -sdp_file 文件 (全局)
将输出流的 SDP 信息打印到文件。这允许在至少一个输出不是 RTP 流时转储 SDP 信息。(要求至少一个输出格式为 RTP)。
- -discard (输入)
允许放弃特定的流或流中的帧。任何输入流都可以完全丢弃,使用值
all
而选择性地丢弃来自流的帧发生在解复用器,并不是所有解复用器都支持。- none
不丢弃任何帧。
- default
默认值,不丢弃任何帧。
- noref
丢弃所有非参考帧。
- bidir
丢弃所有双向帧。
- nokey
丢弃除关键帧之外的所有帧。
- all
丢弃所有帧。
- -abort_on 标志 (全局)
在各种条件下停止并中止。以下标志可用:
- empty_output
没有数据包传递到复用器,输出为空。
- empty_output_stream
一些输出流没有数据包传递到复用器。
- -max_error_rate (全局)
设置所有输入的解码帧失败比例,当超过该比例 ffmpeg 将返回退出代码 69。超过此阈值不会终止处理。范围是介于 0 到 1 之间的浮点数。默认值为 2/3。
- -xerror (全局)
遇到错误时停止并退出
- -max_muxing_queue_size 数据包 (输出,每个流)
转码音频和/或视频流时,ffmpeg 不会开始写入输出,直到它为每个这样的流准备一个数据包。在等待发生的同时,其他流的数据包被缓冲。此选项设置匹配输出流的数据包缓冲区大小(以数据包为单位)。
此选项的默认值应该足够高以适应大多数用途,因此只有在确定需要时才调整此选项。
- -muxing_queue_data_threshold 字节 (输出,每个流)
这是一个最低阈值,在此之前,复用队列大小不会被考虑。默认每个流为50兆字节,基于传递给复用器的分组总大小。
- -auto_conversion_filters (全局)
启用自动在所有滤镜图中插入格式转换滤镜,包括以下定义的过滤器图。-vf, -af, -filter_complex以及-lavfi如果滤镜格式协商需要转换,则滤镜的初始化将失败。转换仍然可以通过在图中插入相关的转换滤镜(如scale, aresample)来完成。默认情况下开启,如果要显式禁用,需要指定
-noauto_conversion_filters
.- -bits_per_raw_sample[:流指定符] 值 (输出,每个流)
声明给定输出流中的每个原始样本的比特数为值。请注意,此选项设置了提供给编码器/复用器的信息,并未使流符合此值。设置与流属性不匹配的值可能会导致编码失败或生成无效的输出文件。
- -stats_enc_pre[:流指定符] 路径 (输出,每个流)
- -stats_enc_post[:流指定符] 路径 (输出,每个流)
- -stats_mux_pre[:流指定符] 路径 (输出,每个流)
将匹配流的每帧编码信息写入由以下指定的文件:路径.
-stats_enc_pre在编码之前写入原始视频或音频帧信息,而-stats_enc_post写入 从编码器接收到的编码分组信息。-stats_mux_pre写入即将发送到复用器的分组信息。每个帧或分组在指定的文件中生成一行。此行的格式由以下内容控制:-stats_enc_pre_fmt / -stats_enc_post_fmt / -stats_mux_pre_fmt.
当多条流的统计数据写入一个文件时,不同流的行将交错。此交错的确切顺序未指定,且无法保证在使用相同选项运行程序时跨不同调用保持稳定。
- -stats_enc_pre_fmt[:流指定符] 格式指定符 (输出,每个流)
- -stats_enc_post_fmt[:流指定符] 格式指定符 (输出,每个流)
- -stats_mux_pre_fmt[:流指定符] 格式指定符 (输出,每个流)
用以下内容指定写入行的格式:-stats_enc_pre / -stats_enc_post / -stats_mux_pre.
格式指定符是一个字符串,可能包含以下形式的指令:{fmt}. 格式指定符是以反斜杠转义的——使用 \{、\} 和 \\ 在输出中分别写入字面上的 {、} 或 \。
通过以下设置的指令:fmt可以是以下之一:
- fidx
输出文件的索引。
- sidx
文件中输出流的索引。
- n
帧号。编码前:到目前为止发送给编码器的帧数。编码后:到目前为止从编码器接收到的分组数。 复用:到目前为止为此流提交到复用器的分组数。
- ni
输入帧号。与此输出帧或分组对应的输入帧(即由解码器输出)的索引。如果不可用则为-1。
- tb
该帧/分组时间戳表达的时间基,作为有理数num/den。注意编码器和复用器可能使用不同的时间基。
- tbi
时间基用于ptsi,作为有理数num/den。当ptsi可用时,提供以下内容:0/1如果不可用,则不提供。
- pts
帧或分组的显示时间戳,作为整数。应乘以时间基以计算显示时间。
- ptsi
输入帧的显示时间戳(见ni),作为整数。应乘以tbi以计算显示时间。当不可用时打印为(2^63 - 1 = 9223372036854775807)。
- t
帧或分组的显示时间,作为十进制数。等于pts乘以tb.
- ti
输入帧的显示时间(见ni),作为十进制数。等于ptsi乘以tbi。当不可用时打印为inf。
- dts (分组)
分组的解码时间戳,作为整数。应乘以时间基以计算显示时间。
- dt (分组)
帧或分组的解码时间,作为十进制数。等于dts乘以tb.
- sn (帧,音频)
到目前为止发送到编码器的音频样本数量。
- samp (帧,音频)
帧中的音频样本数量。
- size (分组)
编码分组的大小,以字节为单位。
- br (分组)
当前比特率,以每秒比特为单位。
- abr (分组)
到目前为止整个流的平均比特率,以每秒比特为单位。如果当前无法确定,则为-1。
- key (分组)
如果分组包含关键帧,则为字符‘K’,否则为字符‘N’。
标签为分组的指令只能用于-stats_enc_post_fmt以及-stats_mux_pre_fmt.
标签为帧的指令只能用于-stats_enc_pre_fmt.
标签为音频的指令只能用于音频流。
默认格式字符串为:
- pre-encoding
{fidx} {sidx} {n} {t}
- post-encoding
{fidx} {sidx} {n} {t}
将来,默认格式字符串的末尾可能会添加新项目。依赖格式保持完全相同的用户应手动指定。
请注意,写入同一文件的不同流的统计数据可能具有不同格式。
5.12 预设文件
一个预设文件包含一系列选项=值对,每行一个,指定一组选项,这些选项在命令行中指定会显得很困难。以哈希字符(‘#’)开头的行被忽略,可用于提供注释。检查FFmpeg源代码树中的presets目录以获取示例。
预设文件分为两种类型:ffpreset 和 avpreset 文件。
5.12.1 ffpreset 文件
ffpreset 文件通过以下选项指定:vpre
, apre
,
spre
以及fpre
选项。fpre
选项接收预设的文件名而不是预设名称作为输入,并且可用于任何类型的编解码器。对于vpre
, apre
以及spre
选项,预设文件中指定的选项应用于与预设选项类型相同的当前选定编解码器。
传递给vpre
, apre
以及spre
预设选项的参数按以下规则识别预设文件以供使用:
首先,ffmpeg 会在以下目录中搜索名为arg.ffpreset 的文件:$FFMPEG_DATADIR(如果设置),以及$HOME/.ffmpeg,以及配置时定义的数据目录(通常为PREFIX/share/ffmpeg),或者在 win32 的可执行文件旁的ffpresets文件夹中,按此顺序搜索。例如,如果参数是libvpx-1080p
,它会搜索文件:libvpx-1080p.ffpreset.
如果没有找到这样的文件,则 ffmpeg 将搜索名为codec_name-arg.ffpreset 的文件,位置同上提到的目录,其中codec_name是应用预设文件选项的编解码器名称。例如,如果您选择视频编解码器为-vcodec libvpx
并使用-vpre 1080p
,则它会搜索文件:libvpx-1080p.ffpreset.
5.12.2 avpreset 文件
avpreset 文件通过以下选项指定:pre
。它们的工作方式类似于 ffpreset 文件,但仅允许编码器特定选项。因此,选项=值对,指定编码器不能使用。
指定pre
选项时,ffmpeg 会在以下目录中按顺序查找后缀为.avpreset的文件:$AVCONV_DATADIR(如果设置)、以及$HOME/.avconv,以及配置时定义的数据目录(通常为PREFIX/share/ffmpeg)。
首先,ffmpeg 搜索名为codec_name-arg.avpreset 的文件,位置同上提到的目录,其中codec_name是应用预设文件选项的编解码器名称。例如,如果您选择视频编解码器为-vcodec libvpx
并使用-pre 1080p
,则它会搜索文件:libvpx-1080p.avpreset.
如果没有找到这样的文件,则 ffmpeg 将在相同目录中搜索名为arg.avpreset 的文件。
5.13 vstats 文件格式
以下选项启用生成包含关于生成的视频输出统计信息的文件:-vstats
以及-vstats_file
选项。
以下选项控制生成文件的格式版本:-vstats_version
选项。
对于版本1
,格式如下:
frame= 帧 q= 帧质量 PSNR= PSNR f_size= 帧大小 s_size= 流大小kB time= 时间戳 br= 比特率kbits/s avg_br= 平均比特率kbits/s
对于版本2
,格式如下:
out= 输出文件索引 st= 输出文件流索引 frame= 帧号 q= 帧质量f PSNR= PSNR f_size= 帧大小 s_size= 流大小kB time= 时间戳 br= 比特率kbits/s avg_br= 平均比特率kbits/s
每个键对应值的描述如下:
- avg_br
以千比特每秒表示的平均比特率
- br
以千比特每秒表示的比特率
- frame
编码帧数量
- out
输出文件索引
- PSNR
峰值信号噪声比
- q
帧质量
- f_size
编码分组大小,以字节表示
- s_size
流大小,以千字节表示
- st
输出文件流索引
- time
分组时间
- type
图片类型
另请参阅-stats_enc 选项查看显示编码统计信息的替代方法。
6 示例
6.1 视频和音频抓取
如果您指定输入格式和设备,则 ffmpeg 可以直接抓取视频和音频。
ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg
或者使用 ALSA 音频源(单声道输入,声卡编号为1),而不是 OSS:
ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg
请注意,您必须在启动 ffmpeg 之前通过任何电视观看工具(如xawtv由 Gerd Knorr 提供)激活正确的视频源和频道。 您还需要使用标准混音器正确设置音频录制级别。
6.2 X11 抓取
通过 ffmpeg 抓取 X11 显示,使用以下方式:
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg
0.0 是您的 X11 服务器的显示屏编号,与 DISPLAY 环境变量相同。
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg
0.0 是您的 X11 服务器的显示屏编号,与 DISPLAY 环境变量相同。10 是抓取的 x 偏移量,20 是 y 偏移量。
6.3 视频和音频文件格式转换
任何支持的文件格式和协议都可以用作 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 转为采样率为 22050 Hz 的 MPEG 音频。
- 您可以同时编码为多种格式,并定义从输入流到输出流的映射:
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 转为 64 kbits 的 a.mp2 和 128 kbits 的 b.mp2。‘-map 文件:索引’指定每个输出流使用哪个输入流,定义输出流的顺序。
- 您可以转码解密的 VOB 文件:
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,这意味着 29.97fps 输入视频每 10 秒一个内部帧。此外,音频流是 MP3 编码的,因此您需要通过传递
--enable-libmp3lame
给 configure 启用 LAME 支持。映射对 DVD 转码特别有用,以获得所需的语言音频。注意:查看支持的输入格式,请使用
ffmpeg -demuxers
. - 您可以从视频中提取图像,或从许多图像创建视频:
从视频中提取图像:
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
这将从视频中每秒提取一帧并输出到名为的文件中foo-001.jpeg, foo-002.jpeg,等。图像将被缩放以适应新的宽x高值。
如果您只想提取有限数量的帧,可以结合上述命令与
-frames:v
或-t
选项,或者与-ss组合以从某个时间点开始提取。用于从许多图像创建视频:
ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi
语法
foo-%03d.jpeg
指定使用由三个零填补的数字组成的十进制数来表示序列号。这与C语言的printf函数支持的语法相同,但仅适合接受普通整数的格式。导入图像序列时,-i还支持通过选择image2专用
-pattern_type glob
选项在内部扩展类似shell的通配符模式(globbing)。例如,从匹配通配符模式的文件名创建视频
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-all, ffplay, ffprobe, ffmpeg-utils, ffmpeg-scaler, ffmpeg-resampler, ffmpeg-codecs, ffmpeg-bitstream-filters, ffmpeg-formats, ffmpeg-devices, ffmpeg-protocols, ffmpeg-filters
作者
FFmpeg开发团队。
关于作者的详细信息,请参阅项目的Git历史(https://git.ffmpeg.org/ffmpeg),例如通过在FFmpeg源码目录中输入命令git log
,或浏览在线代码库:https://git.ffmpeg.org/ffmpeg.
特定组件的维护人员列在文件MAINTAINERS中,位于源码树中。
本文档是使用makeinfo.
托管服务由telepoint.bg 提供