-filter_complex 的详细使用说明
在 FFmpeg 中,-filter_complex 参数用于指定复杂的过滤器链。复杂的过滤器链可以用于对多个输入流(视频、音频等)进行处理和组合,而 -filter 则通常用于单个流的处理。
语法:
ffmpeg -i input1 -i input2 -filter_complex "filtergraph" output
其中 filtergraph 是过滤器的链,包含多个过滤器。多个过滤器使用 ; 分隔。
过滤器的基本语法
过滤器通常具有如下的基本格式:
[inputs]filtername[outputs]
[inputs]:表示输入流,通常是通过索引或者标签来指定的。例如[0:v:0]表示第一个输入文件的视频流。filtername:表示应用的过滤器名称,比如scale、concat等。[outputs]:表示过滤器的输出流,可以给输出流指定一个标签。
常用的 -filter_complex 过滤器和示例
1. concat(视频和音频合并)
concat 过滤器用于将多个视频和音频流拼接在一起,适用于两个或多个视频的拼接。
示例:拼接两个视频
// 只拼接视频
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "[0:v:0][1:v:0]concat=n=2:v=1[outv]" -map "[outv]" output.mp4
// 拼接视频和音频
ffmpeg -i 'video1.mp4' -i 'video2.mp4' -filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" output.mp4
解释:
n=2:表示拼接 2 个输入视频。v=1:表示输出一个视频流。a=1:表示输出一个音频流。[0:v:0]和[1:v:0]:分别是输入文件video1.mp4和video2.mp4的视频流。[0:a:0]和[1:a:0]:分别是输入文件video1.mp4和video2.mp4的音频流。[outv]:表示拼接后的输出视频流。[outa]:表示拼接后的输出音频流。
2. scale(缩放视频)
scale 过滤器用于调整视频的分辨率。
示例:将视频缩放到 1280x720
ffmpeg -i input.mp4 -filter_complex "scale=1280:720" output.mp4
解释:
scale=1280:720:将视频的分辨率调整为 1280x720。
3. overlay(视频叠加)
overlay 过滤器用于将一个视频叠加到另一个视频上。
示例:将 overlay.mp4 叠加到 input.mp4 上
ffmpeg -i input.mp4 -i overlay.mp4 -filter_complex "[0:v][1:v]overlay=10:10[out]" -map "[out]" output.mp4
解释:
[0:v][1:v]overlay=10:10:将第二个视频overlay.mp4叠加到第一个视频input.mp4上,叠加位置为坐标 (10, 10)。[out]:输出合成的视频流。
4. hstack / vstack(水平/垂直拼接视频)
hstack 和 vstack 过滤器用于将多个视频水平或垂直拼接。
示例:将两个视频水平拼接
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "hstack" output.mp4
示例:将两个视频垂直拼接
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "vstack" output.mp4
解释:
hstack:将两个视频水平拼接。vstack:将两个视频垂直拼接。
5. fade(视频渐变)
fade 过滤器用于在视频的指定部分添加渐变效果。
示例:在视频开始时添加渐变效果
ffmpeg -i input.mp4 -filter_complex "fade=t=in:st=0:d=5" output.mp4
解释:
fade=t=in:st=0:d=5:在视频的开始部分(st=0)添加一个渐变效果,渐变时间为 5 秒(d=5)。
6. split(视频流分离)
split 过滤器用于将视频流分成多个输出流。
示例:将视频流分成两个输出流
ffmpeg -i input.mp4 -filter_complex "[0:v]split[output1][output2]" -map "[output1]" output1.mp4 -map "[output2]" output2.mp4
解释:
[0:v]split[output1][output2]:将输入视频流[0:v]分成两个输出流[output1]和[output2]。-map "[output1]"和-map "[output2]":分别将这两个视频流输出到不同的文件。
7. asplit(音频流分离)
asplit 过滤器用于将音频流分成多个输出流。
示例:将音频流分成两个输出流
ffmpeg -i input.mp4 -filter_complex "[0:a]asplit[output1][output2]" -map "[output1]" output1.wav -map "[output2]" output2.wav
解释:
[0:a]asplit[output1][output2]:将输入音频流[0:a]分成两个输出流[output1]和[output2]。-map "[output1]"和-map "[output2]":分别将这两个音频流输出到不同的文件。
8. trim(视频裁剪)
trim 过滤器用于截取视频的指定部分。
示例:裁剪视频的前 30 秒
ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:end=30,setpts=PTS-STARTPTS[v]" -map "[v]" output.mp4
解释:
[0:v]trim=start=0:end=30:裁剪视频流,从第 0 秒到第 30 秒。setpts=PTS-STARTPTS:设置时间戳,使视频播放不受影响。
9. audio 过滤器(音频控制)
你可以通过 volume 或 atempo 等音频过滤器来控制音量或音频速度。
示例:将音频音量放大两倍
ffmpeg -i input.mp4 -filter_complex "volume=2.0" output.mp4
解释:
volume=2.0:将音频音量放大两倍。
-filter_complex 的组合示例
你可以将多个过滤器组合在一起,进行复杂的视频处理。
示例:视频缩放并添加文字水印
ffmpeg -i input.mp4 -filter_complex "[0:v]scale=1280:720,drawtext=text='Watermark':x=10:y=10:fontsize=24:fontcolor=white[out]" -map "[out]" output.mp4
解释:
[0:v]scale=1280:720:将视频缩放到 1280x720。drawtext=text='Watermark':在视频上添加文字水印。-map "[out]":输出处理后的结果。
总结
-filter_complex 是 FFmpeg 中非常强大的参数,允许我们在处理多个流时,使用复杂的过滤器链进行多种操作,如视频拼接、音频处理、缩放、裁剪等。通过组合多个过滤器,可以完成非常复杂的多媒体处理任务。