FFmpeg 中 -filter_complex 的使用说明

544 阅读5分钟

-filter_complex 的详细使用说明

在 FFmpeg 中,-filter_complex 参数用于指定复杂的过滤器链。复杂的过滤器链可以用于对多个输入流(视频、音频等)进行处理和组合,而 -filter 则通常用于单个流的处理。

语法:

ffmpeg -i input1 -i input2 -filter_complex "filtergraph" output

其中 filtergraph 是过滤器的链,包含多个过滤器。多个过滤器使用 ; 分隔。

过滤器的基本语法

过滤器通常具有如下的基本格式:

[inputs]filtername[outputs]
  • [inputs]:表示输入流,通常是通过索引或者标签来指定的。例如 [0:v:0] 表示第一个输入文件的视频流。
  • filtername:表示应用的过滤器名称,比如 scaleconcat 等。
  • [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.mp4video2.mp4 的视频流。
  • [0:a:0][1:a:0]:分别是输入文件 video1.mp4video2.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(水平/垂直拼接视频)

hstackvstack 过滤器用于将多个视频水平或垂直拼接。

示例:将两个视频水平拼接
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 过滤器(音频控制)

你可以通过 volumeatempo 等音频过滤器来控制音量或音频速度。

示例:将音频音量放大两倍
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 中非常强大的参数,允许我们在处理多个流时,使用复杂的过滤器链进行多种操作,如视频拼接、音频处理、缩放、裁剪等。通过组合多个过滤器,可以完成非常复杂的多媒体处理任务。