ffmpeg 视频 图形叠加
使用scale视频过滤器将输入缩放(调整大小)为特定大小,然后使用overlay视频过滤器将视频放置在静态图像上。
1 2 3 4 5 6 | 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选项从第二个视频输入添加一个附加的音轨(输出将有两个音频流)。此示例将流式复制音频,而不是重新编码:
1 2 3 4 5 6 | 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音频滤波器将两个音频输入合并为一个(假设两个输入均为立体声,并且您想要立体声输出):
1 2 3 4 5 6 7 | 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个视频实现一大一小布局,可指定开始时间,生成视频的总时长
1 | 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)
在多个时间点上叠加视频
1 | 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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-04-24 SQL中Group by和聚合函数