FFmpeg 命令

ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_optionsoutput_file} ...

输入输出文件前可加路径,并且斜杠(/)和反斜杠(\)均可。

查看文件信息:

ffprobe input.mkv

ffmpeg -i input.mkv

文件中的流的索引,2:3 第3个输入文件中的第4个流

设置输出文件的视频比特率为64kbit/s:

ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi

-b:v设置的视频比特率为额定码率,即最大码率

设置输出文件帧率为24fps:

ffmpeg -i input.avi -r 24 output.avi

设置输入文件(只对原始格式有效)的帧率为1fps,输出文件的帧率为24fps:

ffmpeg -r 1 -i input.m2v -r 24 output.avi

如果输入为YUV文件,要指定分辨率:

ffmpeg -r 1 -s 352x288 -i input_cif.yuv -r 24 output.avi

布尔选项:通过在选项名前加”no“前缀设置为假。如:“-nofoo”。


流区分符是附加在选项名后面的字符串,它与选项名之间用冒号隔开。例如:-codec:a:1 ac3 包含了 a:1 流区分符,它会匹配第二个音频流。因此,它会为第二个音频流选择 ac3 编解码器。

一个流区分符可以匹配几个流。例如:-b:a 128k 中的流区分符会匹配所有音频流。

一个空的流区分符会匹配所有流。例如:-codec copy 或 -codec: copy 会复制所有流而不用重编码。

流区分符的形式有如下几种:

1、stream_index 

      用这个索引匹配流。例如:-threads:1 4 为第二个流设置 thread count 为4。

2、stream_type[:stream_index] 

      stream_type 是以下之一:‘v’代表视频,‘a’代表音频,‘s’代表字幕,‘t’代表附加信息。如果 stream_index 没有给定,则会匹配所有该类型的流。

3、p:program_id[:stream_index]

4、#stream_id or i:stream_id

5、m:key[:value]


-t duration (input/output)

当被用作输入选项时(在 -i 之前),限定从输入文件读取的数据的持续时间;当被用作输出选项时(在输出文件名之前),同理。duration  可以是以秒为单位的数字,或者是 hh:mm:ss[.xxx]

-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 时,它将被保存。当用作输出选项(在输出文件名之前)时,解码但要丢弃输入直到时间戳到达positionposition 可以是以秒为单位的数字,或者是 hh:mm:ss[.xxx]


主要选项

-f fmt (input/output)

指定输入或输出文件格式。

-y (global)

不询问直接覆盖输出文件。

-n (global)

不覆盖输出文件,如果指定的输出文件已存在则直接退出。 

