FFmpeg - 将一个视频叠加到另一个视频上?

Posted

技术标签:

【中文标题】FFmpeg - 将一个视频叠加到另一个视频上?【英文标题】:FFmpeg - Overlay one video onto another video? 【发布时间】:2016-05-18 02:24:42 【问题描述】:

我知道这是一个非常开放的问题。我已经初步阅读了FFmpeg,但现在需要一些指导。

问题

我有一个视频input.mov。 我想在overlay.wov 上叠加另一个视频。 结果应该是单个视频 (output.mov)。

注意事项

初步阅读FFmpeg 并阅读this question。

谢谢 - C.

编辑

    后端是 Go/Ruby。愿意使用新语言。 应保留第一个视频的音频。 设置覆盖开始的时间间隔会很棒。

当前解决方案

ffmpeg -i input.mov -i overlay.mov -filter_complex "[0:0][1:0]overlay[out]" -shortest -map [out] -map 0:1 -pix_fmt yuv420p -c:a copy -c:v libx264 -crf 18  output.mov

不过,这几乎可行:

即使两个视频(input.movoverlay.mov)的长度相同,覆盖也会被剪短。 我无法在除0:00 之外的任何时间间隔启动覆盖。

【问题讨论】:

您使用的是什么后端技术? php、.NET、struts、python!!? @Tarunn - 为帖子添加了答案。 @LordNeckbeard 感谢您的评论,添加了更多详细信息并包括我当前的解决方案。我认为由于音频和间隔要求而有所不同。 【参考方案1】:

如果你只是想要一个 ffmpeg 命令,试试

ffmpeg -i input.mov -i overlay.mov \
-filter_complex "[1:v]setpts=PTS-10/TB[a]; \
                 [0:v][a]overlay=enable=gte(t\,5):shortest=1[out]" \
-map [out] -map 0:a \
-c:v libx264 -crf 18 -pix_fmt yuv420p \
-c:a copy \
output.mov

这会在 5 秒后开始叠加,叠加视频的起点为 00:15

setpts=PTS-10/TBsetpts=PTS+(overlay_delay-video_trim_in)/TB

overlay=enable=gte(t\,5)overlay=enable=gte(t\,overlay_delay)

【讨论】:

感谢您的回答!间隔有点混乱。如果可能的话,你能用这些参数解释一下吗? input.mov 是 10 秒长。 overlay.mov 是 3 秒长。 output.mov 应该是 10 秒长。 overlay.mov 应该在 7 秒后开始到 input.mov 覆盖从 7 开始,所以 overlay=enable=gte(t\,7)。 Overlay.mov 从头开始​​显示,所以setpts=PTS+7-0/TB == setpts=PTS+7/TB 如果我想同时在两个视频中保留音频,怎么样?因为现在当我尝试它时,来自叠加层的音频消失了。谢谢! 在叠加层之后将[0][1]amix[a]插入过滤器图并将-map 0:a更改为-map [a] @Gyan 你能举个例子说明如何添加这个[0][1]amix[a] 它应该与覆盖命令添加到同一个链中吗?

以上是关于FFmpeg - 将一个视频叠加到另一个视频上?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中将一个视频叠加到另一个视频上?

ffmpeg在另一个上叠加视频

FFMPEG - 以特定的时间间隔在视频上叠加多个视频

在Android中使用FFMPEG在另一个视频上循环叠加视频

我想用ffmpeg命令行转换一个视频文件,视、音频编码格式不变,只是将画面旋转90度,请问命令行该如何写?

FFmpeg学习6:视音频同步