ffmpeg的总体认识

1 概要

ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_options] output_file} ...

ffmpeg [全局选项] {[输入文件的选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...

2 描述

ffmpeg 是一个非常快速的音视频转换器,还能够从实时的音视频流源中获取音视频。它还能在任意的采样率之间转化,

调整用高质量的多相滤波器的实时视频。

ffmpeg 从任意数量的输入“文件”(可能是普通文件,管道,网络流,抓取设备等等)中读取信息,由-i选项指定输入文件。

然后写入到任意数量的输出“文件”中。输出“文件”由普通的文件名称设定。在命令行中的任何内容,如果不能被解析成选项,

就认为它是输出文件。

每个输入或者输出文件,原则上,都能包含任意数量不同类型的流(视频、音频、字幕、附件、数据).

流的数量和类型,可能被容器的格式所限制。从输入中选择哪个流,然后输送到哪个输出,要么是被自动指定,要么使用-map选项(参照流选择章节)。

在选项中引用输入文件,你必须用它们的索引符(从0开始)。例如,第一个输入文件是0,第二个是1,等等。类似地,文件中的流被也它们的索引符所引用。

例如,2:3 引用的是第三个输入文件中的第四个流。同样参照流设定章节。

按照一般规律,选项被应用在下一个指定文件上。因此顺序非常重要,相同选项可以在一个命令行中出现多次。每次出现被应用到下一个输入或者输出文件上。

全局选项(例如,详细级别)例外于这个规律,它应该首选被设置。

不要混淆输入和输出文件 -- 首先设定所有的输入文件,然后设定所有的输出文件。也不能混淆属于不同文件的选项。所有的选项只能被应用到下一个输入或者

输出文件,并且在文件之间被重置。

-------------------------------------------------------------------

设置输出文件的比特率为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尽力去保持它们

同步,通过跟踪最慢的时间戳的任何激活状态的数据流。

然后,被编码的数据包被传送到解码器(除非流复制被指定到流,参照后续近一步描述).解码器产生未压缩的帧(原始视频/PCM 音频等)能够近一步被

过滤器(参照下一节)处理。过滤之后,这些帧被传送到编码器,把它们编码并且输出编码数据包。

3.1 过滤器

在编码之前,ffmpeg 能通过libavfilter库里面的过滤器处理原始音频和视频帧。几个链式过滤器组成的过滤图。ffmpeg 在两种类型的过滤图simple

和complex中进行辨别。

3.1.1 简单过滤图

简单过滤图是那些仅有一个输入和输出,两个是相同类型。上面的图形,在编码和解码之间,插入一个步骤,它们就能表示简单过滤图。

简单过滤图用 流选项 -filter 配置 (用 -vf 和-af 相应作为视频和音频的别名)。一个简单的视频的过滤图作为一个举例,正如这样的:

_______           _____________           _______          ________

|              |         |         |          |              |       |

| input     | --->  | deinterlace        |   ---> | scale     | ---> | output |

|_______|         |_____________|          |_______|        |________|

注意有些过滤器改变帧的属性,但是不改变帧的内容。例如,fps帧过滤器在上面的例子中改变帧数量,但不会碰触帧内容。另外一个例子是setpts过滤器,

它仅设置时间戳,并且,另外传递不加以改变的帧。

3.1.2 Complex 过滤图

Complex 过滤图不能被描述为一个应用于一个流的简单的线性处理链。情形是这样的,例如,当过滤图有多于一个的输入或者输出,或者当输出流的类型不同于

输入流的时候。它们能用下面的图形来表示:

Complex 过滤图 通过 -filter_complex 选项配置。注意,这个选项是全局的。因为一个complex过滤链,由于它的本质,不可能与一个单一的流或者文件相关联。

-lavfi 选项,等同于-filter_complex.

一个寻常的 complex过滤链图的例子是 overlay 过滤器。它有两个视频输入和一个视频输出,它包含一个视频的覆盖在另一个的上面。同理于音频的overlay 过滤器是

amix 过滤器。

3.2 流复制

流复制是一个模式,它提供复制过的参数给-codec 选项。它使得 ffmpeg 丢掉对于一个流解码和编码的步骤,因此它只做解复用和多路复用。它是很有用的,对于改变容器

的格式或者修改容器级的元数据。上面的图形在这种情形下,简化成这样:

因为没有解码或者编码,这个过程是非常快,并且也没有质量的损耗。然而,在一些情况下,它可能不工作,可能原因也比较多。用过滤器显然也是不可能的,因为过滤器是

工作在没有压缩的数据。

4 流选择

默认情况下,ffmpeg 包含每种类型的一个流(视频,音频,字幕),它出现在输入文件中,并且把流加入到每个输出文件。它选择最好的标准:对于视频,它是最高分辨率的流。

对于音频,它是最多通道的流。对于字幕,它是第一个字幕流。在几个相同类型流速相等的流,以最低指数作为选择。

你能关闭那些默认选项,通过用 -vn/-an/-sn. 对于全手动控制,用 -map 选项,它能关闭刚刚描述的默认选项。

5 选项

所有的数字类选项,如果不是另有规定,接受一个字符串表示一个数字,作为输入,它可能后边跟着一个国际单位前缀,例如,‘K‘, ‘M‘, ‘G‘.

如果 ‘i‘ 作为国际单位前缀,那么完整的前缀被解释成基于1024进制的单位,而不是1000进制。

增加 ‘B‘ 作为单位前缀,则要把值乘以8. 就可以这样使用,例如,‘KB‘, ‘MiB‘, ‘G‘ 和‘B‘作为数字后缀。

没有带参数的选项是布尔选项,并且设置相应的值为真。

它们能被设置成假,通过给选项增加前缀‘no‘. 例如,用‘-nofoo‘ 将要设置‘foo‘名字的布尔选项为假。

5.1 流设定

一些选项是应用于每个流的,例如,比特率或者编码。流设定被用于,严格制定一个给出的选项是属于哪个流的。

一个流的设定是一个字符串,它通常附加到这个选项名并且被一个冒号分开。例如,‘-codec:a:1 ac3‘ 包含a:1设定,它匹配第二个音频流。 因此,它会为第二个音频流选择 ac3 编码。

一个流设定,能匹配好几个流,因此,这个选项可以应用到它们所有的流。例如,流设定,-b:a 128k 匹配所有的音频流。

一个空的流设定,匹配所有的流。例如,-codec copy 或者 -codec: copy 会复制所有的流,而没有重新编码。

可能形式的流设定是:

stream_index

匹配基于该索引号stream_index的流。例如,-threads:1 4 会设置第二个流的线程的数量为4。

stream_type[:stream_index]

stream_type 是下面的一种:‘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]

显示帮助。一个可选参数可以指定显示一个特定的条目。如果没有参数被指定,只显示基础的(非高级)的工具选项。

可能的参数值是:

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知道的编码。

注意,条目‘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 [repeat+]loglevel | -v [repeat+]loglevel

设置被库应用的记录日志的级别。添加‘repeat+‘表示重复的日志输出,不应该被压缩成第一行和‘最后一行信息重复了n次‘ ,不会丢掉重复的行。

‘repeat‘ 也能单独使用。

如果单独使用‘repeat‘,并且没有用优先级日志级别集,那么,默认的日志级别讲被使用。

如果多个日志级别参数被给出,使用‘repeat‘不会改变日志级别。

日志级别是一个数字或者包含一个下面值的一个字符串:

‘quiet’

什么都不显示,处于安静状态。

‘panic’

仅显示致命错误,它可能导致进程崩溃,例如,断言错误。现在没有用。

‘fatal’

仅仅显示致命错误,出现这些错误以后,程序绝对不能继续运行。

‘error’

显示所有的错误,包含那些能够被恢复的。

‘warning’

显示所有的警告和错误。所有的关于可能是不正确或者意外的事件信息都被显示。

‘info’

显示信息的处理过程。这些信息包括警告和错误。这是默认的值。

‘verbose’

除了更详细以外,跟info相同。

‘debug’

显示任何东西,包括调试信息。

默认情况下,程序把日志记入stderr, 如果中断支持颜色,颜色别用于标记错误和警告。

日志颜色可能被设置的环境变量AV_LOG_FORCE_NOCOLOR 或者 NO_COLOR取消,或者能被强制设置成AV_LOG_FORCE_COLOR环境变量值。

环境变量NO_COLOR使用已经过时,并被下边版本的FFmpeg丢弃了。

-report

复制完全的命令行和终端输出到当前目录的一个文件命名为program-YYYYMMDD-HHMMSS.log。

该文件对于bug报告是有用的。它也实现了 -loglevel 细节。

设置环境变量FFREPORT为任何值有同样的效果。如果该值是一个以 ‘:‘ 分割的键值序列,这些选项会影响报告。

选项值必须被转义,如果他们包含特定字符或者选项分隔符‘:‘ (参照位于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 工具会正常显示一个版权通知,创建选项和库版本。这个选项能用来隐藏显示这些信息。

-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编译时是可用的。选项必须是一个被‘:‘分开的键值的列表。

参照ffmpeg-utils工具手册的‘OpenCL Options‘部分,以获取支持选项的列表。

5.3 AV选项

这些选项被libavformat, libavdevice 和 libavcodec库直接提供。用-help选项去参照可用的AV选项的列表。它们被分成两类:

generic

这些选项能被设置用于任何容器,编码和设备。Generic 选项在容器/设备的AVFormatContext选项和编码的AVCodecContext选项被列出。

private

这些选项被设定用于给出的容器,设备或者编码。Private选项在相应的容器/设备/编码下被列出。

例如,写一个ID3v2.3的头到一个mp3文件,使用MP3 复用器的 id3v2_version的私有选项,不用默认的 ID3v2.4:

--------------------------------------------------------------

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

--------------------------------------------------------------

所有的编码AV选项,是每个流,因此,一个流指定器应该附加到它们。

注意:-nooption语法不能被用于波尔 AV选项,使用-option 0/-option 1.

注意:老的没有文档化的指定流AV选项的方法,通过增加前缀v/a/s到选项名称,现在正在观测中,且很快就会被删除。

5.4 主选项

-f fmt (input/output)

强制设置输入或者输出文件格式。该格式通常对输入文件自动检测,且根据文件扩展猜测输出文件格式,因此这个选项大部分情况下不需要。

-i filename (input)

输入文件名称。

-y (global)

重写输出文件没有确认提示。

-n (global)

不重写输出文件,且如果一个指定的输出文件已经存在,则立即退出。

-c[:stream_specifier] codec (input/output,per-stream)

-codec[:stream_specifier] codec (input/output,per-stream)

为一个或者多个流选择一个编码器 (当用在输出文件之前)或者一个解码器(当用在输入文件之前)。codec是解码器或者编码器的名字或者是一个特殊值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所有的流,除了第二个视频,它会被libx264编码,还要除了第138个音频,它会被libvorbis编码。

--------------------------------------------------------------

-t duration (input/output)

当用作一个输入选项(在-i之前),限制从输入文件读取的时间间隔。当用作一个输出选项(在输出文件名之前),停止写入,直到时间到达设定间隔。

duration 可以是基于秒的整数,或者以hh:mm:ss[.xxx]的形式。

-to 和 -t 是相互排斥的,且-t有优先权。

-to position (output)

在position位置,停止写入。该位置可以是一个表示秒数的数字或者以hh:mm:ss[.xxx]的形式。

-to 和 -t 是相互排斥的,且-t有优先权。

-fs limit_size (output)

设置文件大小限制,数字表示多少字节。

-ss position (input/output)

当用作输出选项(在-i之前),在输入文件中定位position.注意对大多数格式,是不可能精确定位的,因此,ffmpeg 会定位到距离position最近的点。

当转码且启用-accurate_seek(默认), 这些位于定位点和定位位置之间额外的段将被解码和丢弃。

当作流copy或者当使用-noaccurate_seek选项时,这些段会被保留。

当用作一个输出选项(在输出文件名之前),解码但是丢弃输入直到时间戳到达设定位置。

位置可以用秒数或者以hh:mm:ss[.xxx]的格式。

-itsoffset offset (input)

设置输入文件时间偏移。

该偏移必须是一个指定时间段,参照(ffmpeg-utils)ffmpeg-utils手册的时间段部分。

该偏移被追加到输入文件的时间戳。

设置一个位置偏移意味着,相应的流被延迟偏移一定时间。

-timestamp date (output)

设置容器的记录时间戳。

日期必须是一个指定的时间段,参照(ffmpeg-utils)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

------------------------------------------------------------------------

-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)

设置输出的数据帧数。这是一个-frames:d的别名。

-frames[:stream_specifier] framecount (output,per-stream)

framecount数以后,停止写入一个流。

-q[:stream_specifier] q (output,per-stream)

-qscale[:stream_specifier] q (output,per-stream)

使用固定的质量表(VBR).q/qscale是基于编码的。

如果qscale没有用在一个流设定,那么它只应用于视频流。当没有stream_specifier被使用时,为两个不同的编码指定相投的编码值,是因为通常音频和视频没有意图。

这是为了兼容以前的行为。

-filter[:stream_specifier] filtergraph (output,per-stream)

创建过滤图链,且使用它过滤该流。

过滤图是一个应用到流的过滤图的描述。并且必须有一个输入和一个相同类型流的输出。

在过滤图中,输入输入被关联到输入标签,输出被关联到输出标签。

参照ffmpeg-filters手册获取更多关于过滤图语法的信息。

参照-filter_complex选项,如果你想用多个输入或者输出去创建过滤图。

-filter_script[:stream_specifier] filename (output,per-stream)

这个选项类似于-filter,仅有的不同是它的参数是文件名, 从该文件中读取一个过滤图描述符。

-pre[:stream_specifier] preset_name (output,per-stream)

设定预设的匹配流。

-stats (global)

输出编码进程/状态。

它默认是开启的,如果关闭她,你必须指定-nostats.

-progress url (global)

发送程序友进程信息到url。

进度信息在编码过程一结束就写一次,大约是每两秒钟。

它由"键=值"行组成。键包含数字和字母。

一个处理过程信息序列最后一个键总是"progress".

-stdin

开启标准输入交互。

除非标准输入用作输入,否则,默认是开启状态。如果显式禁用互动,你需要指定- nostdin。

关闭标准输入的交互是有用的,比如,如果ffmpeg是后台进程组。

Roughly the same result can be achieved with ffmpeg ... < /dev/null but it requires a shell.

用ffmpeg可以达到大致相同的效果... < /dev/null 但是,它要求一个shell。

-debug_ts (global)

输出时间戳信息。

它默认是关闭的。

对于想测试和调试,这个选项是最有用的。它的输出格式可能在不同的版本之间变化。因此,它不应该被部署成可移植的脚本。

同样可以参照-fdebug ts。

-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的文件。

如果文件名为空,那么文件名元数据标签的值会被用到。

--------------------------------------------------------------------------------------------------

例如,提取第一个附件流到一个名叫‘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值,分数或者缩写).