-c[:stream_specifiercodec (input/output,per-stream)

-codec[:stream_specifiercodec (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编码,其余流都不用重编码。

-itsoffset offset (input)

设置输入时间偏移。时间偏移被添加到输入文件的时间戳中。指定一个正的偏移意味着相应的流被延迟时间为offset 

-timestamp date (output)

在容器中设置时间戳。

-metadata[:metadata_specifier] key=value (output,per-metadata)

在输出文件中设置标题:

ffmpeg -i in.avi -metadata title="my title" out.flv
设置第一个音频流的语言:
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
-target  type  ( output )

指定目标文件类型(vcdsvcddvddvdv50)。为了用相应的标准,type 可能会有前缀pal-ntsc-、或film-。所有的格式选项(bitrate, codecs, buffer sizes)被自动设置。你只需键入:

ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

有些输入格式,如.mp4

ffmpeg -i myfile.mp4 -target vcd /tmp/vcd.mpg
会有如下提示:

Could not determine norm (PAL/NTSC/NTSC-Film) for target.
Please prefix target with "pal-", "ntsc-" or "film-",
or set a framerate with "-r xxx".


你也能指定附加选项,前提是你知道它们不会和标准冲突,如下:

ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
-dframes  number  ( output )

设置输出的数据帧的数量。

-frames[:stream_specifierframecount (output,per-stream)

输出第一帧:

ffmpeg -i in.avi -f image2 -frames:v 1 img.jpeg

-filter[:stream_specifierfiltergraph (output,per-stream)


视频选项

-vframes number (output)

设置输出的视频帧的数量。如果输入文件包含音频流,输出也会包含音频流。

输出60帧:

ffmpeg -i input.mkv -vframes 60 output.mkv

截取视频中任意时间点(如:12.5秒处)的一帧图像保存为jpg文件:

ffmpeg -ss 12.5 -i input.mkv -vframes 1 output.jpg

-r[:stream_specifierfps (input/output,per-stream)

设置帧率。作为输入选项(只对原始格式有效),存储在文件中的任何时间戳都要被忽略,产生新的时间戳,恒定帧率为fps。作为输出选项,复制输入帧从而得到恒定输出帧率fps

-s[:stream_specifiersize (input/output,per-stream)

设置帧尺寸(分辨率)。格式为“wxh”

-aspect[:stream_specifieraspect (output,per-stream)

设置视频显示宽高比。可以是浮点数。

ffmpeg -i input.mkv -aspect 4:3 output.mkv

-vn (output)

“video no”,丢弃视频

-vcodec codec (output)

设置视频编解码器,和 -codec:v 等效。

-vf filtergraph (output)

-filter:v 等效。

-vstats

视频编码统计信息,生成文件vstats_HHMMSS.log,该选项可以出现在任意位置:

ffmpeg -vstats -i input.mp4 (-vstats) output.mkv (-vstats)
文件中包含的信息如下:
frame=     1 q= 28.0 f_size=  35588 s_size=       35kB time= 0.010 br=  6827.2kbits/s avg_br= 28470.4kbits/s type= I


音频选项

-aframes number (output)

设置输出的音频帧的数量。

-ar[:stream_specifierfreq (input/output,per-stream)

设置音频采样频率。输出流缺省与输入流一致。

以采样率22050将a.wav 转为MPEG音频:

ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2

常用的采样率:

8kHz - 电话所用采样率

11.025kHz - 调幅广播

22.05kHz - 无线电广播所用采样率,调频广播

32kHz - miniDV 数码视频 camcorder、DAT (LP mode)所用采样率

44.1kHz - 音频 CD, 也常用于 MPEG-1 音频(VCD, SVCD, MP3)。以上5种采样率,mp3和aac均支持

47.25kHz - Nippon Columbia (Denon)开发的世界上第一个商用 PCM 录音机所用采样率。mp3、aac不支持该采样率

48kHz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率。mp3支持的最高采样率

50kHz - 二十世纪七十年代后期出现的 3M 和 Soundstream 开发的第一款商用数字录音机所用采样率。

50.4kHz - 三菱 X-80 数字录音机所用所用采样率。

96kHz 或者 192kHz - DVD-Audio、一些 LPCM DVD 音轨BD-ROM(蓝光盘)音轨、和 HD-DVD (高清晰度 DVD)音轨所用所用采样率。aac 支持的最高采样率为96kHz

2.8224MHz - SACD、 索尼和飞利浦联合开发的称为 Direct Stream Digital 的1位 sigma-delta modulation 过程所用采样率。

wma、ogg支持的采样率比较随意,不局限于以上这些固定的采样率

-an (output)

“audio no”,将音频丢弃

ffmpeg -i input.mkv -vcodec copy -an output.mkv

-acodec codec (input/output)

设置音频编解码器,和 -codec:a 等效。

-af filtergraph (output)

-filter:a 等效。


高级选项

-map [-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]] | [linklabel] (output)

第一个-map选项为输出流0指定源,第二个-map选项为输出流1指定源,以此类推。

从第一个输入文件映射所有的流到输出:

ffmpeg -i INPUT -map 0 output
如果第一个输入文件有两个音频流“0:0”和“0:1”,可以用 -map选择输出哪个流:

ffmpeg -i INPUT -map 0:1 out.wav
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 是一个立体声音频文件,可以用以下命令交换这两个音频声道(1声道输出到0声道,0声道输出到1声道):

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",输出的就是单声道;如果有两个,输出的就是立体声)。

可以从一个输入文件提取每个声道到指定的输出。下面的命令提取了输入音频流的两个声道到两个独立的输出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 filter实现该功能)。因此,通常不能将两个独立的单声道流合到一个立体声的流中。然而,可以分离一个立体声的流到两个单声道的流中。

将input.mkv 的2个单声道音频流合到1个立体声的音频流中,同时保持视频流不变:

ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv

注意:这里不可以-c:a copy,音频过滤器和音频流复制不能同时使用。

如果输入包含多声道音频流,还可以进一步选择声道:

ffmpeg -i input.mkv -filter_complex "[0:1:0] [0:2:0] amerge" -c:a pcm_s16le -c:v copy output.mkv

-bsf[:stream_specifierbitstream_filters (output,per-stream)

为匹配流设置比特流过滤器。用-bsfs选项得到比特流过滤器列表。

Bitstream filters:
text2movsub
remove_extra
noise
mov2textsub
mp3decomp
mjpegadump
mjpeg2jpeg
imxdump
h264_mp4toannexb
dump_extra
chomp
aac_adtstoasc

相关文档:http://ffmpeg.org/ffmpeg-bitstream-filters.html

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
-filter_complex  filtergraph  ( global )

定义一个 complex filtergraph(有任意数量的输入/输出 link,注意:不是指输入/输出文件)。无标签的输入link 会被连接到匹配类型中第一个未使用过的输入流。无标签的输出link 会被添加到第一个输出文件。

在视频上覆盖一幅图像:

ffmpeg -i video.mkv -i image.png -filter_complex [0:v][1:v]overlay[out] -map [out] out.mkv

注意:上述命令中,有明确的映射命令 -map [out],则 video.mkv 中的音频流不会映射到 out.mkv。

如果每个输入文件只有一个视频流,则可以省略输入标签,比如上一条命令可等价改写为:

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

注意:由于上述命令中没有映射指令 -map,则 video.mkv 中的音频流会映射到 out.mkv。

overlay filter 的详细介绍:http://ffmpeg.org/ffmpeg-filters.html#overlay-1

产生5秒的纯红视频(以下命令生成的视频默认分辨率为320x240QVGA分辨率):

ffmpeg -filter_complex color=red -t 5 out.mkv


编解码器选项

libavcodec 提供了一些全局选项,可以在所有的编码器和解码器上设置。此外,每个编解码器也可能支持所谓的私有选项。

strict integer (decoding/encoding,audio,video)

指定遵循标准的严格度。

可能的值:

very 2 严格遵循更老的更严格的说明书或参考软件版本

strict 1 严格遵循说明书中的所有东西

normal0

unofficial -1 允许非官方扩展

experimental -2 允许非标准的试验性的(未完成/进行中/没有很好地测试)解码器和编码器。注意:试验性的解码器可能造成安全风险,不要解码不受信任的输入。


音频编码器

aac

Advanced Audio Coding (AAC) encoder.

这个编码器是试验性的AAC编码器,当前只支持AAC-LC(low complexity profile)。要使用该编码器,必须设置strict选项为experimental或更低。

以下两条等价:

ffmpeg -i input.mp3 -c:a aac -strict experimental output.aac

ffmpeg -i input.mp3 -c:a aac -strict -2 output.aac
b

设置比特率(bits/s),自动触发恒定比特率(CBR)模式。

“:a”不能省略,否则不起作用(既不是所设比特率,也没触发CBR模式):

ffmpeg -i input.mp3 -c:a aac -strict -2 -b:a 128k output.aac

视频编码器

libx264, libx264rgb

libx264rgb 编码器和 libx264是一样的,只不过 libx264rgb 接受RGB文件作为输入而不是YUV文件。

refs (ref)

每个P帧能使用的参考帧的数量。范围:0-16


视频和音频文件格式转换

ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
一个输入可以同时对应多个输出:

ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2

-g 300 代表GOP尺寸为300,也就是说,对于帧率为29.97fps的输入视频,每10秒1个 I 帧;-bf 2 代表非B帧之间最多2个B帧:

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

强制输出恒比特率视频,-bufsize是设置码率控制缓冲区的尺寸:

ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v

编解码器选项

integer (encoding,audio,video)

设置比特率,单位为bit/s。缺省值是200K。

ab integer (encoding,audio)

设置音频比特率(bit/s),缺省值是128K。

bt integer (encoding,video)

设置视频比特率。

integer (encoding,video)

设置GOP尺寸,缺省值是12。

ar integer (decoding/encoding,audio)

设置音频采样率(Hz)。

ac integer (decoding/encoding,audio)

设置音频声道数。

bf integer (encoding,video)

设置非B帧之间最大B帧数。必须是-1到16之间的整数,0意味着禁用B帧,-1代表根据编码器选择一个自动值。缺省值为0。


比特流Filters

h264_mp4toannexb

将H.264比特流从长度前缀模式转为起始码前缀模式。有一些流格式要求这种转换,如:MPEG-2传输流格式(”mpegts“)。

将一个包含H.264流的MP4文件转为mpegts格式:

ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts
说明:H.264有2种封装,一种是annexb模式即传统模式,有startcode,SPS和PPS是在ES中;一种是mp4模式,一般mp4、mkv、flv会有,没有startcode,SPS和PPS以及其它信息被封装在容器中,每个帧前面是这个帧的长度。很多解码器只支持annexb这种模式,因此须要转换。

ffmpeg -i INPUT.mkv -codec copy -bsf:v h264_mp4toannexb OUTPUT.avi

mjpeg2jpeg

将MJPEG/AVI1包转为完整的JPEG/JFIF包。

MJPEG是一种视频编解码器,每个视频帧本质上是一幅JPEG图像。单独的帧能被无损提取出来(实际是不完全的JPEG图像,因为缺少了解码所需的DHT段):

ffmpeg -i ../some_mjpeg.avi -c:v copy frames_%d.jpg
以上的 some_mjpeg.avi 暗含视频编码采用mjpeg,所以才直接copy视频流。如果视频流不是mjpeg编码,可通过下面的命令转换:

ffmpeg -i input.avi -c:v mjpeg output.avi

也可以直接对视频流mjpeg重编码输出JPEG图像:

ffmpeg -i input.mp4 -c:v mjpeg frames_%03d.jpg

甚至不用指定视频编码,ffmpeg自动对输入的视频流采用mjpeg重编码,输出的JPEG图像效果与上面的一样:

ffmpeg -i input.mp4 frames_%03d.jpg

同理,还可以生成体积较大的BMP图像,视频编码采用bmp(无损压缩):

ffmpeg -i input.mp4 frames_%03d.bmp

使用mjpeg2jpeg 可生成完全合格的JPEG图像:

ffmpeg -i mjpeg-movie.avi -c:v copy -bsf:v mjpeg2jpeg frame_%d.jpg
执行上一条命令出现如下 错误:

[NULL @ 0000000002acbea0] input is not MJPEG/AVI1

Failed to open bitstream filter mjpeg2jpeg for stream 0 with codec copy: Invalid data found when processing input

[image2 @ 0000000002acb440] Could not get frame filename number 2 from pattern 'frame_d.jpg' (either set updatefirst or use a pattern like %03d within the filename pattern)
av_interleaved_write_frame(): Invalid argument

ffmpeg -i frame_%d.jpg -c:v copy rotated.avi

rotated.avi视频采用mjpeg编码,如果不指定视频编码方式,默认采用mpeg4编码。

noise

损坏包的内容而不损坏容器。能用来测试错误隐藏和容错力。

参数值(大于等于1的实数)代表输出字节被篡改的频度,值越小,字节被篡改得越频繁,1代表每个字节都被篡改(最大程度的篡改):

ffmpeg -i INPUT -c copy -bsf noise=1 output.mkv


解复用器

-formats 显示可用的复用/解复用器列表。

gif

min_delay

设置帧之间最小延迟(以0.01s为单位)。范围:0-6000(即0-60s)。缺省值是2(0.02s)。

max_gif_delay

设置帧之间最大延迟(以0.01s为单位)。范围:0-65535(即0-655.35s)。缺省值是65535(10.9225分钟)。

default_delay

设置帧之间缺省延迟(以0.01s为单位)。范围:0-6000(即0-60s)。缺省值是10(0.1s)。

ignore_loop

GIF文件包含循环特定次数(或无限次)的信息。如果ignore_loop设为1,则输入文件的循环设置将被忽略,从而不会出现循环;如果设为0,则GIF文件信息中循环次数设置有效。缺省值是1。

将一个无限循环的GIF文件覆盖在一个视频上(shortest=1使得输出持续时长与最短输入时长一致):

ffmpeg -i input.mp4 -ignore_loop 0 -i input.gif -filter_complex overlay=shortest=1 out.mkv
image2

图像文件解复用器。

framerate

为视频流设置帧率,缺省值为25。

loop

如果设为1,则输入循环。缺省值为0

pattern_type

可设置为以下几个值:

        none disable模式匹配,视频只包含指定图像。适用于不想从多图像创建序列而且文件名可能包含特殊模式字符的情况。

        sequence 选择一个序列模式类型,用于指定序列号索引的文件序列。

                              模式“img-%03d.bmp”匹配 img-001.bmp, img-002.bmp, … , img-010.bmp, etc. 

                              模式“i%%m%%g-%d.jpg”匹配 i%m%g-1.jpg, i%m%g-2.jpg, … , i%m%g-10.jpg, etc.

                              模式不一定要包含“%d“或”%0Nd“,例如转换单个图像文件:ffmpeg -i img.jpeg img.png

        glob 选择glob通配符模式类型。

pixel_format

设置要读的图像的像素格式。

start_number

设置图像文件模式匹配文件的索引,从该索引开始读取。缺省值为0

ffmpeg -framerate 10 -start_number 20 -i img-%03d.jpeg out.mkv
rawvideo

原始视频解复用器。

framerate

设置输入视频帧率,缺省值是25

pixel_format

设置输入视频像素格式,缺省值是yuv420p

video_size

设置输入视频分辨率,必须明确指定

ffplay -f rawvideo -pixel_format rgb24 -video_size 320x240 -framerate 10 input.raw

复用器

-formats 显示可用的复用/解复用器列表。

gif

动态的GIF复用器。

loop

设置输出的循环次数,-1为不循环,0(缺省值)为无限循环

final_delay

最后一帧之后的延时(单位:厘秒,0.01s)。缺省值是-1,代表与前面的帧之间的延时一致。

编码一个gif,循环10次,每个循环之间延迟5秒:

ffmpeg -framerate 5 -i frame_%03d.jpg -loop 10 -final_delay 500 out.gif
(说明:如果输入的jpg图像分辨率不同,将以最小分辨率为准对原jpg图像进行尺度变换)

注意:GIF格式有一个非常小的时间基:两帧之间的延时不能小于0.01s。

用-s(可任意指定分辨率)进行图像缩放,-r 控制输出帧率(从输入视频每隔一秒提取一帧图像到输出):

ffmpeg -ss 10 -t 5 -i input.mkv -s 320x240 -r 1 out.gif
image2

图像文件复用器

从输入视频每秒提取一帧图像(-vsync 1是为了精确得到所要求的恒定帧率,但省略后未看出差别。由于输出文件扩展名指定了图像文件格式jpeg,image2复用器会被自动选择,所以-f image2也可以省略):

ffmpeg -i in.avi -vsync 1 -r 1 -f image2 img-%03d.jpeg

在输入视频第10秒处提取1帧图像输出:

ffmpeg -ss 10 -i in.avi -frames:v 1 img.jpg
在输入视频第10秒处提取5帧图像输出:

ffmpeg -ss 10 -i in.avi -frames:v 5 img-%d.jpg


输入设备

输入设备如同一个解复用器。

gdigrab

基于 Win32 GDI 的屏幕抓取设备。

两种输入:

desktop

title=window_title

draw_mouse

指定是否画鼠标指针。画指针——1(缺省值);不画指针——0。

framerate

设置抓取帧率,缺省值是 ntsc,相应的帧率是 30000/1001(29.97)。

show_region

设置为1时,会在屏幕上显示被抓取的区域。不适用于抓取单一窗口内容的情况。

video_size

设置视频帧尺寸(http://ffmpeg.org/ffmpeg-utils.html#Video-size)。desktop 缺省时抓取整个屏幕;title=window_title 缺省时抓取整个窗口。

offset_x

抓取区域在屏幕上的横向偏移。

offset_y

抓取区域在屏幕上的纵向偏移。

抓取整个桌面:

ffmpeg -f gdigrab -i desktop out.mpg
在(20,10)处抓取640x480的区域,并将抓取的区域在屏幕上显示出来:

ffmpeg -f gdigrab -show_region 1 -offset_x 20 -offset_y 10 -video_size vga -i desktop out.mpg
抓取名为“Calculator”的窗口:

ffmpeg -f gdigrab -i title=Calculator out.mpg

lavfi

Libavfilter 输入虚拟设备。

lavfi 从 filtergraph 的输出读数据。对于每个 filtergraph 输出,lavfi 都会创建一个相应的流映射到输出文件。目前只支持视频数据。filtergraph 通过选项graph 指定。


Filtering

filtergraph 可以包含多个 filterchain,每个 filterchain 可以包含多个 filter。filterchain 之间用分号(;)分隔,filterchain 中的 filter 之间用逗号(,)分隔。如果 filterchain 没有指定输入 / 输出,则默认使用前面 filterchain 的输出作为输入,并将该 filterchain 自身的输出作为后面 filterchain 的输入。


音频Filters

amerge

将两个或多个音频流混合到一个单一的多声道流中。

选项:inputs 设置输入的数量。缺省是2。

如果第一个输入是2.1声道(FL+FR+LFE),第二个输入是FC+BL+BR,输出将是5.1声道,声道顺序为:a1、a2、b1、a3、b2、b3(a1是第一个输入的第一个声道,b1是第二个输入的第一个声道),这就是5.1声道的顺序。

如果两个输入都是立体声,则输出声道缺省顺序是:a1、a2、b1、b2,声道layout将被任意设为4.0,这可能是也可能不是期望的值。

所有的输入必须有相同的采样率和格式。

如果各个输入的持续时间不同,则输出的持续时间和输入的最短持续时间一致。

将两个单声道文件混合到一个立体声流中:

amovie=left.wav [l] ; amovie=right.mp3 [r] ; [l] [r] amerge

atempo

调整音频播放速度。取值范围:0.5-2.0

将音频的播放速度降低到原来的80%:

ffmpeg -i input.mkv -af atempo=0.8 output.mkv
将音频的播放速度提高到原来的125%:

ffmpeg -i input.mkv -af atempo=1.25 output.mkv
为了突破取值范围的限制,可以使用多个atempo,例如实现3倍速音频(-vn丢弃视频):

ffmpeg -i input.mkv -af atempo=2,atempo=1.5 -vn output.mkv

视频Filters

crop

裁剪输入视频。

drawtext

box

若要把文本框起来,将值设为1,缺省值是0。

boxborderw

设置文本框的边界宽度,缺省值是0,颜色使用 boxcolor。

boxcolor

设置文本框的填充色,缺省为白色。

fontcolor

字体颜色,缺省是黑色。

fontsize

字体大小,缺省值是16。

textfile

包含了想要绘画的文本的文本文件。必须是UTF-8编码。

x

y

文本在视频中的偏移,缺省值是(0,0)。

dar

display aspect ratio,宽高比,

line_h, lh

文本行的高度。

main_h, h, H

输入的高度。

main_w, w, W

输入的宽度。

t

时间戳,以秒为单位。NAN(Not A Number) if the input timestamp is unknown.

text_h, th

文本的高度。

text_w, tw

文本的宽度。

在视频上用华文行楷绘画“测试文本”,字体大小为24,文本坐标为(100,50),文本颜色为黄色,为文本添加紫罗兰色背景,文本和背景的不透明度均为30%:

ffmpeg -i input.mkv -vf drawtext=fontfile='C\:\\Windows\\Fonts\\STXINGKA.TTF':text=测试文本:x=100:y=50:fontsize=24:[email protected]:box=1:boxcolor=[email protected] output.mkv

注意:上述命令中,路径中的冒号(:)和反斜杠(\)要前缀一个反斜杠(\)转义。

在屏幕底端从右向左滚动文本行(假设 file.txt 仅有一行文本):

ffmpeg -i input.mkv -vf drawtext=fontsize=20:fontfile=FreeSerif.ttf:textfile=file.txt:y=h-line_h:x=w-50*t

文本文件内容从屏幕底部出现向上滚动:

ffmpeg -i input.mkv -vf drawtext=fontsize=20:fontfile=FreeSerif.ttf:textfile=file.txt:x=(w-tw)/2:y=h-20*t output.mkv

每3秒显示一次文本,每次显示1秒:

ffmpeg -i input.mkv -vf drawtext=fontfile=FreeSerif.ttf:fontcolor=white:x=100:y=x/dar:enable=lt(mod(t\,3)\,1):text='blink' output.mkv

在右上角显示当前时间:

ffplay input.mkv -vf drawtext=fontfile=arial.ttf:x=w-tw-5:y=5:text='%{localtime\:%H\\\:%M\\\:%S}'

hflip

水平翻转输入视频。

ffmpeg -i in.avi -vf hflip out.avi

hue

改变色调、饱和度、亮度。

h

指定色调角度(单位:度),缺省值是0。

s

指定饱和度,范围:[-10, 10],缺省值是1。设置为10呈现画面色彩的最高纯度;设置为0呈现黑白画面;设置为-10呈现画面反色的最高纯度。

H

指定色调角度(单位:弧度),缺省值是0。

b

指定亮度,范围:[-10, 10],缺省值是0。

相关的常量参数:

n

从0开始的输入帧计数。

pts

输入帧的显示时间戳。

r

输入视频的帧率,如果未知,则不是数字。

t

时间戳(单位:秒),如果未知,则不是数字。

tb

输入视频的时间基。

色调随时间戳周期性变化(周期为1秒),饱和度在0到2之间摆动(周期为1秒):

ffplay -i input.mkv hue="H=2*PI*t: s=sin(2*PI*t)+1"

3秒的饱和度渐强,min(t/3\,1)是取 t/3和1相比较小者:

hue=s=min(t/3\,1)

overlay

x

y

设置 overlay input 在 main input 上的位置,两个参数的缺省值均为0,也就是左上角。

main_w, W

main_h, H

main input 的宽和高。

overlay_w, w

overlay_h, h

overlay input 的宽和高。

每隔3秒交替出现 logo。logo1 出现在左上角,上边和左边各留10像素空隙;logo2 出现在右上角,上边和右边各留10像素空隙

ffmpeg -i input.mkv -i logo1.jpg -i logo2.jpg -filter_complex overlay=x=if(lt(mod(t\,6)\,3)\,10\,NAN):y=10,overlay=x=if(gt(mod(t\,6)\,3)\,W-w-10\,NAN):y=10 output.mkv

pad

给输入图像添加衬垫,并把原始输入置于 x,y  坐标处。

width, w

height, h

指定输出图像的尺寸。如果 width 或 height  的值为0(缺省值就是0),则相应的输入尺寸将被用于输出。

x

y

指定输入图像在填充区域的偏移(缺省值为0)。

color

指定填充区域的颜色(缺省值为 black)。你所需要的颜色在这里:http://ffmpeg.org/ffmpeg-utils.html#Color

in_w ,iw

in_h ,ih

输入视频的宽和高。

输入视频分辨率为768x432,输出视频分辨率为968x532,输入图像在填充区域的偏移为(100,50),填充色为紫罗兰色:

ffmpeg -i input.mkv -vf pad=968:532:100:50:violet output.mkv
效果图: FFmpeg 命令_第1张图片


rotate

以任意角度(用弧度表示)旋转视频。

angle, a

顺时针旋转输入视频的角度。若要逆时针旋转,则设置为负值。缺省值为“0”

顺时针旋转90度:

ffmpeg -i input.mkv -vf rotate=90*PI/180 output.mkv
逆时针旋转90度:

ffmpeg -i input.mkv -vf rotate=-90*PI/180 output.mkv

scale

width, w

height, h

设置输出视频尺寸。-1代表保持宽高比。

in_w,iw

in_h,ih

输入的宽和高。

将输入的水平和垂直分辨率各降低一半输出(iw 是输入的宽度,-1代表保持原始的宽高比):

ffmpeg -i input.mkv -vf scale=iw/2:-1 output.mkv

将输入的宽和高均降为原来的80%输出(要保证表达式的值能被2整除):

ffmpeg -i input.mkv -vf scale=0.8*iw:0.8*ih output.mkv
vflip

垂直翻转视频。

ffmpeg -i in.avi -vf vflip out.avi

视频 Sources

allyuv, color, haldclutsrc, nullsrc, rgbtestsrc, smptebars, smptehdbars, testsrc

smptebars source 会根据 SMPTE Engineering Guideline EG 1-1990 生成一个颜色条 pattern。

testsrc source 会生成一个测试视频 pattern,显示一个颜色 pattern、一个滚动条和一个时间戳。主要用于测试。

size, s

分辨率。该选项语法参考:(ffmpeg-utils)"Video size" section in the ffmpeg-utils manual。缺省值为320x240

rate, r

帧率,缺省值为25。

duration, d

持续时间。

ffmpeg -f lavfi -i smptebars=duration=5:size=1280*720:rate=30 output.mp4


ffmpeg -f lavfi -i testsrc=duration=10:size=1280*720:rate=30 output.mpg


多媒体 Filters

setpts, asetpts

改变输入帧的PTS(presentation timestamp)。setpts 针对视频帧,asetpts 针对音频帧。

视频播放加速1倍,音频保持不变:

ffmpeg -i input.mkv -vf setpts=0.5*PTS output.mkv

注意:上述命令采取了丢帧策略。为避免丢帧,可以把输出帧率设置得高于输入帧率。

视频播放减慢一半:

ffmpeg -i input.mkv -vf setpts=2.0*PTS output.mkv

结合使用音频filter atempo,同时加速视频和音频(2倍速):

ffmpeg -i input.mkv -filter_complex [0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a] -map [v] -map [a] output.mkv

split, asplit

把输入分离成几个完全一样的输出。asplit 针对音频输入,split 针对视频。仅涉及一个参数,用于指定有几个输出,缺省值为2。

两个输出文件包含的两个视频流完全相同:

ffmpeg -i input.mkv -filter_complex split[out0][out1] -map [out0] output0.mkv -map [out1] output1.mkv 
注意:filter graph 的每个输出不能重复映射,如下命令会出现错误:

ffmpeg -i input.mkv -filter_complex split[out0][out1] -map [out0] output0.mkv -map [out0] output1.mkv 
错误:Output with label 'out0' does not exist in any defined filter graph, or was already used elsewhere.

ffmpeg -i input.mkv -filter_complex [0:v]split=3[out0][out1][out2] -map [out0] output0.mkv -map [out1] output1.mkv -map [out2] output2.mkv


多媒体 Sources

amovie

缺省选择一个音频流,除此以外,和movie 源一样。

movie

从一个电影容器读音频和/或视频流。

filename

要读的资源的名称(不一定是一个文件,也可以是一个设备或通过某种协议接入的一个流)。

format_name, f

指定要读取的电影的格式,可以是一个容器的名称或一个输入设备的名称。如果没指定,就通过扩展名来猜格式或者探测。

seek_point, sp

以秒为单位指定搜索点。以该搜索点作为起始点输出帧。缺省值是“0”。

streams, s

指定要读的流。可以指定若干个流,用“+”分开。源将以同样的顺序有尽可能多的输出。“dv”和“da”分别指定缺省的(最合适的)视频和音频流。缺省是“dv”,如果过滤器是“amovie”,缺省是“da”。

stream_index, si

指定要读的视频流的索引。如果值是-1,则会自动选择最合适的视频流。缺省值是“-1”。如果过滤器是“amovie”,它将选择音频。


相关链接:

[FFmpeg] 水平翻转视频,对称显示播放

[FFmpeg] 输入设备 dshow 的使用——用电脑摄像头和麦克风录视频

[FFmpeg] Windows下使用ffmpeg为视频添加字幕

[FFmpeg] 去除 logo


你可能感兴趣的:(FFmpeg)