ffmpeg 视频 图形叠加
使用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