作为一个输入选项,忽略存储在文件中的任何时间戳,并且,产生时间戳,假定恒定的帧率fps。这不同于被用于一些输入格式的-framerate 选项,像image2或者v4l2(它在过去的老版本的FFmpeg中是相同的)。

如果存在疑问,使用-framerate而不是输入选项 -r.

作为一个输出选项,复制或者丢弃帧来实现恒定的输出帧帧率fps.

-s[:stream_specifier] size (input/output,per-stream)

设置帧大小。

作为一个输入选项,这是一个视频大小私有选项的快捷方式,被一些解复用器所识别。帧大小也不被存储在文件,也是不可配置的。例如,原始的视频和音频抓取器。

作为一个输出选项,这将大小视频滤波器插入到的相应过滤图的结束。

请直接使用尺度滤波器插入到它的开头或其他地方。

The format is ‘wxh’ (default - same as source).

-aspect[:stream_specifier] aspect (output,per-stream)

设置指定的显示比例。

aspect可以是浮点数字的字符串,或一个字符串的比值,比值分别是纵横比的分子和分母。

For example "4:3", "16:9", "1.3333", and "1.7777" are valid argument values.

如果和-vcodec copy一起用,虽然它会影响存储在容器级别的纵横比,但,如果编码帧里存在纵横比,则不会影响。

