ffmpeg的总体认识
栏目:综合技术时间:2016-07-20 08:31:27
1 概要
ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_options] output_file} ...
ffmpeg [全局选项] {[输入文件的选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...
2 描写
ffmpeg 是1个非常快速的音视频转换器,还能够从实时的音视频流源中获得音视频。它还能在任意的采样率之间转化,
调剂用高质量的多相滤波器的实时视频。
ffmpeg 从任意数量的输入“文件”(多是普通文件,管道,网络流,抓取装备等等)中读取信息,由-i选项指定输入文件。
然后写入到任意数量的输出“文件”中。输出“文件”由普通的文件名称设定。在命令行中的任何内容,如果不能被解析成选项,
就认为它是输出文件。
每一个输入或输出文件,原则上,都能包括任意数量不同类型的流(视频、音频、字幕、附件、数据).
流的数量和类型,可能被容器的格式所限制。从输入当选择哪一个流,然后输送到哪一个输出,要末是被自动指定,要末使用-map选项(参照流选择章节)。
在选项中援用输入文件,你必须用它们的索引符(从0开始)。例如,第1个输入文件是0,第2个是1,等等。类似地,文件中的流被也它们的索引符所援用。
例如,2:3 援用的是第3个输入文件中的第4个流。一样参照流设定章节。
依照1般规律,选项被利用在下1个指定文件上。因此顺序非常重要,相同选项可以在1个命令行中出现屡次。每次出现被利用到下1个输入或输出文件上。
全局选项(例如,详细级别)例外于这个规律,它应当首选被设置。
不要混淆输入和输出文件 -- 首先设定所有的输入文件,然后设定所有的输出文件。也不能混淆属于不同文件的选项。所有的选项只能被利用到下1个输入或
输出文件,并且在文件之间被重置。
-------------------------------------------------------------------
设置输出文件的比特率为64kbit/s
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
-------------------------------------------------------------------
强迫输出文件的帧率为24fps
ffmpeg -i input.avi -r 24 output.avi
-------------------------------------------------------------------
强迫输入文件的帧率为1fps(仅用于原始格式),并且输出文件的帧率设置为24fps
ffmpeg -r 1 -i input.m2v -r 24 output.avi
这样的选项可能被用于原始输入文件。
-------------------------------------------------------------------
3 详细描写:
每一个输出的ffmpeg 的转码进程能被下面的图片描写:
ffmpeg 调用 libavformat 库(包括demuxers) 去读取输入文件,并且获得包括编码数据的数据包。当有多个输入文件的时候,ffmpeg尽力去保持它们
同步,通过跟踪最慢的时间戳的任何激活状态的数据流。
然后,被编码的数据包被传送到解码器(除非流复制被指定到流,参照后续近1步描写).解码器产生未紧缩的帧(原始视频/PCM 音频等)能够近1步被
过滤器(参照下1节)处理。过滤以后,这些帧被传送到编码器,把它们编码并且输出编码数据包。
3.1 过滤器
在编码之前,ffmpeg 能通过libavfilter库里面的过滤器处理原始音频和视频帧。几个链式过滤器组成的过滤图。ffmpeg 在两种类型的过滤图simple
和complex中进行辨别。
3.1.1 简单过滤图
简单过滤图是那些唯一1个输入和输出,两个是相同类型。上面的图形,在编码和解码之间,插入1个步骤,它们就可以表示简单过滤图。
简单过滤图用 流选项 -filter 配置 (用 -vf 和-af 相应作为视频和音频的别名)。1个简单的视频的过滤图作为1个举例,正如这样的:
_______ _____________ _______ ________
| | | | | | |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______| |_____________| |_______| |________|
注意有些过滤器改变帧的属性,但是不改变帧的内容。例如,fps帧过滤器在上面的例子中改变帧数量,但不会碰触帧内容。另外1个例子是setpts过滤器,
它仅设置时间戳,并且,另外传递不加以改变的帧。
3.1.2 Complex 过滤图
Complex 过滤图不能被描写为1个利用于1个流的简单的线性处理链。情形是这样的,例如,当过滤图有多于1个的输入或输出,或当输出流的类型不同于
输入流的时候。它们能用下面的图形来表示:
Complex 过滤图 通过 -filter_complex 选项配置。注意,这个选项是全局的。由于1个complex过滤链,由于它的本质,不可能与1个单1的流或文件相干联。
-lavfi 选项,同等于-filter_complex.
1个寻常的 complex过滤链图的例子是 overlay 过滤器。它有两个视频输入和1个视频输出,它包括1个视频的覆盖在另外一个的上面。同理于音频的overlay 过滤器是
amix 过滤器。
3.2 流复制
流复制是1个模式,它提供复制过的参数给-codec 选项。它使得 ffmpeg 丢掉对1个流解码和编码的步骤,因此它只做解复用和多路复用。它是很有用的,对改变容器
的格式或修改容器级的元数据。上面的图形在这类情形下,简化成这样:
由于没有解码或编码,这个进程是非常快,并且也没有质量的消耗。但是,在1些情况下,它可能不工作,可能缘由也比较多。用过滤器明显也是不可能的,由于过滤器是
工作在没有紧缩的数据。
4 流选择
默许情况下,ffmpeg 包括每种类型的1个流(视频,音频,字幕),它出现在输入文件中,并且把流加入到每一个输出文件。它选择最好的标准:对视频,它是最高分辨率的流。
对音频,它是最多通道的流。对字幕,它是第1个字幕流。在几个相同类型流速相等的流,以最低指数作为选择。
你能关闭那些默许选项,通过用 -vn/-an/-sn. 对全手动控制,用 -map 选项,它能关闭刚刚描写的默许选项。
5 选项
所有的数字类选项,如果不是另有规定,接受1个字符串表示1个数字,作为输入,它可能后边随着1个国际单位前缀,例如,'K', 'M', 'G'.
如果 'i' 作为国际单位前缀,那末完全的前缀被解释成基于1024进制的单位,而不是1000进制。
增加 'B' 作为单位前缀,则要把值乘以8. 就能够这样使用,例如,'KB', 'MiB', 'G' 和'B'作为数字后缀。
没有带参数的选项是布尔选项,并且设置相应的值为真。
它们能被设置成假,通过给选项增加前缀'no'. 例如,用'-nofoo' 将要设置'foo'名字的布尔选项为假。
5.1 流设定
1些选项是利用于每一个流的,例如,比特率或编码。流设定被用于,严格制定1个给出的选项是属于哪一个流的。
1个流的设定是1个字符串,它通常附加到这个选项名并且被1个冒号分开。例如,'-codec:a:1 ac3' 包括a:1设定,它匹配第2个音频流。 因此,它会为第2个音频流选择 ac3 编码。
1个流设定,能匹配好几个流,因此,这个选项可以利用到它们所有的流。例如,流设定,-b:a 128k 匹配所有的音频流。
1个空的流设定,匹配所有的流。例如,-codec copy 或 -codec: copy 会复制所有的流,而没有重新编码。
可能情势的流设定是:
stream_index
匹配基于该索引号stream_index的流。例如,-threads:1 4 会设置第2个流的线程的数量为4。
stream_type[:stream_index]
stream_type 是下面的1种:'v'表示视频,'a'表示音频,'s'表示字幕,'d' 表示数据,还有't'标示附件。如果stream_index被给出,那末它匹配给定类型,给定索引号的流。否则,
它就匹配所有这类类型的流。
p:program_id[:stream_index]
如果流索引号被给出,那末它匹配具有该流索引号,并且具有该进程id。否则,它匹配进程中的所有流。
#stream_id or i:stream_id
通过流id匹配流(例如,在MPEG-TS 容器里的 PID)。
m:key[:value]
匹配带元数据标签键值有指定值的流。如果值没有被给出,则匹配包括该标签是任意值的流。
注意在 ffmpeg中,通过元数据匹配只会在输入文件中,工作正常。
5.2 通用选项
这些选项在以ff*开头的工具中是同享通用的。
-L
显示许可证.
-h, -?, -help, --help [arg]
显示帮助。1个可选参数可以指定显示1个特定的条目。如果没有参数被指定,只显示基础的(非高级)的工具选项。
可能的参数值是:
long
除基本工具选项之外,输出高级工具选项
full
输出完全的选项列表,包括编码、解码、解复用、多路复用,过滤器等同享的和私有的选项。
decoder=decoder_name
输出详细信息,关于名称为decoder_name的解码器。用-decoders选项来获得所有解码器的1个列表。
encoder=encoder_name
输出详细信息,关于名称为encoder_name的编码器。用-encoders选项来获得所有编码器的1个列表。
demuxer=demuxer_name
输出相信信息,关于名称为demuxer_name的解复用器。用-formats选项来获得所有解复用器和多路复用器的1个列表。
muxer=muxer_name
输出详细信息,关于名称为muxer_name的多复用器。用-formats选项来获得所有的解复用器和多复用器的1个列表。
filter=filter_name
输出详细信息,关于名称为filter_name的过滤器。用-filters选项来获得所有过滤器的1个列表。
-version
显示版本号。
-formats
显示可用的格式(包括装备)
-devices
显示可用装备。
-codecs
显示所有被libavcodec知道的编码。
注意,条目'codec'作为1个简称被用于这份文档,更加正确的,应当被叫做媒体比特流格式。
-decoders
显示可用的解码器。
-encoders
显示所有可用的编码器。
-bsfs
显示可用的比特流过滤器。
-protocols
显示可用的协议。
-filters
显示可用的 libavfilter 过滤器。
-pix_fmts
显示可用的像素格式。
-sample_fmts
显示可用的采样格式。
-layouts
显示通道名和标准通道层。
-colors
显示被认可的的色彩名称。
-sources device[,opt1=val1[,opt2=val2]...]
显示输入装备的自动检测源。1些装备可能提供基于系统的源名称,它不能被自动检测。返回的列表不能被假定总是完全的。
-------------------------------------------------
ffmpeg -sources pulse,server=192.168.0.4
-------------------------------------------------
-sinks device[,opt1=val1[,opt2=val2]...]
显示输出装备的自动检测链接。1些装备可能提供基于系统的链接名称,它不能被自动检测。返回列表不能被假定总是完全的。
-------------------------------------------------
ffmpeg -sinks pulse,server=192.168.0.4
-------------------------------------------------
-loglevel [repeat+]loglevel | -v [repeat+]loglevel
设置被库利用的记录日志的级别。添加'repeat+'表示重复的日志输出,不应当被紧缩成第1行和'最后1行信息重复了n次' ,不会丢掉重复的行。
'repeat' 也能单独使用。
如果单独使用'repeat',并且没有用优先级日志级别集,那末,默许的日志级别讲被使用。
如果多个日志级别参数被给出,使用'repeat'不会改变日志级别。
日志级别是1个数字或包括1个下面值的1个字符串:
‘quiet’
甚么都不显示,处于安静状态。
‘panic’
仅显示致命毛病,它可能致使进程崩溃,例如,断言毛病。现在没有用。
‘fatal’
仅仅显示致命毛病,出现这些毛病以后,程序绝对不能继续运行。
‘error’
显示所有的毛病,包括那些能够被恢复的。
‘warning’
显示所有的正告和毛病。所有的关于多是不正确或意外的事件信息都被显示。
‘info’
显示信息的处理进程。这些信息包括正告和毛病。这是默许的值。
‘verbose’
除更详细之外,跟info相同。
‘debug’
显示任何东西,包括调试信息。
默许情况下,程序把日志记入stderr, 如果中断支持色彩,色彩别用于标记毛病和正告。
日志色彩可能被设置的环境变量AV_LOG_FORCE_NOCOLOR 或 NO_COLOR取消,或能被强迫设置成AV_LOG_FORCE_COLOR环境变量值。
环境变量NO_COLOR使用已过时,并被下边版本的FFmpeg抛弃了。
-report
复制完全的命令行和终端输出到当前目录的1个文件命名为program-YYYYMMDD-HHMMSS.log。
该文件对bug报告是有用的。它也实现了 -loglevel 细节。
设置环境变量FFREPORT为任何值有一样的效果。如果该值是1个以 ':' 分割的键值序列,这些选项会影响报告。
选项值必须被转义,如果他们包括特定字符或选项分隔符':' (参照位于ffmpeg-utils手册的'援用和转义'部份).
下边选项可以被辨认的:
file
设置用来报告的文件名称; %p被替换为程序名, %t 被替换成时间戳, %% 被替换成普通的%。
level
设置日志级别。
Errors in parsing the environment variable are not fatal, and will not appear in the report.
分析环境变量的毛病不是致命的,就不会出现在报告中。
-hide_banner
隐藏显示面板。
所有的 FFmpeg 工具会正常显示1个版权通知,创建选项和库版本。这个选项能用来隐藏显示这些信息。
-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编译时是可用的。选项必须是1个被':'分开的键值的列表。
参照ffmpeg-utils工具手册的'OpenCL Options'部份,以获得支持选项的列表。
5.3 AV选项
这些选项被libavformat, libavdevice 和 libavcodec库直接提供。用-help选项去参照可用的AV选项的列表。它们被分成两类:
generic
这些选项能被设置用于任何容器,编码和装备。Generic 选项在容器/装备的AVFormatContext选项和编码的AVCodecContext选项被列出。
private
这些选项被设定用于给出的容器,装备或编码。Private选项在相应的容器/装备/编码下被列出。
例如,写1个ID3v2.3的头到1个mp3文件,使用MP3 复用器的 id3v2_version的私有选项,不用默许的 ID3v2.4:
--------------------------------------------------------------
ffmpeg -i input.flac -id3v2_version 3 out.mp3
--------------------------------------------------------------
所有的编码AV选项,是每一个流,因此,1个流指定器应当附加到它们。
注意:-nooption语法不能被用于波尔 AV选项,使用-option 0/-option 1.
注意:老的没有文档化的指定流AV选项的方法,通过增加前缀v/a/s到选项名称,现在正在观测中,且很快就会被删除。
5.4 主选项
-f fmt (input/output)
强迫设置输入或输出文件格式。该格式通常对输入文件自动检测,且根据文件扩大猜想输出文件格式,因此这个选项大部份情况下不需要。
-i filename (input)
输入文件名称。
-y (global)
重写输出文件没有确认提示。
-n (global)
不重写输出文件,且如果1个指定的输出文件已存在,则立即退出。
-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)
为1个或多个流选择1个编码器 (当用在输出文件之前)或1个解码器(当用在输入文件之前)。codec是解码器或编码器的名字或是1个特殊值copy(只对输出)去表示该流没有被重新编码。
--------------------------------------------------------------
例如,
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
用libx264编码所有的视频流,且copy所有的音频流。
--------------------------------------------------------------
For each stream, the last matching c option is applied, so
对每一个流,最后匹配 c 选项。因此:
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
会copy所有的流,除第2个视频,它会被libx264编码,还要除第138个音频,它会被libvorbis编码。
--------------------------------------------------------------
-t duration (input/output)
当用作1个输入选项(在-i之前),限制从输入文件读取的时间间隔。当用作1个输出选项(在输出文件名之前),停止写入,直到时间到达设定间隔。
duration 可以是基于秒的整数,或以hh:mm:ss[.xxx]的情势。
-to 和 -t 是相互排挤的,且-t有优先权。
-to position (output)
在position位置,停止写入。该位置可以是1个表示秒数的数字或以hh:mm:ss[.xxx]的情势。
-to 和 -t 是相互排挤的,且-t有优先权。
-fs limit_size (output)
设置文件大小限制,数字表示多少字节。
-ss position (input/output)
当用作输出选项(在-i之前),在输入文件中定位position.注意对大多数格式,是不可能精肯定位的,因此,ffmpeg 会定位到距离position最近的点。
当转码且启用-accurate_seek(默许), 这些位于定位点和定位位置之间额外的段将被解码和抛弃。
当作流copy或当使用-noaccurate_seek选项时,这些段会被保存。
当用作1个输出选项(在输出文件名之前),解码但是抛弃输入直到时间戳到达设定位置。
位置可以用秒数或以hh:mm:ss[.xxx]的格式。
-itsoffset offset (input)
设置输入文件时间偏移。
该偏移必须是1个指定时间段,参照(ffmpeg-utils)ffmpeg-utils手册的时间段部份。
该偏移被追加到输入文件的时间戳。
设置1个位置偏移意味着,相应的流被延迟偏移1定时间。
-timestamp date (output)
设置容器的记录时间戳。
日期必须是1个指定的时间段,参照(ffmpeg-utils)ffmpeg-utils手册的时间段部份。
-metadata[:metadata_specifier] key=value (output,per-metadata)
设置1个元数据 键值对。
1个可选的metadata_specifier 可以被给出去设置基于流或章节的元数据. 参照-map_metadata文档中的细节部份。
这个选项重写元数据集,通过-map_metadata选项. 它还可能删除元数据,通过1个空的值。
------------------------------------------------------------------------
例如,设定1个标题在输出文件中:
ffmpeg -i in.avi -metadata title="my title" out.flv
------------------------------------------------------------------------
设置第1个音频流的语言:
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
------------------------------------------------------------------------
-target type (output)
指定目标文件类型(vcd,svcd,dvd,dv,dv50).
类型可以用pal-, ntsc- or -film前缀,以利用相应的标准。
所有的格式选项(比特率,编码,缓存大小)被自动设置。
------------------------------------------------------------------------
你能够唆使输入:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
------------------------------------------------------------------------
不过,你可以指定另外的选项,只要你知道他们不于相应的标准冲突,比如:
ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
------------------------------------------------------------------------
-dframes number (output)
设置输出的数据帧数。这是1个-frames:d的别名。
-frames[:stream_specifier] framecount (output,per-stream)
framecount数以后,停止写入1个流。
-q[:stream_specifier] q (output,per-stream)
-qscale[:stream_specifier] q (output,per-stream)
使用固定的质量表(VBR).q/qscale是基于编码的。
如果qscale没有用在1个流设定,那末它只利用于视频流。当没有stream_specifier被使用时,为两个不同的编码指定相投的编码值,是由于通常音频和视频没成心图。
这是为了兼容之前的行动。
-filter[:stream_specifier] filtergraph (output,per-stream)
创建过滤图链,且使用它过滤该流。
过滤图是1个利用到流的过滤图的描写。并且必须有1个输入和1个相同类型流的输出。
在过滤图中,输入输入被关联到输入标签,输出被关联到输出标签。
参照ffmpeg-filters手册获得更多关于过滤图语法的信息。
参照-filter_complex选项,如果你想用多个输入或输出去创建过滤图。
-filter_script[:stream_specifier] filename (output,per-stream)
这个选项类似于-filter,唯一的不同是它的参数是文件名, 从该文件中读取1个过滤图描写符。
-pre[:stream_specifier] preset_name (output,per-stream)
设定预设的匹配流。
-stats (global)
输出编码进程/状态。
它默许是开启的,如果关闭她,你必须指定-nostats.
-progress url (global)
发送程序友进程信息到url。
进度信息在编码进程1结束就写1次,大约是每两秒钟。
它由"键=值"行组成。键包括数字和字母。
1个处理进程信息序列最后1个键总是"progress".
-stdin
开启标准输入交互。
除非标准输入用作输入,否则,默许是开启状态。如果显式禁用互动,你需要指定- nostdin。
关闭标准输入的交互是有用的,比如,如果ffmpeg是后台进程组。
Roughly the same result can be achieved with ffmpeg ... < /dev/null but it requires a shell.
用ffmpeg可以到达大致相同的效果... < /dev/null 但是,它要求1个shell。
-debug_ts (global)
输出时间戳信息。
它默许是关闭的。
对想测试和调试,这个选项是最有用的。它的输出格式可能在不同的版本之间变化。因此,它不应当被部署成可移植的脚本。
一样可以参照-fdebug ts。
-attach filename (output)
附加1个附件到输出文件。
它支持1些像Matroska1样的格式,例如,被用于渲染字幕的字体。
附件被作为1个特定类型的流实现,因此,这个选项会增加1个新的流到文件。
通常这个流使用用于每一个流的选项,是可能的。
通过这个选项创建的附件流会再所有其他的流创建完成以后创建(例如,那些用-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)
提取匹配的附件流到1个名叫filename的文件。
如果文件名为空,那末文件名元数据标签的值会被用到。
--------------------------------------------------------------------------------------------------
例如,提取第1个附件流到1个名叫'out.ttf'的文件中:
ffmpeg -dump_attachment:t:0 out.ttf -i INPUT
--------------------------------------------------------------------------------------------------
提取所有附件到被文件名标签指定的文件中。
ffmpeg -dump_attachment:t "" -i INPUT
--------------------------------------------------------------------------------------------------
技术说明,附件作为额外编码实现,因此,这个选项能实际被用于从任何流中提取额外数据,不单单是从附件中。
--------------------------------------------------------------------------------------------------*************************
5.5 视频选项
-vframes number (output)
设置输出的视频帧数量。这个是-frames:v的别名。
-r[:stream_specifier] fps (input/output,per-stream)
设置帧率(HZ值,分数或缩写).
作为1个输入选项,疏忽存储在文件中的任什么时候间戳,并且,产生时间戳,假定恒定的帧率fps。这不同于被用于1些输入格式的-framerate 选项,像image2或v4l2(它在过去的老版本的FFmpeg中是相同的)。
如果存在疑问,使用-framerate而不是输入选项 -r.
作为1个输出选项,复制或抛弃帧来实现恒定的输出帧帧率fps.
-s[:stream_specifier] size (input/output,per-stream)
设置帧大小。
作为1个输入选项,这是1个视频大小私有选项的快捷方式,被1些解复用器所辨认。帧大小也不被存储在文件,也是不可配置的。例如,原始的视频和音频抓取器。
作为1个输出选项,这将大藐视频滤波器插入到的相应过滤图的结束。
请直接使用尺度滤波器插入到它的开头或其他地方。
The format is ‘wxh’ (default - same as source).
-aspect[:stream_specifier] aspect (output,per-stream)
设置指定的显示比例。
aspect可以是浮点数字的字符串,或1个字符串的比值,比值分别是纵横比的份子和分母。
For example "4:3", "16:9", "1.3333", and "1.7777" are valid argument values.
如果和-vcodec copy1起用,虽然它会影响存储在容器级别的纵横比,但,如果编码帧里存在纵横比,则不会影响。
-vn (output)
关闭视频录制。
-vcodec codec (output)
设置视频编码。这是-codec:v的1个别名。
-pass[:stream_specifier] n (output,per-stream)
选择路数(1或2):
它被用做两路视频编码。视频的状态被记录在第1路,记录进1个日志文件(一样参照-passlogfile选项),并且在第2路,日志文件在精确要求的比特率,被用来产生视频。
对1路,你可以仅停用音频并且设置输出为空。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)
设置两路日志文件命名。默许的文件名前缀是'ffmpeg2pass'.
完全的文件名会是PREFIX-N.log,这里N是1个指定输出流的1个数字。
-vf filtergraph (output)
创建被指定的过滤图,并且用它过滤流。这是-filter:v的1个别名。参照-filter选项。
5.6 高级视频选项
-pix_fmt[:stream_specifier] format (input/output,per-stream)
设置像素格式。
用-pix_fmts显示所有支持的像素格式。
如果被选的像素格式是不可被选择的,ffmpeg会显示1个正告,并且选择被编码器支持的最好的像素格式。
如果pix_fmt被加上前缀a+, 如果,要求的像素格式不可被选择,ffmpeg会带1个毛病退出,并且,内部过滤图的自动转化被关闭。
如果pix_fmt只有1个+, ffmpeg 选择相同的像素格式,作为输入(或图象输出)并且关闭自动转化。
-sws_flags flags (input/output)
设置SwScaler标志。
-vdt n
抛弃阀值。
-rc_override[:stream_specifier] override (output,per-stream)
速率控制,覆盖指定的时间间隔,以'逗号分隔的int,int,int'列表格式。
前两个值是开始和结束的帧号,最后1个如果是整数,表示用量。如果是负数表示品质因素。
-ilme
强迫交织支持编码(唯一MPEG⑵ 和 MPEG⑷)
如果你输入文件是交错的,你想保存交错格式的最小损失,使用此选项。
另外一种方法是用-deinterlace把输入流与分离,但损失了技术介绍。
-psnr
计算紧缩的帧PSNR。
-vstats
备份视频编码状态到vstats_HHMMSS.log。
-vstats_file file
备份视频编码状态到文件中。
-top[:stream_specifier] n (output,per-stream)
top=1/bottom=0/auto=⑴ field first
-dc precision
Intra_dc_precision.
-vtag fourcc/tag (output)
强迫视频 tag/fourcc.这是-tag:v的1个别名。
-qphist (global)
显示 QP 直方图。
-vbsf bitstream_filter
已过期,参照-bsf.
-force_key_frames[:stream_specifier] time[,time...] (output,per-stream)
-force_key_frames[:stream_specifier] expr:expr (output,per-stream)
在指定的时间戳强迫关键帧,更确切的说,在每一个指定时间的第1个帧。
如果参数带前缀expr:,这个字符串expr被解释像1个表达式且是针对每一个帧赋值。
1个关键帧是被强迫的,以避免赋值是非零的。
如果1个时间是"chapters[delta]",它被扩大成在1个文件所有章节的开始处,被delta转换,做为几秒钟的时间来标示。
该选项能被用于确保1个寻求点出现在1个章节或在输出文件任何被设计的地方。
例如,在5分钟内,插入1个关键帧。在每章开始前0.1秒增加1个关键帧。
-force_key_frames 0:05:00,chapters-0.1
表达式可以包括以下常量:
n
当前处理帧的编号,从0开始。
n_forced
强迫帧的编号。
prev_forced_n
之前强迫帧的数量,如果没有关键帧被强迫,它是NAN
prev_forced_t
之前强迫帧的时间,如果没有关键帧被强迫,它是NAN
t
当前处理帧的时间。
例如,每5秒强迫1个关键帧,你能设置:
-force_key_frames expr:gte(t,n_forced*5)
在上次最后1个关键帧以后,强迫1个关键帧5秒,从13秒开始:
-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))
请注意,迫使许多关键帧对编码器的前瞻算法是非常有害的:
用fixed-GOP或相似的选项会更有效力。
-copyinkf[:stream_specifier] (output,per-stream)
当作流复制,副本刚开始也不会出现关键帧。
-hwaccel[:stream_specifier] hwaccel (input,per-stream)
使用硬件加速解码匹配流(S)。允许的hwaccel值是:
none
不做硬件加速(默许)。
auto
自动选择硬件加速方法。
vda
用苹果VDA硬件加速。
vdpau
用VDPAU(视频解码和为Unix介绍API)硬件加速。
dxva2
用DXVA2(DirectX 视频加速)硬件加速。
如果选择的hwaccel是不可用的或不被选择的解码器所支持的,这个选项没有任何影响。
注意,大多数的加速方法目的在于回放,并且不会比在现在CPU上软件解码速度快。
另外,ffmpeg将通常需要从GPU存储器的解码的帧复制到系统内存,致使进1步的性能损失。
该选项因此主要用于测试。
-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream)
选择1个装备用于硬件加速。这个选项仅当-hwaccel 也被指定时才成心义。它的精确意义取决于特定硬件加速方法的选择上。
vdpau
对VDPAU,该选项指定了使用X11 显示/屏幕。如果该选项没有指定,就使用环境变量DISPLAY的值。
dxva2
对DXVA2, 该选项应当包括使用的显示适配器的数目。
如果该选项没有指定,使用默许的适配器。
5.7 音频选项
-aframes number (output)
设置输出的音频帧数目。它是-frames:a的1个简写。
-ar[:stream_specifier] freq (input/output,per-stream)
设置音频采样频率。输出流,默许被设置成相应的输入流的频率。对输入流,该选项仅仅对音频获得装备、元数据解复用器成心义。并且被映照到相应的解复用选项。
-aq q (output)
设置音频质量(codec-specific, VBR).这是-q:a选项的别名。
-ac[:stream_specifier] channels (input/output,per-stream)
设置音频通道的编码。
对输出流,它默许被设置成输入音频通道的数量。
设置音频采样频率。输出流,默许被设置成相应的输入流的频率。对输入流,该选项仅仅对音频获得装备、元数据解复用器成心义。并且被映照到相应的解复用选项。
-an (output)
关闭音频记录。
-acodec codec (input/output)
设置音频编码。该选项是-codec:a的简称。
-sample_fmt[:stream_specifier] sample_fmt (output,per-stream)
设置音频采样格式。
用-sample_fmts获得所支持的采样格式列表。
-af filtergraph (output)
创建过指定的过滤图,用过滤数据流。
这是-filter:a的别名,参照-filter选项。
5.8 高级音频选项
-atag fourcc/tag (output)
强迫音频 tag/fourcc。该选项是-tag:a的别名。
-absf bitstream_filter
已被废弃,参照-bsf。
-guess_layout_max channels (input,per-stream)
如果1些输入通道层是不辨认的,仅在如果它相当于指定的通道数,它会尝试着猜想。
例如,2告知ffmpeg去辨认1通道作为单声道,且2通道作为立体声,但不是6通道作为5.1.
默许总是试图猜想。
使用0禁用所有的猜想。
5.9 字幕选项
-scodec codec (input/output)
设置字幕编码,它是-codec:s的别名。
-sn (output)
禁用字幕记录。
-sbsf bitstream_filter
过时选项,参照-bsf
5.10 高级字幕选项
-fix_sub_duration
固定字幕延续时间。
对没个字幕,在相同的流中等待下1个包,且调剂第1时间以免堆叠。
在1些字幕编码特别是DVB字幕时,这是必须的。由于,在原始数据包的时间只是1个粗略的估计,并且,最后实际上是由1个空的字幕帧标记。
不使用此选项,在必要的时候可以致使夸大的延续时间或由于非单调的时间戳致使复用的失败。
注意,该选项会延迟所有数据的输出,直到下1个字幕包被解码:它可以大大增加内存消耗和延迟。
-canvas_size size
设置被用于渲染字幕的画布大小。
5.11 高级选项
-map [-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]] | [linklabel] (output)
指定1个或更多的作为1个输出文件源的输入流。
每一个输入流通过输入文件索引input_file_id和输入流索引input_stream_id辨认。
两个标示符都是从0开始的。如果被指定,sync_file_id:stream_specifier 设置哪一个输入流被用作1个预设同步援用。
第1个-map选项在命令行指定了输出流0的输入源,第2个-map选项指定了输出流1的输入源,等等。
在流标示符之前的1个 - 字符创建1个'负'的映照。
它禁用了从已创建的映照匹配流。
另外一个[LinkLabel]情势,会从复杂过滤图映照输出(参见-filter_complex选项)到输出文件。
LinkLabel必须对应1个定义的图中的输出链接标签。
例如,从第1个输入文件映照所有的流到输出。
ffmpeg -i INPUT -map 0 output
例如,如果在第1个输入文件,你有两个音频流,这些流被 "0:0" 和 "0:1"辨认.
你能用-map选择哪一个流被丢在输出文件。例如:
ffmpeg -i INPUT -map 0:1 out.wav
会把 在INPUT 被"0:1"标示的输入流映照到在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
从1个输入文件中,选择所有的视频和第3方音频流。
ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT
映照除第2个音频流以外的所有流,可以使用负的映照。
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
挑选英文音频流:
ffmpeg -i INPUT -map 0:m:language:eng OUTPUT
注意使用该选项禁用了该输出文件的默许映照。
-map_channel [input_file_id.stream_specifier.channel_id|⑴][:output_file_id.stream_specifier]
从头1个给出的输入映照1个音频通道到输出。
如果output_file_id.stream_specifier没有设置,音频通道会被映照到所有的音频流。
使用'⑴'替换input_file_id.stream_specifier.channel_id 会映照1个柔和的通道。
例如,假定INPUT是1个立体声音频文件,你可以用下面的命令开关的两个音频通道:
ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT
如果你想第1个通道静音,保存第2个通道工作:
ffmpeg -i INPUT -map_channel ⑴ -map_channel 0.0.1 OUTPUT
"-map_channel" 选项的顺序唆使了在输出流中通道的顺序。
输出通道层,被根据输入被映照通道数猜想(如果'-map_channel',则是单声道,如果是两个,则是立体声,等等。)
组合使用'-map_channel'和'-ac',使得通道抓取级别被更新,如果输入和输出通道不匹配。(例如,两个'-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
下面的示例将1个立体声输入通道分隔成两个流,这是放在同1输出文件:
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”选择多个输入音频通道中包括的不同的流(从相同或不同的文件)并将它们合并成1个单1的输出流。
因此,目前不可能,例如,把两个独立的单流到1个单1的立体流。
但是分裂成两个单声道立体声流流是可能的。
如果您需要此功能,1个可能的解决方法是使用amerge滤波器。
例如,如果你需要合并1个媒体(这里是input.mkv)和2单声道音频流到1个立体声声道音频流(并保持视频流),你可使用下面的命令:
ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv
-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (output,per-metadata)
从输入文件中,设置下1个输出文件的元数据信息。
注意那些事文件标示符(从0开始),不是文件名。
选项metadata_spec_in/out参数指定,哪一个元数据被复制。
1个元数据指定可以下面的情势:
g
全局元数据,例如,利用到全部文件中的元数据。
s[:stream_spec]
流元数据。
stream_spec是1个流唆使符就像在流唆使符章节描写的1样。
用1个输入元数据唆使符,第1个匹配的流被从它那里复制。
用1个输出元数据唆使符,所有匹配的流被复制到它那里。
c:chapter_index
章节元数据。
chapter_index 是从0开始的章节索引。
p:program_index
程序元数据。
program_index是从0开始的程序索引。
如果元数据设定被遗漏,它默许到全局。
默许情况下,全局元数据从第1输入文件复制,每章每流和元数据复制随着流/章。
通过创建任何相干类型的映照,这些默许的映照会被禁用。
这些默许的映照是通过创建任何映照的相干类型的残疾。
1个负数文件索引可以被用来创建1个虚拟映照,它仅禁用自动复制。
例如,从第1个输入文件的第1个流复制元数据到输出文件的全局元数据:
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输入文件复制章节到下1个输出为文件。
如果没有章映照指定的章节,然后复制从第1输入文件最少1章。
使用1个负指文件索引数来禁用任何章节的复制。
-benchmark (global)
在编码末端显示基准信息。
显示CPU时间和最大内存消耗。
最大内存消耗不被所有的系统支持,如果不支持,它会通常作为0显示。
-benchmark_all (global)
在编码进程中显示基准信息。
显示在1些步骤中的CPU时间(音频、视频 编码、解码)
-timelimit duration (global)
ffmpeg运行1段秒数以后退出。
-dump (global)
复制每一个输入包到stderr.
-hex (global)
当复制包,也复制有效载荷。
-re (input)
读取本地的输入帧速率。主要用于摹拟1个抓取装备或1个直播输入流(例如,当从1个文件中读取)。不利用于实际抓取装置或活的输入流(它会致使数据包丢失)。
默许ffmpeg试图尽可能快的读取输入。这个选项会减慢输入的读取帧率到本地输入帧速率。它用于实时输出(例如,直播流)。
-loop_input
在输入流回路。目前它只对图象流。该选项被用于自动FFserver测试。该选项已过期不用,使用-loop 1.
-loop_output number_of_times
对格式的支持,如动画GIF反复循环回路的输出(0将回路输出无穷)。
该选项过时了。使用,-loop.
-vsync parameter
视频同步方式。
出于兼容性斟酌旧值可以指定为数。
新添加的值将总是被指定为字符串。
0, passthrough
从解复用器到复用器,每一个帧带着它的时间戳被传递。
1, cfr
帧将被复制或抛弃 以准确到达要求的恒定的帧速率。
2, vfr
带时间戳的帧被通过或抛弃,以致于避免2个帧有相同的时间戳。
drop
当通过破坏了所有的时间戳,使复用器的产生基于帧速率的新的时间戳。
⑴, auto
在1和2之间选择取决于复用器能力。
这是默许的方式。
注意,打这以后,时间戳可以进1步被复用器修改。
例如,在格式选项avoid_negative_ts启用的情况下。
用-map你能选择在哪一个流获得时间戳。
你可以不改变视频和音频,并且同步设置剩余流不被改变。
-async samples_per_second
音频同步方法。
"Stretches/squeezes" 音频流匹配时间戳,参数是最大的每秒采样,通过它音频被改变了。
-async 1 是1个特殊情况,只有音频流的开始被校订,而没有任何后校订。
注意,打这以后,时间戳可以进1步被复用器修改。
例如,在格式选项avoid_negative_ts启用的情况下。
该选项已过时不用。使用aresample音频滤波器取代。
-copyts
不要处理输入时间戳,但保持它们的值不用清算它们。
特别是,不要移除初始启动时间偏移值。
注意,根据在vsync选项或乃至当该项被选择时,特定的复用途理输出时间戳可以不和输入时间戳匹配。
-start_at_zero
当使用copyts,转换输入时间戳,它们从0开始。
这意味着使用,例如,-ss 50会使得输出时间戳从50秒开始,疏忽输入文件开始的时间戳。
-copytb mode
指定当流复制的时候,怎样设置基于时间的编码器。
模式是1个整数值,并且能指定下面的1个值:
1
使用基于时间的解复用。
基于时间,被从相应的输入解复用器复制到输出编码器。
这是当使用可变帧速率复制的视频流的时候,要避免非单调增加的时间戳。
0
使用基于时间的解码。
基于时间,被从相应的输入解码器复制到输出编码器。
⑴
尝试自动做出选择,以产生1个理智的输出。
默许值是⑴。
-shortest (output)
当最短输入流结束时,完成编码。
-dts_delta_threshold
时间戳不连续的峰值。
-muxdelay seconds (input)
设置最大复用解码延迟。
-muxpreload seconds (input)
设置初始复用器的解码延迟。
-streamid output-stream-index:new-value (output)
指定1个新的流id到1个输出流。
该选项应当被指定于之前它利用的1个输出文件名。
在多个输出文件中存在的情况下,1个流id可能被分配到1个不同的值。
例如,为1个mpegts输出文件设置流0 PID为33 并且流1 的PID为36:
ffmpeg -i infile -streamid 0:33 -streamid 1:36 out.ts
-bsf[:stream_specifier] bitstream_filters (output,per-stream)
为匹配的流设置比特流过滤器。
bitstream_filters是1个逗号分隔的比特流过滤器列表。可使用-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)
为匹配流逼迫1个tag/fourcc。
-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)
定义1个复杂过滤图,例如,1个任意数量的输入和/或输出。
对简单的过滤图 - 那些带相同类型的1个输入和1个输出 - 参照-filter选项。
过滤图本身是1个描写,就像在ffmpeg-filters手册的'过滤图语法'描写。
输入链接标签必须参考输入流,使用[ file_index:stream_specifier ]语法(例如,跟-map的使用相同)。
如果stream_specifier匹配多个流,第1个会被使用。
1个未标记的输入将被连接到的匹配类型的第1个未使用的输入流。
输出链接标签被称为-map。未标记的输出被添加到第1个输出文件。
注意通过这些选项可以仅用不带普通文件的lavfi 源。
例如,把图象叠加到视频。
ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map
'[out]' out.mkv
在这里[0:v]是指在第1输入文件的第1视频流,它被连接到第1个(主)的叠加过滤器输入。
类似地,在第2个输入的第1个视频流被连接到第2个(叠加)输入的叠加。
假定唯一1个视频流在每一个输入文件中,我们能疏忽输入标签,因此上面的命令同等于:
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
用lavfi色采源产生5秒钟的纯红视频:
ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
-lavfi filtergraph (global)
定义1个复杂的过滤图,例如,1个带任意数量的输入或/和输出。同等于-filter_complex.
-filter_complex_script filename (global)
这个选项是类似于-filter_complex,唯1不同的是,它的参数是文件名,从中读取1个复杂的filtergraph描写。
-accurate_seek (input)
此选项启用或禁用准确寻觅输入文件的通讯选项。使用-ss选项,该选项启用或关闭准确寻觅输入文件。这是默许启用的,因此转换的时候寻求文件是准确的。
使用-noaccurate_seek禁用它,多是很有用的。例如,当复制1些流和转码另外一些流的时候。
-override_ffserver (global)
覆盖来自ffserver真个输入指定。
使用该选项,你可以映照任何输入流到ffserver并且控制很多ffmpeg编码的方面。
没有该选项,ffmpeg会把ffserver要求的传送到ffserver。
没有这个选项,FFmpeg传送到要求ffserver ffserver甚么。
该选项的目的是为了这类情况。在这类情况下,1种必须的但又不能指定用于ffserver的,但是可以指定用于ffmpeg的功能。
该选项用于的情况下,特点是必要的,不能被指定为ffserver但可以实现。
-discard (input)
允许在分离器抛弃特定流或特定流的帧。
不是所有的解复用器都支持这项。
none
不抛弃任何帧。
default
默许情况,不抛弃任何帧。
noref
抛弃所有非参考帧。
bidir
抛弃所有双向帧。
nokey
抛弃除关键帧之外的所有帧。
all
抛弃所有帧。
作为1个例外,你可以用1个bitmap字幕流作为输入:
它会被转化成1个在文件中跟最大尺寸相同的视频,或720x576,如果当前没有视频的话。
注意,这是1个实验中和临时的解决方案。
1旦libavfilter有适合的字幕支持,它会被删除。
例如,在以MPEG-TS格式存储的DVB-T 记录的硬编码字幕,延迟字幕1秒:
ffmpeg -i input.ts -filter_complex \
'[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
-sn -map '#0x2dc' output.mkv
(x2d0, 0x2dc and 0x2ef 是分别的视频,音频和字幕流的MPEG-TS PID;0:0, 0:3 和 0:7 一样也会工作)
5.12 预设文件
1个文件包括1个 选项=值 对序列,每行1个,指定1个,难以在命令行中指定的选项序列。
以'#'开头的行被疏忽,并被用作提供注释。
检查预设的目录,例如,在FFmpeg的源码树。
预设文件由vpre, apre, spre, 和 fpre选项指定。
fpre选项获得预设文件名而不是作为输入的1个预设名称,并且能被用于任何的编码。
vpre, apre, 和 spre选项,被1个预设文件指定的选项被利用到当前选项相同预设选项类型的编码。
传递给pre, apre, 和 spre预设选项的参数,标示了使用以下规则使用的预设文件:
首先,ffmpeg搜索1个名叫arg的文件。
ffpreset 在$FFMPEG_DATADIR目录(如果设置过),$HOME/.ffmpeg和在配置时的数据目录(通常PREFIX/share/ffmpeg)或在1个ffpresets文件夹跟可履行程序在1起的那个win32文件夹。
例如,付过参数是libvpx⑴080p,它会搜索libvpx⑴080p.ffpreset文件。
如果没有发现文件,那末ffmpeg会搜索1个名叫codec_name-arg的文件。
ffpreset 在上面提到的目录,那里codec_name是预设文件选项会被利用到的编码名称。
例如,如果你用-vcodec libvpx和-vpre 1080p选项,选择视频编码,那末它会搜索libvpx⑴080p.ffpreset文件。
6 提示
对在非常低比特率的流,使用1个低帧率且,1个小GOP尺寸。
对RealVideo,这是特别肯定的,linux播放器好像不能太快,因此,它会失帧。
1个例子是:
ffmpeg -g 3 -r 3 -t 10 -b:v 50k -s qcif -f rv10 /tmp/b.rm
参数'q',它挡编码的时候显现,是当前的 量化器
值1表示会到达1个非常好的质量,值31表示最差质量。
如果q=31出现的太频繁,它意味着编码器不能足够充分的紧缩,以符合你的比特率。
你必须要末增加比特率,减少帧率或减少帧的尺寸。
如果你的计算机的速度不够快,你可以加快在紧缩比的紧缩的消耗。
你能使用'-me zero'加速运动估计,和使用'-g 0'来完全禁用运动估计(你唯一I-frames,这意味着它和JPEG紧缩1样的好)
为取得很低的音频比特率,减少采样频率(对MPEG音频,减少至22050 Hz,对AC⑶,减少至22050 或 11025)。
为取得1个恒定的质量(但是1个变化的比特率),使用选项'-qscale n',当'n'是在1(最好质量)和31(最差质量)之间时。
7 举例
7.1 预设文件
1个预设文件,包括1个 选项=值对 的序列,每行1个,指定1个选项序列。该选项序列也能在命令行里被指定。
以字符'#'开头的行被疏忽,并且被用于提供注释。
空行也是被疏忽的。例如,检查在FFmpeg源代码树里的预设目录。
预设文件被pre选项指定,该选项获得1个预设名称作为输入。
FFmpeg 搜索1个名叫preset_name.avpreset的文件,在$AVCONV_DATADIR目录(如果设置过),$HOME/.ffmpeg和在配置时的数据目录(通常是$PREFIX/share/ffmpeg)
例如,如果参数是libx264-max,它会搜索libx264-max.avpreset文件。
7.2 视频和音频收集
如果你指定了输入格式和装备,那末ffmpeg可以直接抓取视频和音频。
ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg
或用1个ALSA音频源(单声道输入,卡id 1)替换OSS:
ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg
注意,在启动ffmpeg之前,你必须激活正确的视频源和通道,ffmpeg使用任何的TV阅读器例如,xawtv。
你也必须正确的设置带有标准复用器的音频记录级别。
7.3 X11 收集
抓取 X11 显示,用ffmpeg:
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是横向偏移,20是纵向偏移。
7.4 视频和音频文件格式转换
任何被支持的文件格式和协议,能作为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选项指定图象的尺寸。
你能从1个原始YUV420P文件输入:
ffmpeg -i /tmp/test.yuv /tmp/out.avi
test.yuv 是1个文件,它包括原始YUV平面数据。
每一个帧是由Y平面,随着U和V平面在1半的垂直和水平的分辨率。
你能输出到1个原始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到1个MPEG文件a.mpg.
你也能够同时做音频和视频的转化:
ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2
转化a.wav成22050 Hz采样率的MPEG音频。
你能同时编码几个格式,并且从输入流到输出流定义1个映照:
ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2
转化1个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
这是1个典型的DVD分用例子;输入是1个VOB文件,输出1个带有MPEG⑷的视频和MP3的音频的AVI文件。
注意,在这个命令,我们用B-frames因此MPEG⑷流是兼容DivX5的,并且GOP大小是300,这意味着每10秒1个intra帧,大约29.97fps的输入视频。
另外,MP3编码的音频流,你需要通过使瘸腿的支持——enable-libmp3lame配置。
另外,MP3编码的音频流,你需要通过传递--enable-libmp3lame到配置,来启用LAME支持。
对DVD 转码获得想要的音频语言来讲,映照是相当有用的。
注意:参照支持的输入格式,使用ffmpeg -formats.
你可以从1个视频中提取图象,或从很多图象中创建视频:
对,从视频中提取图象:
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
这会从视频中每秒提取1个视频帧,并且以文件的情势输出它们,命名为foo-001.jpeg, foo-002.jpeg, 等。
图象将被重新调剂以适应新的辩白率值。
如果你想提取的只是1个有限数量的帧,可以结合上面的命令使用vframes或-t选项,或结合上面的命令使用-ss开始从1个特定的时间点提取。
从很多图象中创建1个视频:
ffmpeg -f image2 -i foo-%03d.jpeg -r 12 -s WxH foo.avi
语法foo-%03d.jpeg表示用由3个用零填充的数字组成的1个10进制数来表示序列号。
它支持于C printf 函数相似的语法,但只适用于接受普通整数。
当导入1个图片序列,-i 内部也支持扩大像shell通配符表达式(全局),通过选择image2-specific -pattern_type全局选项。
例如,对,从匹配全局表达式foo-*.jpeg的文件名创建1个视频:
ffmpeg -f image2 -pattern_type glob -i 'foo-*.jpeg' -r 12 -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,会包括来自输入文件的以反向顺序排列的头4个流。
强迫CBR输出:
ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
这4个选项,lmin, lmax, mblmin 和 mblmax 使用'lambda'单元,但是你可使用QP2LAMBDA 常量来容易的从'q'单元转化:
ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext
------分隔线----------------------------
------分隔线----------------------------