ffmpeg的中文文档(一)
Posted on 23 Dec 2014 ffmpegDocuments 添加评论网上找了半天除了找到一个完成了十分之一不到的ffmpeg的中文文档之外好像什么也没有找到,隐约记得之前好像看过一次ffmpeg的文档,现在又忘得差不多了,干脆翻译一个放到这里,以供以后查阅。(文档有点篇幅需要一点时间才能完成,而且基本没有考虑用词的准确和优美性,有想优化的同学可以基于这个翻译继续进行。)
ffmpeg的文档
目录
1概要
2说明
3详细描述
3.1滤波
3.1.1简单filtergraphs
3.1.2复杂filtergraphs
3.2流复制
4流选择
5选项
5.1流符
5.2通用选项
5.3 AVOption选项
5.4主要选项
5.5视频选项
5.6高级视频选项
5.7音频选项
5.8高级音频选项
5.9字幕选项
5.10 高级字幕选项
5.11高级选项
5.12预置文件
6小贴士
7 例子
7.1预置文件
7.2视频和音频抓取
7.3 X11抓取
7.4视频和音频文件格式转换
8参见
9作者
1. 概要
ffmpeg [global_options] {[input_file_options] -i INPUT_FILE} ... {[output_file_options] OUTPUT_FILE} ...
2. 说明
ffmpeg
是一个非常快的视频和音频转换器,还可以抓取实时的音频/视频流。它可以在任意的采样率之间的转换和调整视频,并同时使用高品质的多相滤波器。
ffmpeg
从输入“文件”(其可以是常规文件,管道,网络流,录制装置等),由指定任意数量的读取-i
选项,并写入到任意数量的输出“文件”,只需指定一个输出的文件名。任何一个命令行中不能被解释为选项的内容都被认为是一个输出文件名。
每个输入或输出文件可以在原则上,包含任意数量的不同类型(视频/音频/字幕/附件/数据)的流。输出文件中允许流的数量和类型是由输出格式容器限制决定的。输入流和输出流直接的映射可以自动完成也可以用-map
选项给定(见流选择章节)。
引用输入文件的选项时,则必须使用他们的索引(从0开始)。例如:第一输入文件是0
,第二个是1
等。类似地,一个文件中的流也通过其索引指定。例如2:3
指的是在第三个输入文件中的第四数据流。参见流章节。
作为一般规则,选项作用于下一个指定的文件。因此,命令的顺序是重要,你可以在命令行上多次相同的选项。每次选项的出现都将作用于下一个输入或输出文件。这条规则若有例外将会提前声明(例如冗余级别)。
不要混合输入和输出文件。首先指定所有输入文件,那么所有的输出文件。也不要混用属于不同的文件的选项。所有选项仅适用于下一个输入或输出文件,之后选项将被重置。
设置输出文件以64千比特/秒的视频比特率:
ffmpeg -i input.avi -b:V 64K -bufsize 64K output.avi
要强制输出文件为24 fps的帧速率:
ffmpeg -i input.avi -r 24 output.avi
要强制输入文件的帧频(仅对原始格式有效),以1 FPS读入文件,以每秒24帧的帧速率输出:
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库中的滤镜处理原始的音频和视频帧。几个连接的滤镜可以形成一个滤镜组(filtergraphs)。 ffmpeg
有两种filtergraphs:简单和复杂。
3.1.1 简单filtergraphs
简单filtergraphs是那些具有相同的类型且正好一个输入和输出的滤镜组。另外,在上图中,他们可以由简单地在解码和编码之间插入附加步骤来表示:
_________ ______________
| | | |
| decoded | | encoded data |
| frames |\ _ | packets |
|_________| \ /||______________|
\ __________ /
simple _\|| | / encoder
filtergraph | filtered |/
| frames |
|__________|
简单filtergraphs配置了每个流的筛选器选项(与视频和音频分别-vf和-af别名)。一个简单的FilterGraph动态视频可以看一下这样的例子:
_______ _____________ _______ ________
| | | | | | | |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______| |_____________| |_______| |________|
需要注意的是一些滤镜改变帧属性而不是画面的内容。例如,在上例中,fps
改变帧的数量,但不触及帧的内容。又如setpts
滤镜,其仅设置时间戳而保持帧不变。
3.1.2 复杂filtergraphs
复杂filtergraphs是那些不能被描述为简单的线性处理链的滤镜组。例如,当滤镜组具有多个输入和/或输出,或当输出流的类型是不同于输入。它们可以被表示为以下图:
_________
| |
| input 0 |\ __________
|_________| \ | |
\ _________ /| output 0 |
\ | | / |__________|
_________ \| complex | /
| | | |/
| input 1 |---->| filter |\
|_________| | | \ __________
/| graph | \ | |
/ | | \| output 1 |
_________ / |_________| |__________|
| | /
| input 2 |/
|_________|
复杂filtergraphs可使用-filter_complex
选项配置。注意,此选项是全局性的,因为复杂FilterGraph,就其本质,不能明确地与单个流或文件相关联。
-lavfi
选项相当于-filter_complex
。
一个复杂FilterGraph动态的简单的例子是在overlay
滤镜,它具有两个视频输入和一个视频输出,含有一个视频重叠在另一个的上面。其对应的音频滤镜是amix
。
3.2 复制流
复制流是通过添加copy
选项到-codec
选项完成的。它使ffmpeg
对指定的流忽略解码和编码步骤,所以它只能混合和拆包。它用于改变所述容器的格式或修改容器级别的元数据是有用的。在这种情况下,可以简化为这样:
_______ ______________ ________
| | | | | |
| input | demuxer | encoded data | muxer | output |
| file | ---------> | packets | -------> | file |
|_______| |______________| |________|
由于不存在解码或编码,它是非常快,没有质量损失。然而因为许多因素的工作,它可能无法在某些情况下使用。应用滤镜显然也是不可能的,因为滤镜仅能作用在未压缩的数据上。
4 选择流
默认情况下, ffmpeg
只包含输入文件中每个类型流各一个(视频,音频,字幕),并将它们添加到每个输出文件。它选择“最好”的每一个流基于以下标准:用于视频,它选择最高分辨率的流;对于音频,它使用最多声道的流;对于字幕,它是第一个字幕流。在相同类型中,参数相等的若干流中具有最低索引的流被选择。
您可以通过-vn/-an/-sn
选项禁用其中的一些默认值。若需全手动控制,请使用-map选项,它将禁用刚才所描述的默认设置。
5 选项
所有的数值选项中,如果不另外指明,均表示接受数作为输入,其后可添加一个SI单位的字符串,例如:K
,M
,或G
。
如果i
被附加在SI单位,完整的前缀将被解释为一个单元前缀的二进制倍数,也即1024倍,而不是1000倍。追加B
可使数值增加8倍。这允许使用,例如:KB
,MiB
,G
和B
的数量后缀。
选项不带参数是布尔选项,并设置相应的值设置为true
。他们可以通过在选项前添加no
来将选项设置为false
。例如使用-nofoo
将设置名称为foo
为假。
5.1 流标识符
有些选项是按流的,例如比特率或编解码器。流标识符被用来精确地指定一个给定的选项作用于哪一个数据流(多个)。
一个标识符一般是选项名称加冒号分隔的字符串。例如-codec:a:1 ac3
包含流标识符a:1
,它匹配第二音频流。因此,将选择AC3编解码器的第二音频流。
一个标识符可以匹配多个流,这个选项将适用于所有流。比如,流标识符-b:a 128k
标识了所有的音频流。
空标识符匹配所有的流。例如, -codec copy
或-codec: copy
会复制所有的数据流而不重新编码。
流标识符的可能形式有:
stream_index
匹配与该索引对应的流。例如-threads:1 4
将设置第二个流的线程计数为4。
stream_type[:stream_index]
流类型是下列字母之一:v
为视频,a
为声音,s
为字幕,d
为数据,t
为附件。如果stream_index
给出,则它匹配该类型的索引为stream_index
的流。否则,它匹配所有这种类型的流。
p:program_id[:stream_index]
如果给定stream_index
,那其将与在与ID为 program_id
的program的stream_index
的流相匹配。否则,它将匹配在program_id
中的所有流。
#stream_id
或者 i:stream_id
按流索引逐一匹配流(如在MPEG-TS容器中的PID)。
m:key[:value]
匹配流的元数据标签中具有指定key
的流。如果value
没有给出,将匹配包含给定标签的所有流。
请注意,在ffmpeg
中,按元数据匹配仅能用于输入文件。
5.2 通用选项
这些选项当中的FF *工具共享。
-L
显示许可证。
-h, -?, -help, --help [arg]
显示帮助。一个可选参数可以被指定为打印与特定项目相关的帮助。如果没有指定参数,则只显示基本的(非高级)工具选项。
arg
的可能值是:
`long`
除了基本的工具选项外,打印高级的工具选项。
`full`
打印所有选项,包括编码器,解码器,分流器,混合器,滤镜等的共享和私有选项。
`decoder=decoder_name`
打印有关的解码器`decoder_name`的详细信息。使用`-decoders`选项来获得所有的解码器的列表。
`encoder=encoder_name`
打印有关指定编码器`encoder_name`的详细信息。使用`-encoders`选项来获得所有编码器的列表。
`demuxer=demuxer_name`
打印有关的分流器`demuxer_name`的详细信息。使用`-formats`选项来获取所有分流器和混合器的列表。
`muxer=muxer_name`
打印有关混合器`muxer_name`的详细信息。使用`-formats`选项来获取所有混合器和分流器的列表。
`filter=filter_name`
打印有关滤镜`filter_name`的详细信息。使用`-filters`选项来获得所有滤镜的列表。
-version
显示的版本。
-formats
显示可用的格式(包括设备)。
-devices
显示可用的设备。
-codecs
显示libavcodec已知的所有编解码器。
注意,整个文档中术语“解码器”更正确地称呼是比特流媒体格式(media bitstream format)。
-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 [repeat+]loglevel | -v [repeat+]loglevel
设置库使用的日志记录级别。加入repeat+
表示重复日志输出不应该被压缩到所述第一条日志和“最后的日志重复n次”线将被省略。 repeat
,也可以单独使用。如果repeat
可以单独使用,并没有预设的记录级别,默认记录级将被使用。如果给定多个日志级别参数,使用repeat
不会改变日志级别。 loglevel
是一个字符串或数字,可为以下值之一:
`quiet, -8`
保持沉默。
`panic, 0`
只显示可能导致程序崩溃的致命错误。目前没有此类错误。
`fatal, 8`
只显示致命错误。这些错误会导致进程绝对无法继续。
`error, 16`
显示所有的错误,包括那些可以修复的。
`warning, 24`
显示所有警告和错误。将显示任何有关可能不正确或不正常事件的信息。
`info, 32`
显示处理过程中的信息。不单单是警告和错误。这是默认值。
`verbose, 40`
与info类似 ,但更详细。
`debug, 48`
显示一切信息,包括调试信息。
默认情况下,程序日志输出到标准错误流,如果终端支持着色,颜色用来标记错误和警告。日志着色可以被环境变量AV_LOG_FORCE_NOCOLOR或NO_COLOR ,或者可以被强制设置环境变量AV_LOG_FORCE_COLOR 禁用。使用环境变量NO_COLOR已被弃用,并在之后的FFmpeg的版本将被丢弃。
-report
转储完整的命令行和控制台输出到当前目录一个文件名 为program - YYYYMMDD - HHMMSS .log
的文件。此文件对于错误报告非常有用。这也意味着-loglevel verbose
。
将环境变量设置FFREPORT
为任何值具有相同的效果。如果该值是一个’:’ - 分隔键=值序列,这些选项会影响报表;如果包含特殊字符则需要使用转义字符,或者“:”分隔(参见的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 (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’
‘xop’
‘fma4’
‘3dnow’
‘3dnowext’
‘cmov’
`ARM`
‘armv5te’
‘armv6’
‘armv6t2’
‘vfp’
‘vfpv3’
‘neon’
‘PowerPC’
‘altivec’
`Specific Processors`
‘pentium2’
‘pentium3’
‘pentium4’
‘k6’
‘k62’
‘athlon’
‘athlonxp’
‘k8’
-opencl_bench
测试所有可用的OpenCL设备并显示结果。此选项仅当FFmpeg含有–enable-opencl 编译时可用。
-opencl_options options (global)
设置的OpenCL环境选项。此选项仅当FFmpeg的已编译–enable-opencl 。
options必须是冒号分隔的key = value选项对。参见ffmpeg-utils的手册中的“OpenCL的选项”部分的内容。
5.3 AVOption选项
由于内容长度过长,之后的内容将新开文章,点此查看第二部分。