-vn (output)

关闭视频录制。

-vcodec codec (output)

设置视频编码。这是-codec:v的一个别名。

-pass[:stream_specifier] n (output,per-stream)

选择路数(1或者2):

它被用做两路视频编码。视频的状态被记录在第一路,记录进一个日志文件(同样参照-passlogfile选项),并且在第二路,日志文件在精确要求的比特率,被用来产生视频。

对于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是一个指定输出流的一个数字。

-vf filtergraph (output)

创建被指定的过滤图,并且用它过滤流。这是-filter:v的一个别名。参照-filter选项。

5.6 高级视频选项

-pix_fmt[:stream_specifier] format (input/output,per-stream)

设置像素格式。

用-pix_fmts显示所有支持的像素格式。

如果被选的像素格式是不可被选择的,ffmpeg会显示一个警告,并且选择被编码器支持的最好的像素格式。

如果pix_fmt被加上前缀a+, 如果,要求的像素格式不可被选择,ffmpeg会带一个错误退出,并且,内部过滤图的自动转化被关闭。

如果pix_fmt只有一个+, ffmpeg 选择相同的像素格式,作为输入(或图像输出)并且关闭自动转化。

-sws_flags flags (input/output)

设置SwScaler标志。

-vdt n

丢弃阀值。

-rc_override[:stream_specifier] override (output,per-stream)

