ffmpeg的中文文档(二)
Posted on 26 Dec 2014 ffmpegDocuments 添加评论好像这个文档不是很有用的样子,虽然很详细,但是常用的功能介绍也很少。看起来还不如弄个常用命令列表来得给力。不过已经弄完一半多了,索性弄完吧! 由于内容长度过长,第一部分的内容,点此查看。
5.3 AVOption选项
这些选项直接由libavformat
,libavdevice
和libavcodec
库提供。要查看可用AVOption的列表,请使用-help
选项。它们被分为两类:
generic 这些选项可以为任何容器,编解码器或设备进行设置。通用的选项都列在AVFormatContext选择容器/设备和AVCodecContext选择编解码器小节。
private 这些选项是作用于给定的容器,装置或编解码器。私有选项列在其相应的容器/设备/编解码器。
比如编辑ID3v2.3头而不是默认的ID3v2.4到MP3文件,使用MP3混合器的id3v2_version
私有选项:
ffmpeg -i input.flac -id3v2_version 3 out.mp3
所有编解码器AVOption选项是按流指定的,并且因此应该指定相应的流标识符。
注: -nooption
语法不能用于布尔AVOption选项,请使用-option 0/-option 1
。
注:老的前缀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 (仅输出),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 duration (input/output)
当作为输入选项(在-i
之前 ),限制从输入文件中读取数据的duration
。
当作为输出选项(输出文件名之前)使用,在达到duration
后停止写入输出文件。
duration
可能是以秒为单位,或以hh:mm:ss[.xxx]
形式出现。
-to
和-t
是相互排斥的,-t
具有优先权。
-to position (output)
在position
位置停止输出。 position
可能是一个表示秒数的数,或hh:mm:ss[.xxx]
形式。
-to
和-t
是相互排斥的,-t
具有优先权。
-fs limit_size (output)
设置文件大小限制,以字节表示。
-ss position (input/output)
当用作输入选项一起使用(在-i
以前),跳转到输入文件中position
位置。请注意,在大多数的格式是不可能确切定位,这样ffmpeg将寻求最接近的position
位置点。当转码和-accurate_seek
启用(默认设置),寻找点和position
位置之间的附加段将被解码并丢弃。当进行流复制或当-noaccurate_seek
被使用时,它都将被保留。
当用作输出选项(在输出文件名前),解码但丢弃输入直到时间戳到达的位置。
position
位置可以是秒数或hh:mm:ss[.xxx]形式。
-itsoffset offset (input)
设置输入时间偏移。
offset
必须是持续时间规范,请参阅(ffmpeg-utils)在FFmpeg-utils(1)手动的持续时间段的相关内容 。
偏移被添加到输入文件的时间戳。指定一个正偏移意味着相应流将延迟offset所指定的时间。
-timestamp date (output)
设置在容器内记录的时间戳。
date必须是一个规范的持续时间,请参阅(ffmpeg-utils)在FFmpeg-utils的(1)日期部分 。
-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-
或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
联用,那么它仅适用于视频流,这是为了保持兼容性。另外将相同的编码器参数赋给两个不同的编解码器通常并不是用户想要的,因此若需要这样的功能,可以使用流标识符(stream_specifier
)来指定。
-filter[:stream_specifier] filtergraph (output,per-stream)
创建由FilterGraph指定的滤镜组并使用它。
FilterGraph是作用于流的滤镜组的描述,而且必须有一个单一的输入和同一类型的数据流输出。
在滤镜组里,输入被关联到in
标签 ,输出到out
标签 。关于ffmpeg滤镜组的语法可参见ffmpeg-filters的手册。
如果你想创建具有多个输入或输出的滤镜组,参见-filter_complex
的相关选项。
-filter_script[:stream_specifier] filename (output,per-stream)
这个选项类似于-filter
,唯一的区别是,它的参数是滤镜组所在的文件名。
-pre[:stream_specifier] preset_name (output,per-stream)
指定匹配流(S)的预设。
-stats (global)
打印编码进度/统计数据。这是默认值,你可通过指定-nostats
禁用 。
-progress url (global)
发送程序友好的进展信息到url
进度信息大约每秒和编码过程结束后写入。它是由key = value
行组成。 key只能包含字母和数字字符。最后一个关键字序列始终是progress
。
-stdin
启用标准输入交互。这是默认设置,除非标准输入被作为输入。要明确禁用互动,你需要指定-nostdin
。
在标准输入禁用相互作用是很有用的,例如,如果ffmpeg在后台进程组中。大致相同的结果可以用ffmpeg ... < /dev/null
实现,但它需要一个终端。
-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
的文件。如果filename
是空的,那么元数据标签中的filename
标签的值将被使用。
例如,提取第一附件到“out.ttf”:
`ffmpeg -dump_attachment:t:0 out.ttf -i INPUT`
提取所有附件,并按照filename 标签命名文件:
`ffmpeg -dump_attachment:t "" -i INPUT`
技术说明 - 附件是通过编解码器额外数据实现的,所以这个选项实际上可以用来提取任意额外数据,而不仅仅是附件。
5.5 视频选项
-vframes number (output)
设置视频帧的输出数量。这是的-frames:v
别名 。
-r[:stream_specifier] fps (input/output,per-stream)
设置帧速率(Hz值,分数或缩写)。
作为输入选项,忽略存储在文件中的任何时间戳,而是产生时间戳假设恒定的帧速率fps这与一些输入格式,诸如image2或者v4l2,中的-framerate
选项是不同的(在老版本的ffmpeg中是一样的)。如有疑问,使用的输入选项-framerate
代替-r
。
作为输出选项,复制或删除输入帧以达到恒定的输出帧速率fps。
-s[:stream_specifier] size (input/output,per-stream)
设置帧尺寸。
作为输入的选项,这是私有选项video_size
的快捷方式,部分分流器可以识别该参数,这时帧大小或者未存储在文件中或不可配置,例如原始视频或视频采集卡。
作为输出的选择,这将插入scale
视频滤镜到相应滤镜组的末端 。如需改变滤镜位置,请将scale
滤镜直接插入到开头或其他地方。
格式是wxh
(默认值是使用与源相同的尺寸)。
-aspect[:stream_specifier] aspect (output,per-stream)
设置指定视频显示的宽高比aspect
。
aspect
可以是一个浮点数,或使用形如 num: den
的形式,其中num
是分子,den
是分母。例如,“4:3”,“16:9”,“1.3333”,和“1.7777”都是有效的参数值。
如果与-vcodec copy
一起使用,这会影响储存在容器级别的宽高比,而不是存储在编码帧的宽高比,如果有的话。
-vn (output)
禁用视频录制。
-vcodec codec (output)
设置视频编解码器。这是-codec:v的别名。
-pass[:stream_specifier] n (output,per-stream)
选择通过次数(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[:stream_specifier] prefix (output,per-stream)
设置二次编码的日志文件名 前缀为prefix
,默认的文件名 前缀是ffmpeg2pass
。完整的文件名 将是PREFIX-N.log
,其中N
是一个输出流的特定数字
-vf filtergraph (output)
创建由filtergraph
指定的滤镜组,并使用它。
这是-filter:v
的别名 ,参见-filter
选项。
5.6 高级视频选项
-pix_fmt[:stream_specifier] format (input/output,per-stream)
设置的像素格式。使用-pix_fmts
显示所有支持的像素格式。如果所选择的像素格式不能被选择,ffmpeg将打印警告,并选择由编码器所支持的最好的像素格式。如果pix_fmt
前缀+
,如果请求的像素格式不能被选中,ffmpeg会出现错误退出,同时滤镜组中的自动转换将被禁用。如果pix_fmt
是一个单一的+
,ffmpeg的选择与输入或者滤镜输出相同的像素格式,并将禁用自动转换。
-sws_flags flags (input/output)
设置软件缩放的标志。
-vdt n
丢弃的阈值。
-rc_override[:stream_specifier] override (output,per-stream)
覆盖特定的时间间隔内的帧率控制,格式为用斜杠分隔的“整型,整型,整型”列表。前两个值是在开始和结束帧编号,最后一个如果是正数,则为量化器;负数则为品质因数。
-ilme
支持编码器force interlacing(仅对MPEG-2和MPEG-4有效)。如果你的输入文件是隔行并要保持隔行格式最小损失,请使用此选项。另一种方法是使用-deinterlace
反交错输入流,但这会引入损失。
-psnr
计算压缩帧的PSNR(伪信噪比)。
-vstats
输出视频编码统计到vstats_HHMMSS.log
。
-vstats_file 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`
expr
中可以包含以下常量:
`n`
当前处理的帧的数量,从0开始
`n_forced`
强制帧的数量
`prev_forced_n`
先前强制帧的数目,当没有强制的关键帧时,它是NAN
`prev_forced_t`
先前强制帧的时间,当没有强制关键帧时,它是NAN
`t`
当前处理的帧的时间
例如每5秒强制插入一个关键帧,你可以使用:
`-force_key_frames expr:gte(t,n_forced*5)`
自13秒开始,强制插入一个关键帧在上一强制关键帧后5秒:
`-1-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))`
需要注意的是太多强制的关键帧对某些编码器的超前算法是非常有害的:使用固定的GOP选项或类似选项会更有效。
-copyinkf[:stream_specifier] (output,per-stream)
当复制流时,也复制起始处的非关键帧。
-hwaccel[:stream_specifier] hwaccel (input,per-stream)
使用硬件加速解码匹配流。hwaccel
的允许值包括:
`none`
不要使用任何硬件加速(默认)。
`auto`
自动选择硬件加速的方法。
`vda`
使用苹果VDA硬件加速。
`vdpau`
使用VDPAU(视频解码和演示API对于Unix)硬件加速。
`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)
设置音频采样频率。对于输出流,将默认设置为相应的输入流的采样频率。对于输入流该选项仅对音频抓取设备和raw格式分流器和映射到相应分流器上的选项有效。
-aq q (output)
设置音频质量(与编解码器有关,VBR)。这是-q:a
的别名。
-ac[:stream_specifier] channels (input/output,per-stream)
设置音频通道的数目。输出流默认将设置为输入音频信道的数目。对于输入流该选项仅对音频抓取设备和raw格式分流器和映射到相应分流器上的选项有效。
-an (output)
禁用录音。
-acodec codec (input/output)
设置音频解码器。这是-codec:a
的别名。
-sample_fmt[:stream_specifier] sample_fmt (output,per-stream)
设置音频样本格式。使用-sample_fmts
得到支持的采样格式的列表。
-af filtergraph (output)
创建由FilterGraph指定的滤镜组并使用它。
这是-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
,则使用单声道,如果是2,则使用立体声,如此等等)。如果输入和输出信道的布局不匹配(例如2个-map_channel
和-ac 6
),联合使用-map_channel
和-ac
将更新声道的增益水平。
您也可以提取各个输入通道到特定的输出;以下命令中提取的两个通道的INPUT音频流(文件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:1 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg
注意,目前每个输出流只能包含来自单个输入流的声道;不能使用-map_channel
从不同的数据流提取的多个输入音频声道(来自相同的或不同的文件),并将它们合并成一个单一的输出流。因此,目前不可能完成例如把两个单独的单声道流成一个单一的立体声流的任务。然而,拆分立体声流分成两个单信道单声道流则是可能的。
如果你需要这个功能,一个可能的解决方法是使用amerge
滤镜。例如,如果你需要用2个单声道音频融合媒体中的(在这里是input.mkv)流成一个单一的立体声声道音频流(并保持视频流),可以使用下面的命令:
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)
由于内容长度过长,之后的内容将新开文章,点此查看第三部分。