命令语法
ffmpeg [全局选项] {[输入文件选项] -i 输入文件} … {[输出文件选项] 输出文件} …
流拷贝
流拷贝(Stream copy)是一种对指定流数据仅仅进行复制的拷贝(copy)模式。这种情况下ffmpeg不会对指定流进行解码和编码步骤,而仅仅是分离和混合数据包。
常规选项
常规选项也可以用在ffmpeg项目中其他ff*工具,例如ffplayer
-h:显示帮助,一个附加选项可以指定帮助显示的模式,如果没有参数,则是基本选项
- long:在基本选项说明基础上增加高级选项说明
- full:输出完整的选项列表,包括编(解)码器,分离器混合器以及滤镜等等的共享和私有选项
- decoder=decoder_name:输出指定解码器名的详细信息。-decoders来获取支持的所有解码器名
- encoder=encoder_name:输出指定编码器名的详细信息。-encoders来获取支持的所有编码器名
- demuxer=demuxer_name:输出指定分离器名详细信息。-formats来获取支持的所有分离器和混合器
- muxer=muxer_name:输出指定混合器名详细信息。
- filter=filter_name:输出指定滤镜名的详细信息。-filters来获取支持的所有滤镜
-devices:显示有效设备
-protocols:显示支持的协议
-pix_fmts:显示有效的像素(pixel)格式
-sample_fmts:显示有效的采样格式
-layouts:显示信道名字和信道布局
-v loglevel :设置日志层次。日志层级是一个字符串或数值,有以下可能值
- quiet,-8,什么都不输出,是无声的
- panic,0,仅显示造成进程失败的致命错误,它当前不能使用
- fatal,8,仅仅显示致命错误,这些错误使得处理不能继续
- error,16,显示所有的错误,包括可以回收的错误(进程还可以继续的)
- warning,24,显示所有警告和错误,任何错误或者意外事件相关信息均被显示
- info,32,显示过程中的信息,还包括警告和错误,则是默认值
- verbose,40,类似info,但更冗长
- debug,48,显示所有,包括调试信息
- trace,56
-report:复制所有命令行和控制台输出到当前目录下名为program-YYYMMDD-HHMMSS.log文件中。这常用于报告bug,所以一般会同时设置-v loglevel
AV选项
这些选项由特定的库提供(如libavformat,libavdevice以及libavcodec)。它们可以指定下面2个分类:
- generic(常规):这类选项可以用于设置 容器、设备、编码器、解码器等。通用选项对列在AVFormatContext中的容器/设备以及AVCodecContext中的编码有效。
- private(私有):这类仅对特定的容器、设备或者编码有效。私有选项由相应的 容器/设备/编码 指定。
所有编码AV选项是针对单独流的,所以必须详细指定。
注意-nooption语法不能被用于AV选项中的布尔值项目,而必须使用-option 0/-option 1
主要选项:
- -f fmt (input/output) :指定输入或者输出文件格式。常规可省略而使用依据扩展名的自动指定,但一些选项需要强制明确设定。
- -i filename (input):指定输入文件
- -y (global):默认自动覆盖输出文件,而不再询问确认。
- -n (global):不覆盖输出文件,如果输出文件已经存在则立即退出
- -c | codec[:stream_specifier] codec (input/output,per-stream)
为特定的文件选择编/解码模式,对于输出文件就是编码器,对于输入或者某个流就是解码器。选项参数中codec是编解码器的名字,或者是copy(仅对输出文件)则意味着流数据直接复制而不再编码。
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
使用libx264编码所有的视频流,然后复制所有的音频流
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
输出文件中第2视频流按libx264编码,第138音频流按libvorbis编码,其余都直接复制输出
- -t duration (input/output):限制输入/输出的时间。如果是在-i前面,就是限定从输入中读取多少时间的数据;如果是用于限定输出文件,则表示写入多少时间数据后就停止。duration可以是以秒为单位的数值或者 hh:mm:ss[.xxx]格式的时间值。
- -fs limit_size (output):设置输出文件大小限制,单位是字节(bytes)。
- -ss position (input/output) :当在-i前,表示定位输入文件到position指定的位置,注意可能一些格式是不支持精确定位的,所以ffmpeg可能是定位到最接近position(在之前)的可定位点;当用于输出文件时,会解码丢弃position对应时间码前的输入文件数据;position可以是以秒为单位的数值或者 hh:mm:ss[.xxx]格式的时间值。
- -taget type (output):指定目标文件类型(vcd,svcd,dvd,dv,dv50)。
- frames[:stream_specifier] framecount (output,per-stream):在指定计数帧后停止写入数据。
- -q | qscale [:stream_specifier] q (output,per-stream)。
使用固定的质量品质(VBR)。用于指定q | qscale编码依赖。如果qscale没有跟stream_specifier则只适用于视频。其中值q取值在0.01-255,越小质量越好。 - -debug_ts (global):打印时间码信息,默认是禁止的。这个选项对于测试或者调试是非常有用的特性,或者用于从一种格式切换到另外的格式(包括特性)的时间成本分析。
视频选项
- -vframes number (output):设置输出文件的帧数,是-frames:v的别名。
- -r[:stream_specifier] fps (input/output,per-stream):设置帧率。
在作为输入选项时,会忽略文件中存储的时间戳和时间戳而产生的假设恒定帧率fps,即强制按设定帧率处理视频产生(快进/减缓效果)。作为输出选项时,会复制或者丢弃输入中个别的帧以满足设定达到fps要求的帧率。 - s[:stream_specifier] size (input/output,per-stream):设置帧的尺寸。
数据的格式是wxh,即宽度值X高度值,例如320x240,默认同源尺寸。 - aspect[:stream_specifier] aspect (output,per-stream):指定视频的纵横比。aspect是一个浮点数字符串或者num:den格式字符串(其值就是num/den),例如”4:3”,”16:9”,”1.3333”以及”1.7777”都是常用参数值。
- -vn (output):禁止输出视频。
- -vcodec codec (output):设置视频编码器,这是-codec:v的一个别名。
- -c copy:直接将输入流拷贝到输出,仅涉及解复用和复用,不涉及解码和编码
- -vf filtergraph (output):创建一个filtergraph的滤镜链并作用在流上。它实为-filter:v的别名。
- -pix_fmt[:stream_specifier] format (input/output,per-stream):设置像素格式。
如果设置的像素格式不能被选中(启用),则ffmpeg会输出一个警告和并选择这个编码最好(兼容)的像素格式。如果pix_fmt前面前导了一个+字符,ffmepg会在要求的像素格式不被支持时退出,这也意味着滤镜中的自动转换也会被禁止。 - -vstats:复制视频编码统计分析到日志文件vstats_HHMMSS.log。
音频选项
- -aframes number (output):设置number音频帧输出,是-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):禁止输出音频。
- -acode codec (input/output):设置音频解码/编码的编/解码器,是-codec:a的别名。
- -sample_fmt[:stream_specifier] sample_fmt (output,per-stream):设置音频样例格式。使用-sample_fmts可以获取所有支持的样例格式。
- -af filtergraph (output):对音频使用filtergraph滤镜效果,其是-filter:a的别名。
字幕选项
- -scodec codec (input/output):设置字幕解码器,是-codec:s的别名。
- -sn (output):禁止输出字幕。
- -canvas_size size:设置字幕渲染区域的尺寸(位置)
高级选项
- -ignore_unknown:如果流的类型未知则忽略,而不进行复制。
- -copy_unknown:复制类型未知的流。
- -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.chnnel_id会映射一个静音通道。
例如INPUT是一个立体声音频文件,你可以分别选择两个音频通道(下面实际上对于输入是交换了2个音频通道顺序进行输出):
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
对每个输入通道指派输出以分离整个输入文件:
ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1
- -benchmark_all (global):在编码过程中持续显示基准信息,则包括CPU使用时间(音频/视频的编/解码)。
- -dump (global):复制每个输入包到标准输出设备。
- -re (input):以指定帧率读取输入。通常用于模拟一个硬件设备,例如在直播输入流(这时是读取一个文件)。不应该在实际设备或者在直播输入中使用(因为这将导致数据包的丢弃)。默认ffmpeg会尽量以最高可能的帧率读取。这个选项可以降低从输入读取的帧率,这常用于实时输出(例如直播流)。
- -loop number_of_times:重复播放number_of_times次。0表示持续重复而不停止。
- -sdp_file file (global):输出sdp信息到文件file。它会在至少一个输出不是rtp流时同时输出sdp信息。
- -discard (input):允许丢弃特定的流或者分离出的流上的部分帧,但不是所有的分离器都支持这个特性。
none:不丢帧
default:丢弃无效帧
noref:丢弃所有非参考帧
bidir:丢弃所有双向帧
nokey:丢弃所有非关键帧
all:丢弃所有帧 - -xerror (global):在出错时停止并退出。