速率控制,覆盖指定的时间间隔,以‘逗号分隔的int,int,int‘列表格式。

前两个值是开始和结束的帧号,最后一个如果是整数,表示用量。如果是负数表示品质因素。

-ilme

强制交织支持编码(仅有MPEG-2 和 MPEG-4)

如果你输入文件是交错的,你想保留交错格式的最小损失,使用此选项。

另一种方法是用-deinterlace把输入流与分离,但损失了技术介绍。

-psnr

计算压缩的帧PSNR。

-vstats

备份视频编码状态到vstats_HHMMSS.log。

-vstats_file file

备份视频编码状态到文件中。

-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)

-force_key_frames[:stream_specifier] expr:expr (output,per-stream)

在指定的时间戳强制关键帧,更确切的说,在每个指定时间的第一个帧。

如果参数带前缀expr:,这个字符串expr被解释像一个表达式且是针对每个帧赋值。

一个关键帧是被强制的,以免赋值是非零的。

如果一个时间是"chapters[delta]",它被扩展成在一个文件所有章节的开始处,被delta转换,做为几秒钟的时间来标示。

该选项能被用于确保一个寻求点出现在一个章节或者在输出文件任何被设计的地方。

例如,在5分钟内,插入一个关键帧。在每一章开始前0.1秒增加一个关键帧。

