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

22
我知道这是一个非常开放性的问题。 我已经阅读了FFmpeg的一些初步内容,但现在需要一些指导。
问题:
  • 我有一个视频input.mov
  • 我想在overlay.wov上叠加另一个视频。
  • 结果应该是一个单独的视频(output.mov)。
注意事项: 感谢-C。
编辑:
  1. 后端是Go / Ruby。 可以使用新语言。
  2. 应该保留第一个视频的音频。
  3. 设置叠加开始的间隔将是很好的。
当前解决方案:
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
@Tarunn - 在帖子中添加了答案。 - cdrev
@LordNeckbeard 感谢您的评论,我已经添加了更多细节并包含了我的当前解决方案。我相信它与音频和间隔要求有所不同。 - cdrev
1个回答

27
如果您只需要一个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应该从input.mov的第7秒开始。 - cdrev
1
叠加层从第7秒开始,因此 overlay=enable=gte(t\,7)。Overlay.mov 从开头开始显示,因此 setpts=PTS+7-0/TB == setpts=PTS+7/TB - Gyan
2
如果我想在两个视频中都保留音频怎么办?因为现在当我尝试时,叠加的音频就没有了。谢谢! - gabo
@Gyan,您能否举个例子,说明如何添加此[0][1]amix[a]?是否应该在与叠加命令相同的链中添加? - Qandeel Abbassi
@Gyan,如果我们想让叠加从“0”开始,应该在您的命令中更改什么?我尝试了gte(t\,0)setpts=PTS+0/TB,但没有起作用。 - Tina J
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接