FFMPEG中文文档
FFMPEG中文文档
转自:https://www.jianshu.com/p/da47b00c42ce
0. 常用参数
主要参数:
- -i——设置输入文件名。
- -f——设置输出格式。
- -y——若输出文件已存在时则覆盖文件。
- -fs——超过指定的文件大小时则结束转换。
- -t——指定输出文件的持续时间,以秒为单位。
- -ss——从指定时间开始转换,以秒为单位。
- -t——从-ss时间开始转换(如-ss 00:00:01.00 -t 00:00:10.00即从00:00:01.00开始到00:00:11.00)。
- -title——设置标题。
- -timestamp——设置时间戳。
- -vsync——增减Frame使影音同步。
- -c——指定输出文件的编码。
- -metadata——更改输出文件的元数据。
- -help——查看帮助信息
影像参数:
- -b:v——设置影像流量,默认为200Kbit/秒。(单位请引用下方注意事项)
- -r——设置帧率值,默认为25。
- -s——设置画面的宽与高。
- -aspect——设置画面的比例。
- -vn——不处理影像,于仅针对声音做处理时使用。
- -vcodec( -c:v )——设置影像影像编解码器,未设置时则使用与输入文件相同之编解码器。
声音参数:
- -b:a——设置每Channel(最近的SVN版为所有Channel的总合)的流量。(单位请引用下方注意事项)
- -ar——设置采样率。
- -ac——设置声音的Channel数。
- -acodec ( -c:a ) ——设置声音编解码器,未设置时与影像相同,使用与输入文件相同之编解码器。
- -an——不处理声音,于仅针对影像做处理时使用。
- -vol——设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推。)
1. 概要
ffmpeg [global_options] {[input_file_options] -i INPUT_FILE} … {[output_file_options] OUTPUT_FILE} …}
2. 说明
ffmppeg是一个非常快的视频和音频转换器,还可以抓取实时的音频/视频流。它可以在任意的采样率之间的转换和调整视频,并同时使用高品质的多相滤波器。
ffmppeg从输入“文件”(其可以是常规文件,管道,网络流,录制装置等),由指定任意数量的读取 -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. 详细描述
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🅰️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中,按元数据匹配仅能用于输入文件。
6. 提示
为在非常低的比特率流,使用低帧速率和小的GOP大小。这对于那些配置较低的Linux用户上播放RealVideo尤是如此,它可能会丢帧。例如:
ffmpeg -g 3 -r 3 -t 10 -b:v 50k -s qcif -f rv10 /tmp/b.rm
编码中显示的参数“q”是当前量化器。值1表示非常良好的质量。值31表示最差的质量。如果Q = 31出现过于频繁,这意味着该编码器无法压缩到满足您的比特率要求的码率。您必须增加比特率,降低帧率或减少帧的大小。
如果你的电脑不够快,可以牺牲压缩比换取速度。你可以用-me 0加快运动估计和-g 0完全禁用运动估计(你仅有I-frames,这意味着它几乎和JPEG压缩一样好)。
可通过降低采样频率获得非常低的音频比特率(对于MPEG音频,下降到22050Hz,对于AC-3, 使用22050或11025Hz)。
有一个恒定的质量(但可变比特率),使用选项-qscale N时,N是1(优秀品质)和31(质量最差)之间。
7. 范例
8. 参见
ffmpeg-all , ffplay , ffprobe , ffserver , ffmpeg-utils , ffmpeg-scaler , ffmpeg-resampler , ffmpeg-codecs , ffmpeg-bitstream-filters , ffmpeg-formats , ffmpeg-devices , ffmpeg-protocols , ffmpeg-filters