-force_key_frames 0:05:00,chapters-0.1

表达式可以包含如下常量:

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))

请注意,迫使许多关键帧对编码器的前瞻算法是非常有害的:

用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存储器的解码的帧复制到系统内存,导致进一步的性能损失。

该选项因此主要用于测试。

-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream)

选择一个设备用于硬件加速。这个选项仅当-hwaccel 也被指定时才有意义。它的精确意义取决于特定硬件加速方法的选择上。

vdpau

对于VDPAU,该选项指定了使用X11 显示/屏幕。如果该选项没有指定,就使用环境变量DISPLAY的值。

dxva2

对于DXVA2, 该选项应该包含使用的显示适配器的数目。

如果该选项没有指定,使用默认的适配器。

5.7 音频选项

-aframes number (output)

设置输出的音频帧数目。它是-frames:a的一个简写。

-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)

如果一些输入通道层是不识别的,仅在如果它相当于指定的通道数,它会尝试着猜测。

例如,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

固定字幕持续时间。

对没个字幕,在相同的流中等待下一个包,且调整第一时间以避免重叠。

在一些字幕编码尤其是DVB字幕时,这是必须的。因为,在原始数据包的时间只是一个粗略的估计,并且,最后实际上是由一个空的字幕帧标记。

不使用此选项,在必要的时候可以导致夸张的持续时间或由于非单调的时间戳导致复用的失败。

注意,该选项会延迟所有数据的输出,直到下一个字幕包被解码:它可以大大增加内存消耗和延迟。

-canvas_size size

设置被用于渲染字幕的画布大小。

5.11 高级选项

-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

会把 在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

从一个输入文件中,选择所有的视频和第三方音频流。

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:m:language:eng OUTPUT

注意使用该选项禁用了该输出文件的默认映射。

-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 会映射一个柔和的通道。

例如,假设INPUT是一个立体声音频文件,你可以用下面的命令开关的两个音频通道:

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" 选项的顺序指示了在输出流中通道的顺序。

输出通道层,被根据输入被映射通道数猜测(如果‘-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

下面的示例将一个立体声输入通道分隔成两个流,这是放在同一输出文件:

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)和2单声道音频流到一个立体声声道音频流(并保持视频流),你可以使用下面的命令:

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)

从输入文件中,设置下一个输出文件的元数据信息。

注意那些事文件标示符(从0开始),不是文件名。

选项metadata_spec_in/out参数指定,哪个元数据被复制。

一个元数据指定可以下面的形式:

g

全局元数据,例如,应用到整个文件中的元数据。

s[:stream_spec]

流元数据。

stream_spec是一个流指示符就像在流指示符章节描述的一样。

用一个输入元数据指示符,第一个匹配的流被从它那里复制。

用一个输出元数据指示符,所有匹配的流被复制到它那里。

c:chapter_index

章节元数据。

chapter_index 是从0开始的章节索引。

p:program_index

程序元数据。

program_index是从0开始的程序索引。

如果元数据设定被遗漏,它默认到全局。

默认情况下,全局元数据从第一输入文件复制,每章每流和元数据复制随着流/章。

通过创建任何相关类型的映射,这些默认的映射会被禁用。

这些默认的映射是通过创建任何映射的相关类型的残疾。

一个负数文件索引可以被用来创建一个虚拟映射,它仅禁用自动复制。

例如,从第一个输入文件的第一个流复制元数据到输出文件的全局元数据:

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)

在编码末端显示基准信息。

显示CPU时间和最大内存消耗。

最大内存消耗不被所有的系统支持,如果不支持,它会通常作为0显示。

-benchmark_all (global)

在编码过程中显示基准信息。

显示在一些步骤中的CPU时间(音频、视频 编码、解码)

-timelimit duration (global)

ffmpeg运行一段秒数以后退出。

-dump (global)

复制每个输入包到stderr.

-hex (global)

当复制包,也复制有效载荷。

-re (input)

读取本地的输入帧速率。主要用于模拟一个抓取设备或者一个直播输入流(例如,当从一个文件中读取)。不应用于实际抓取装置或活的输入流(它会导致数据包丢失)。

默认ffmpeg试图尽量快的读取输入。这个选项会减慢输入的读取帧率到本地输入帧速率。它用于实时输出(例如,直播流)。

-loop_input

在输入流回路。目前它只对图像流。该选项被用于自动FFserver测试。该选项已经过期不用,使用-loop 1.

-loop_output number_of_times

对格式的支持,如动画GIF反复循环回路的输出(0将回路输出无限)。

该选项过时了。使用,-loop.

-vsync parameter

视频同步方式。

出于兼容性考虑旧值可以指定为数。

新添加的值将总是被指定为字符串。

