FFmpeg filter_complex 复杂多滤镜叠加完全指南
FFmpeg的filter_complex
选项是处理复杂音视频滤镜的利器,它允许你在单个命令中组合多个滤镜,实现从简单到复杂的各种音视频处理效果。无论是添加水印、字幕,还是进行色彩调整、画面合成,filter_complex
都能胜任。
核心语法与概念
基本语法结构
滤镜的基本格式:
filtername=option1=value1:option2=value2:option3=value3...
使用filter_complex
的完整命令格式:
ffmpeg -i 输入0 -i 输入1 -i 输入N -filter_complex "多滤镜组合表达式" output.mp4
多滤镜组合规则
多滤镜组合表达式的核心思路是:
[输入]滤镜[输出];[输入]滤镜[输出];
- 使用
;
分号分隔不同的滤镜链(管道) - 使用
:
冒号分隔同一滤镜的多个参数 - 使用
[]
方括号标识输入源和输出变量
输入源标识
[0]
:第一个输入文件[0:v]
:第一个输入文件的视频轨[0:a]
:第一个输入文件的音频轨[0:s]
:第一个输入文件的字幕轨[0:a:1]
:第一个输入文件的第二个音频轨(索引从0开始)- 自定义变量:如
[temp]
、[out]
等,用于在滤镜链之间传递中间结果
实战示例
示例1:添加水印和字幕
同时给视频添加图片水印和字幕:
ffmpeg -y -i v.mp4 -i logo.png -filter_complex "[0][1]overlay=(W-w)/2:(H-h)/2[watermarked];[watermarked]subtitles=s.srt:force_style='FontName=PingFang SC,Fontsize=16'" output.mp4
注意:字幕文件直接在
subtitles
滤镜中指定,不需要用-i
参数单独输入。
示例2:创建带旋转文字的水印
创建一个包含旋转文字的PNG水印图片,然后叠加到视频上:
- 生成测试视频:
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=10:duration=10 -vcodec libx264 -pix_fmt yuv420p -f h264 input.264
- 生成带旋转文字的水印图片:
ffmpeg -y -f h264 -i input.264 -filter_complex "color=black@0:100x100,format=rgba[c];[c]scale2ref[ct][mv];[ct]setsar=1,drawtext=text='WATERMARK':x=(W-tw)/2:y=(H-th)/2:fontfile=arial.ttf:fontsize=(w+h)/18:[email protected],split[txt][alpha],[txt][alpha]alphamerge,rotate=(-27*PI)/180:ow=iw:oh=ih:c=black@0,drawtext=text='Bottom Center':x=(W-tw)/2:y=H-th-3:fontfile=arial.ttf:fontsize=12:[email protected]:box=1:[email protected]:boxborderw=5,drawtext=text='Top Center':x=(W-tw)/2:y=3:fontfile=arial.ttf:fontsize=7:fontcolor=4F81BD@1:box=1:boxcolor=C0504D@1:boxborderw=5[fin];[mv]nullsink" -frames:v 1 -map "[fin]" rot_text.png
- 将水印叠加到视频上:
ffmpeg -y -r 25 -f h264 -i input.264 -i rot_text.png -filter_complex "[0][1]overlay=x=(W-w)/2:y=(H-h)/2" -c:v libx264 output.mp4
示例3:音频视频分别处理
对视频进行缩放,同时对音频进行音量调整:
ffmpeg -i input.mp4 -filter_complex "[0:v]scale=1280:720[video_out];[0:a]volume=1.5[audio_out]" -map "[video_out]" -map "[audio_out]" output.mp4
常见问题
1. 滤镜链顺序重要吗?
是的,滤镜的应用顺序会直接影响最终效果。例如,先缩放再添加水印,和先添加水印再缩放,得到的结果是不同的。
2. 如何处理多个输入源?
可以使用多个-i
参数指定多个输入源,然后在滤镜表达式中通过[0]
、[1]
等标识来引用它们。
3. 如何优化复杂滤镜的性能?
- 尽量减少不必要的滤镜操作
- 使用硬件加速编码/解码(如示例中的
-hwaccel nvdec
和-c:v h264_nvenc
) - 合理设置中间变量,避免重复计算