如何高效、自动地使用短转场来连接视频片段?

如何高效、自动地使用短转场来连接视频片段?

我希望以一种直接、自动且有效的方式,使用一些短过渡(理想情况下是交叉淡入淡出)来连接一组视频剪辑(带有音频)。

IE:

ClipA ---> ClipB --> ClipC --> ClipD
[aaaaaaaa][bbbbbbbb][cccccccc][dddddddd]
(--> indicate crossfades, not to scale!)

澄清:

  • 经过直截了当,理想情况下它将涉及使用“标准”工具(即我已经熟悉的工具ffmpeg,但不太知名的工具melt绝对符合条件,并且我愿意探索像 MoviePy 这样的新视野)
  • 经过自动化我的意思是可以参数化并放入python/ shell/etc 脚本中的东西
  • 经过高效的我是说快速编码或尽量减少重新编码

目前我正在使用pythonffmpeg使用流复制参数(非常快) 基于文本文件中的时间码。然后melt使用短亮度(交叉淡入淡出)过渡将这些剪辑一个接一个地串联起来(由于重新编码整个序列,速度非常慢)。

在我看来,在这些长视频片段中,只有几秒钟需要处理和重新编码 - 过渡本身。其余的可以复制。有没有现成的/直观的方法来做到这一点?我的天真方法是将剪辑进一步切成子剪辑,用来melt创建过渡,并使用concat过滤器将混乱粘合在一起。

例如:

ClipA1 ClipA2 ClipB1 ClipB2 ClipB3 ClipC1 ClipC2 ClipC3 ClipD1 Clip D2
[aaaaaaa] + [a][b] + [bbbbbb] + [b][c] + [cccccc] + [c][d] + [ddddddd]
(+ indicates concat-ing of subclips; [x][y] indicates a short xfade from x to y)

然而,我不愿意冒着愚蠢的风险去做这件事,因为我预计在剪辑时间和音频同步方面会出现melt/ffmpeg相关的陷阱;我不想因为 I 帧放置或其他原因而错过视频或音频的某些部分。另外,我觉得我不是第一个遇到这种情况的人,所以我很好奇那些比我聪明的人是如何解决这个问题的——正如我所说,我的解决方案往往很幼稚!

希望您已经理解了。谢谢阅读,提前致谢!


就上下文而言,我的目的是将未经编辑的直播视频游戏镜头精简为有趣/“有用”的视频;即删除加载内容、解决连接问题等无聊的琐事。但它也可以推广到精彩片段,即展示进展的蒙太奇。由于理论上每次有新镜头时都会出现这种情况,因此我非常有兴趣以最有效(主动偷懒)的方式做到这一点。

答案1

我没有时间去测试它,但是如果你想使用 MoviePy,这应该可行:

from moviepy.editor import *

clips = [ VideoFileClip("vid1.mp4"),
          VideoFileClip("vid2.mp4"),
          VideoFileClip("vid3.mp4"), ... ]


fade_duration = 1 # 1-second fade-in for each clip
clips = [clip.crossfadein(fade_duration) for clip in clips]

final_clip = concatenate_videoclips(clips, padding = -fade_duration)

# You can write any format, in any quality.
final_clip.write_videofile("final.mp4", bitrate="5000k")

答案2

这是使用 Python moviePy 库在联合视频剪辑之间创建淡入淡出效果的另一种方法。在 Windows 10 上使用 Python 3.x 进行测试。我必须首先从 Windows 命令提示符安装 moviepy,其中 python 安装目录如下:

C:\Users\...\Programs\Python\Python37\Scripts> pip3.7.exe install moviepy; 

以下是使用 CompositeVideoClip 方法合并三个短视频剪辑并添加 CrossFadeIn 效果的完整代码:

from moviepy.editor import *
# video lists and play time
clip1 = VideoFileClip("part1.mp4") #30s length
clip2 = VideoFileClip("part2.mp4") #12s
clip3 = VideoFileClip("part3.mp4") #20s

# Composite video and apply CrossFadeIn effect
video=CompositeVideoClip([clip1,
                          clip2.set_start(30).crossfadein(1),
                          clip3.set_start(32).crossfadein(1.5)])

#write to file
video.write_videofile("my_composite.mp4")

更多阅读/示例,请参阅https://www.journaldev.com/46531/python-moviepy-video-editing

相关内容