0, passthrough

从解复用器到复用器,每个帧带着它的时间戳被传递。

1, cfr

帧将被复制或者丢弃 以准确达到要求的恒定的帧速率。

2, vfr

带时间戳的帧被通过或者丢弃,以至于避免2个帧有相同的时间戳。

drop

当通过破坏了所有的时间戳,使复用器的产生基于帧速率的新的时间戳。

-1, auto

在1和2之间选择取决于复用器能力。

这是默认的方式。

注意,打这以后,时间戳可以进一步被复用器修改。

例如,在格式选项avoid_negative_ts启用的情况下。

用-map你能选择在哪个流取得时间戳。

你可以不改变视频和音频,并且同步设置剩余流不被改变。

-async samples_per_second

音频同步方法。

"Stretches/squeezes" 音频流匹配时间戳,参数是最大的每秒采样,通过它音频被改变了。

-async 1 是一个特殊情况,只有音频流的开始被校正,而没有任何后校正。

注意,打这以后,时间戳可以进一步被复用器修改。

例如,在格式选项avoid_negative_ts启用的情况下。

该选项已经过时不用。使用aresample音频滤波器取代。

-copyts

不要处理输入时间戳,但保持它们的值不用清理它们。

特别是,不要移除初始启动时间偏移值。

注意,根据在vsync选项或者甚至当该项被选择时,特定的复用处理输出时间戳可以不和输入时间戳匹配。

-start_at_zero

当使用copyts,转换输入时间戳,它们从0开始。

这意味着使用,例如,-ss 50会使得输出时间戳从50秒开始,忽略输入文件开始的时间戳。

-copytb mode

指定当流复制的时候,怎么设置基于时间的编码器。

模式是一个整数值,并且能指定下面的一个值:

1

使用基于时间的解复用。

基于时间,被从相应的输入解复用器复制到输出编码器。

这是当使用可变帧速率复制的视频流的时候,要避免非单调增加的时间戳。

0

使用基于时间的解码。

基于时间,被从相应的输入解码器复制到输出编码器。

-1

尝试自动做出选择,以产生一个理智的输出。

默认值是-1。

-shortest (output)

当最短输入流结束时,完成编码。

-dts_delta_threshold

时间戳不连续的峰值。

-muxdelay seconds (input)

设置最大复用解码延迟。

-muxpreload seconds (input)

设置初始复用器的解码延迟。

-streamid output-stream-index:new-value (output)

指定一个新的流id到一个输出流。

该选项应该被指定于之前它应用的一个输出文件名。

在多个输出文件中存在的情况下,一个流id可能被分配到一个不同的值。

例如,为一个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是一个逗号分隔的比特流过滤器列表。可以使用-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/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)

定义一个复杂过滤图,例如,一个任意数量的输入和/或输出。

对于简单的过滤图 - 那些带相同类型的一个输入和一个输出 - 参照-filter选项。

过滤图本身是一个描述,就像在ffmpeg-filters手册的‘过滤图语法‘描述。

输入链接标签必须参考输入流,使用[ 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]是指在第一输入文件的第一视频流,它被连接到第一个(主)的叠加过滤器输入。

类似地,在第二个输入的第一个视频流被连接到第二个(叠加)输入的叠加。

假设仅有一个视频流在每个输入文件中,我们能忽略输入标签,因此上面的命令等同于:

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)

定义一个复杂的过滤图,例如,一个带任意数量的输入或/和输出。等同于-filter_complex.

-filter_complex_script filename (global)

这个选项是类似于-filter_complex,唯一不同的是,它的参数是文件名,从中读取一个复杂的filtergraph描述。

-accurate_seek (input)

此选项启用或禁用准确寻找输入文件的通信选项。使用-ss选项,该选项启用或者关闭准确寻找输入文件。这是默认启用的,因此转换的时候寻求文件是准确的。

使用-noaccurate_seek禁用它,可能是很有用的。例如,当复制一些流和转码另一些流的时候。

-override_ffserver (global)

覆盖来自ffserver端的输入指定。

使用该选项,你可以映射任何输入流到ffserver并且控制很多ffmpeg编码的方面。

没有该选项,ffmpeg会把ffserver要求的传送到ffserver。

没有这个选项,FFmpeg传送到请求ffserver ffserver什么。

该选项的目的是为了这种情况。在这种情况下,一种必须的但又不能指定用于ffserver的,但是可以指定用于ffmpeg的功能。

该选项用于的情况下,特征是必要的,不能被指定为ffserver但可以实现。

-discard (input)

允许在分离器丢弃特定流或特定流的帧。

不是所有的解复用器都支持这项。

none

不丢弃任何帧。

default

默认情况,不丢弃任何帧。

noref

丢弃所有非参考帧。

bidir

丢弃所有双向帧。

