FFmpeg支持多种滤镜,查看全部滤镜
$ ffmpeg -filters
1、滤镜图、滤镜链、滤镜之间关系
滤镜图(filtergraph):跟在 -vf 之后的就是一个滤镜图
滤镜链(filterchain):一个滤镜图包含多个滤镜链
滤镜(filter):一个滤镜链包含多个滤镜
概括来说就是:滤镜 ∈ 滤镜链 ∈ 滤镜图
一个滤镜图的例子如下:
ffmpeg -i video.mp4 -vf [in]scale=640.0:480.0[pre_logo]; movie='/path/to/image/logo.png',scale=92.25:30.0[logo]; \
[pre_logo][logo]overlay=main_w-overlay_w-24.0:24.0[out] output.mkv
在该示例中,有三个滤镜链:(1)[in]scale=640.0:480.0[pre_logo](2)movie='/path/to/image/logo.png',scale=92.25:30.0[logo]
(3)[pre_logo][logo]overlay=main_w-overlay_w-24.0:24.0[out]
可以看到,滤镜链是使用分号 ";" 来分隔,滤镜链中的滤镜使用逗号 "," 来分隔;滤镜链没有指定输入或者输出,默认使用前面的滤镜链的输出为输入,并输出给后面的滤镜链作为输入,
2、Simple filtergraphs 和 Complex filtergraphs
Simple filtergraphs(简单滤镜):该滤镜只有一个输入和一个输出,实际就是添加在解码和编码步骤之间的操作,如下图所示。
Simple filtergraphs are configured with the per-stream -filter option (with -vf and -af aliases for video and audio respectively),-vf和 -af 分别指代 视频滤镜和音频滤镜,Note that some filters change frame properties but not frame contents. E.g. the fps
filter in the example above changes number of frames, but does not touch the frame contents. Another example is the setpts
filter, which only sets timestamps and otherwise passes the frames unchanged.
Complex filtergraphs(复杂滤镜):复杂滤镜不能简单看成对一个流的线性处理,例如,当有多于一个输入/输出流时,或者当输出流类型与输出流类型不同时,可以使用下图来描述
复杂滤镜图使用 -filter_complex 选项来表示,该选项是全局的, -lavfi 选项等同于 -filter_complex,一个具体的例子就是,overlay 滤镜,该滤镜有两个视频输入,一个视频输出,输出视频是一个输入视频覆盖在另一个视频之上的结果,音频有同等的 amix 滤镜
3 媒体流选择
一些多媒体容器比如AVI,mkv,mp4等,可以包含不同种类的多个流,如何从容器中抽取各种流呢?
语法:-map file_number:stream_type[:stream_number]
这有一些特别流符号的说明:
(1) -map 0 选择第一个文件的所有流
(2) -map i:v 从文件序号i(index)中获取所有视频流
(3) -map i:a 获取所有音频流
(4)-map i:s 获取所有字幕流等等特殊参数
(5)-an,-vn,-sn分别排除所有的音频,视频,字幕流
注意:文件序号和流序号从0开始计数
4 -vf、-filter_complex合并
有事会遇到有的使用 -vf,有的又必须使用 -filter_complex,怎样将这两项整合起来呢,下面有几个示例,总体的思路就是将单输入输出的 -vf 整合到 -filter_complex中去,这时会用到 第三条中的媒体流选择 -map
************************* vf 与 filter_complex结合·示例一 **************************
ffmpeg -i input.mp4
-vf "crop='if(gte(iw,ih),ih,iw):if(gte(ih,iw),iw,ih)', scale=720x720"
-an -c:v libx264 -profile:v high -level 4.1 -preset superfast -crf 20
output.mp4
``````````````````````````````````````````````````````````````````
ffmpeg -i input.mp4 -filter_complex \
"[0:v]trim=0:4.95,setpts=PTS-STARTPTS[v1]; \
[0:v]trim=4.95:6.75,setpts=PTS-STARTPTS[v2]; \
[0:v]trim=6.75:8,setpts=PTS-STARTPTS[v3]; \
[v2]setpts=PTS/0.1[vslow2]; \
[v1][vslow2][v3]concat=n=3:v=1:a=0[out]" \
-map [out] -an -c:v libx264 -profile:v high -level 4.1 \
-preset superfast -crf 20 -r 30 output.mp4
`````````````````````````````合成`````````````````````````````````````
ffmpeg -i input.mp4 -filter_complex \
"[0:v]crop='if(gte(iw,ih),ih,iw):if(gte(ih,iw),iw,ih)',scale=720x720,split=3[1v][2v][3v]; \
[1v]trim=0:4.95,setpts=PTS-STARTPTS[v1]; \
[2v]trim=4.95:6.75,setpts=(PTS-STARTPTS)/0.1[v2]; \
[3v]trim=6.75:8,setpts=PTS-STARTPTS[v3]; \
[v1][v2][v3]concat=n=3:v=1:a=0[out]" \
-map [out] -an -c:v libx264 -profile:v high -level 4.1 \
-preset superfast -crf 20 -r 30 output.mp4
************************ vf 与 filter_complex结合·示例二 *****************************
ffmpeg -i video.mp4 -i audio.mp3 -shortest -t 8
-vf "lutrgb=r=1.5, crop:500:500" output.mp4
·································································
ffmpeg -i video.mp4 -f lavfi -i "color=Red:s=1280x720"
-filter_complex "[0:v]setsar=sar=1/1[s];
[s][1:v]blend=shortest=1:all_mode=overlay:all_opacity=0.7[out]"
-map [out] -map 0:a output.mp4
····························合成·····································
ffmpeg -i video.mp4 -i audio.mp3 -f lavfi -i "color=Red:s=500x500" \
-filter_complex "[0:v]lutrgb=r=1.5,crop=500:500,setsar=sar=1/1[crop];\
[crop][2:v]blend=shortest=1:all_mode=overlay:all_opacity=0.7[out]" \
-map [out] -map 1:a -shortest output.mp4
以第二个示例,有两个输入 -i video.mp4 -i audio.mp3,分别对应的索引为0、1;如果选取video.mp4中的视频流使用 [0:v]、音频流为 [0:a]、字幕流为 [0:s];如果选取audio.mp3中的音频流使用 [1:v];可以看到最后的合成结果中,-map[out] ,-map 1:a 表示将滤镜处理后的视频和音频再复用输出为 output.mp4
参考:
http://stackoverflow.com/questions/33775185/ffmpeg-combine-2-filters-with-lavfi-vf-and-complex-filter/33775989
http://superuser.com/questions/781875/ffmpeg-error-vf-af-filter-and-filter-complex-cannot-be-used-together
http://video.stackexchange.com/questions/18354/ffmpeg-can-i-crop-using-vf-while-also-using-filter-complex-at-the-same-time
http://blog.csdn.net/doublefi123/article/details/24325159