ffmpeg 视频 图形叠加

发布时间 2023-04-24 15:22:21作者: _成飞

使用scale视频过滤器将输入缩放(调整大小)为特定大小,然后使用overlay视频过滤器将视频放置在静态图像上。

ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \\
"[1:v]scale=(iw/2)-20:-1[a]; \\
 [2:v]scale=(iw/2)-20:-1[b]; \\
 [0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \\
 [c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \\
-map"[video]" output.mkv

非过滤选项

  • loop 1 连续循环下一个输入background.png。

  • background.png 背景图像。流说明符为[0:v],尺寸为1280x720。

  • video1.mp4 这是第一个视频输入(示例图像中为Big Buck Bunny)。流说明符为[1:v]。尺寸为640x360。

  • video2.mp4 第二个视频输入(示例图像中的varmints)。流说明符为[2:v]。尺寸为640x360

筛选选项

-filter_complex启动复杂过滤图的选项。

  • [1:v]scale=(iw/2)-20:-1[a] 这将使用video1.mp4(称为[1:v])进行缩放。 iw是输入宽度的别名,在这种情况下,它是640的值。我们将其除以一半,并减去20个像素作为填充,因此每个视频在重叠时都会有空间。 -1表示自动计算将保留宽高比的值。如果可以,您可以忽略幻想并手动提供诸如scale=320:240的值。然后使用名为[a]的输出链接标签,以便我们稍后可以参考此输出。

  • [2:v]scale=(iw/2)-20:-1[b]与上面相同,但是使用video2.mp4作为输入,并将输出链接标签命名为[b]。

  • [0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1 使用background.png作为第一个叠加输入,并将我们的第一个比例过滤器(称为[a])的结果用作第二个叠加输入。将[a]放在[0:v]上。 main_h是主高度的别名,它是指背景输入([0:v])的高度。 overlay_h是覆盖高度的别名,是指前景([a])的高度。本示例将大雄兔兔放在左侧。 shortest=1将在最短输入终止时强制输出终止;否则它将永远循环,因为background.png正在循环。将此过滤器的结果命名为。

  • [c][b]overlay=overlay_w*2:overlay_h:shortest=1使用作为第一个叠加输入,使用[b]作为第二个叠加输入。使用覆盖参数overlay_w和overlay_h(覆盖输入宽度和高度)。本示例将把蠕虫变种放在右侧。将输出标记为。

  • map""将过滤器的输出映射到输出文件。过滤器图末尾的链接标签不是必需的,但建议在映射时使用明确的链接标签。

音讯

有两个独立的音频流

默认情况下,如流选择中所定义,仅遇到的第一个输入音频通道将用于输出中。您可以使用-map选项从第二个视频输入添加一个附加的音轨(输出将有两个音频流)。此示例将流式复制音频,而不是重新编码:

ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \\
"[1:v]scale=(iw/2)-20:-1[a]; \\
 [2:v]scale=(iw/2)-20:-1[b]; \\
 [0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \\
 [c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \\
-map"[video]" -map 1:a -map 2:a -codec:a copy output.mkv

合并两个音频流

或使用amerge和pan音频滤波器将两个音频输入合并为一个(假设两个输入均为立体声,并且您想要立体声输出):

ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \\
"[1:v]scale=(iw/2)-20:-1[a]; \\
 [2:v]scale=(iw/2)-20:-1[b]; \\
 [0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \\
 [c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \\
 [1:a][2:a]amerge,pan=stereo:c0<c0+c2:c1<c1+c3[audio]" \\
-map"[video]" -map"[audio]" output.mkv

叠加2个视频实现一大一小布局,可指定开始时间,生成视频的总时长

ffmpeg -ss 00:00:20 -i test3.mp4 -i test2.mp4 -filter_complex "[1:v]scale=320:240[v1];[0:v][v1]overlay=10:10" -s 640x480  -c:v libx264 -preset ultrafast -r 20 -b:v 200k -t 1200 output.mp4

-ss 00:00:20 test3.mp4开始时间
320:240为小视频的宽高
10:10小视频左上角坐标
-t 1200 视频总时长(s)

在多个时间点上叠加视频

ffmpeg  -i background.mp4 -i overlay.mov -filter_complex"[1]setpts=PTS+2/TB[ts],[0][ts]overlay=0:0:eof_action=pass[out];[1]setpts=PTS+4/TB[b],[out][b]overlay=-200:200:eof_action=pass[out]" -map"[out]" -t 00:00:10 -y output.mp4