nokey

丢弃除关键帧以外的所有帧。

all

丢弃所有帧。

作为一个例外,你可以用一个bitmap字幕流作为输入:

它会被转化成一个在文件中跟最大尺寸相同的视频,或者720x576,如果当前没有视频的话。

注意,这是一个实验中和临时的解决方案。

一旦libavfilter有合适的字幕支持,它会被删除。

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

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 预设文件

一个文件包含一个 选项=值 对序列,每行一个,指定一个,难以在命令行中指定的选项序列。

以‘#‘开头的行被忽略,并被用作提供注释。

检查预设的目录,例如,在FFmpeg的源码树。

预设文件由vpre, apre, spre, 和 fpre选项指定。

fpre选项取得预设文件名而不是作为输入的一个预设名称,并且能被用于任何的编码。

vpre, apre, 和 spre选项,被一个预设文件指定的选项被应用到当前选项相同预设选项类型的编码。

传递给pre, apre, 和 spre预设选项的参数,标示了使用下列规则使用的预设文件:

首先,ffmpeg搜索一个名叫arg的文件。

ffpreset 在$FFMPEG_DATADIR目录(如果设置过),$HOME/.ffmpeg和在配置时的数据目录(通常PREFIX/share/ffmpeg)或在一个ffpresets文件夹跟可执行程序在一起的那个win32文件夹。

例如,付过参数是libvpx-1080p,它会搜索libvpx-1080p.ffpreset文件。

如果没有发现文件,那么ffmpeg会搜索一个名叫codec_name-arg的文件。

ffpreset 在上面提到的目录,那里codec_name是预设文件选项会被应用到的编码名称。

例如,如果你用-vcodec libvpx和-vpre 1080p选项,选择视频编码,那么它会搜索libvpx-1080p.ffpreset文件。

6 提示

对于在非常低比特率的流,使用一个低帧率且,一个小GOP尺寸。

对于RealVideo,这是尤其确定的,linux播放器好像不能太快,因此,它会失帧。

一个例子是:

ffmpeg -g 3 -r 3 -t 10 -b:v 50k -s qcif -f rv10 /tmp/b.rm

参数‘q‘,它挡编码的时候呈现,是当前的 量化器

值1表示会达到一个非常好的质量,值31表示最差质量。

如果q=31出现的太频繁,它意味着编码器不能足够充分的压缩,以符合你的比特率。

你必须要么增加比特率,减少帧率或者减少帧的尺寸。

如果你的计算机的速度不够快,你可以加快在压缩比的压缩的消耗。

你能使用‘-me zero‘加速运动估计,和使用‘-g 0‘来完全禁用运动估计(你仅有I-frames,这意味着它和JPEG压缩一样的好)

为获得很低的音频比特率,减少采样频率(对于MPEG音频,减少至22050 Hz,对于AC-3,减少至22050 或 11025)。

为获得一个恒定的质量(但是一个变化的比特率),使用选项‘-qscale n‘,当‘n‘是在1(最好质量)和31(最差质量)之间时。

7 举例

7.1 预设文件

一个预设文件,包含一个 选项=值对 的序列,每行一个,指定一个选项序列。该选项序列也能在命令行里被指定。

以字符‘#‘开头的行被忽略,并且被用于提供注释。

空行也是被忽略的。例如,检查在FFmpeg源代码树里的预设目录。

预设文件被pre选项指定,该选项获取一个预设名称作为输入。

FFmpeg 搜索一个名叫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

或者用一个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选项指定图像的尺寸。

你能从一个原始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到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-frames因此MPEG-4流是兼容DivX5的,并且GOP大小是300,这意味着每10秒一个intra帧,大约29.97fps的输入视频。

此外,MP3编码的音频流,你需要通过使瘸腿的支持——enable-libmp3lame配置。

此外,MP3编码的音频流,你需要通过传递--enable-libmp3lame到配置,来启用LAME支持。

对于DVD 转码获取想要的音频语言来说,映射是相当有用的。

注意:参照支持的输入格式,使用ffmpeg -formats.

你可以从一个视频中提取图像,或者从很多图像中创建视频:

对于,从视频中提取图像:

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

这会从视频中每秒提取一个视频帧,并且以文件的形式输出它们,命名为foo-001.jpeg, foo-002.jpeg, 等。

图像将被重新调整以适应新的分辩率值。

如果你想提取的只是一个有限数量的帧,可以结合上面的命令使用vframes或-t选项,或结合上面的命令使用-ss开始从一个特定的时间点提取。

从很多图像中创建一个视频:

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

语法foo-%03d.jpeg表示用由三个用零填充的数字组成的一个十进制数来表示序列号。

它支持于C printf 函数相似的语法,但只适用于接受普通整数。

当导入一个图片序列,-i 内部也支持扩展像shell通配符表达式(全局),通过选择image2-specific -pattern_type全局选项。

例如,对于,从匹配全局表达式foo-*.jpeg的文件名创建一个视频:

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,会包含来自输入文件的以反向顺序排列的头四个流。

强制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

时间: 2024-10-05 04:58:51

ffmpeg的总体认识的相关文章

ffmpeg.c函数结构简单分析(画图)

前一阵子研究转码的时候看了FFmpeg的源代码.由于ffmpeg.c的代码相对比较长,而且其中有相当一部分是AVFilter有关的代码(这一部分一直不太熟),因此之前学习FFmpeg的时候一直也没有好好看一下其源代码.最近正好看了看AVFilter的知识,顺便就看了下FFmpeg的源代码,在这里画图理一下它的结构.目前好多地方还没有弄明白,等到以后慢慢完善了. 先说明一下自己画的结构图的规则:图中仅画出了比较重要的函数之间的调用关系.粉红色的函数是FFmpeg编解码类库(libavcodec,l

WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

总述 在前一篇文章中,讲解了如何将OPENH264编解码器集成到WebRTC中,但是OPENH264只能编码baseline的H264视频,而且就编码质量而言,还是X264最好,本文就来讲解一下如何将X264编码器集成到WebRTC中,为了实现解码,同时要用到ffmpeg.总体流程和之前一样,分为重新封装编解码器和注册调用两大步骤,注册调用这一步没有任何不同,主要是重新封装这一步骤有较大区别. 重新封装X264编码功能 首先当然还是要下载X264源码编译出相应的库以供调用.在windows下使用

FFmpeg在Linux下安装编译过程

转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52402759 今天介绍下FFmpeg在Linux下安装编译过程,用的是CentOS, 总体过程比较顺利,就是在ffmpeg等的时间稍长点.没什么技术难点.仅当记录. 关于FFmpeg FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包

FFMPEG视音频编解码零基础学习方法-b

感谢大神分享,虽然现在还看不懂,留着大家一起看啦 PS:有不少人不清楚“FFmpeg”应该怎么读.它读作“ef ef em peg” 0. 背景知识 本章主要介绍一下FFMPEG都用在了哪里(在这里仅列几个我所知的,其实远比这个多).说白了就是为了说明:FFMPEG是非常重要的. 使用FFMPEG作为内核视频播放器: Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音... 使用FFMPEG作为内核的Directshow Filter: ffdshow,lav fil

FFmpeg 数据结构解析

最近在做媒体盒子的项目,接触到音视频的编解码,于是开始研究FFmpeg的研究之旅. 记得有大牛说过show me your data ,那么就从数据结构开始吧. 先通过下图对各个结构结构有个总体的认识,再具体的分析: AVCodecContext 这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息. 如下列出了部分比较重要的域: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

windows 下FFMPEG的编译方法 附2012-9-19发布的FFMPEG编译好的SDK下载

经过一晚上加一上午的奋斗,终于成功编译出了最新版的FFMPEG,下面是我编译的心得,因为是最新的,应该会对大家有用,编译的FFMPEG的版本是0.11.2,2012-09-19新发布的版本 平台:WINDOWS XP,MinGW+MSYS 一.下载FFMPEG 大家可以到FFMPEG官网上去下载最新版:http://ffmpeg.org/download.html现在的最新版就是我编译的版本: 其实我更喜欢下面这个地址,直接列出来所有的供下载的版本:http://ffmpeg.org/relea

FFmpeg学习6:视音频同步

在上一篇文章中,视频和音频是各自独立播放的,并不同步.本文主要描述了如何以音频的播放时长为基准,将视频同步到音频上以实现视音频的同步播放的.主要有以下几个方面的内容 视音频同步的简单介绍 DTS 和 PTS 计算视频中Frame的显示时间 获取Audio clock(audio的播放时长) 将视频同步到音频上,实现视音频同步播放 视音频同步简单介绍 一般来说,视频同步指的是视频和音频同步,也就是说播放的声音要和当前显示的画面保持一致.想象以下,看一部电影的时候只看到人物嘴动没有声音传出:或者画面

FFMPEG视音频编解码零基础学习方法

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大,不太适合刚接

基于ffmpeg网络播放器的教程与总结

基于ffmpeg网络播放器的教程与总结 一.         概述 为了解决在线无广告播放youku网上的视频.(youku把每个视频切换成若干个小视频). 视频资源解析可以从www.flvcd.com获取,此网站根据你输入的优酷的播放网页地址解析成若干个真实的视频地址. 二.         实现 首先搜索关闭网络播放器(流媒体播放器的实现方法) 得出的结论,目前主流的播放器分三大阵营微软,苹果,基于FFmpeg内核的.所以我决定从ffmpeg开源的播放器入手. 最出名的ffmpeg播放器vc