我希望以一种直接、自动且有效的方式,使用一些短过渡(理想情况下是交叉淡入淡出)来连接一组视频剪辑(带有音频)。
IE:
ClipA ---> ClipB --> ClipC --> ClipD
[aaaaaaaa][bbbbbbbb][cccccccc][dddddddd]
(--> indicate crossfades, not to scale!)
澄清:
- 经过直截了当,理想情况下它将涉及使用“标准”工具(即我已经熟悉的工具
ffmpeg
,但不太知名的工具melt
绝对符合条件,并且我愿意探索像 MoviePy 这样的新视野) - 经过自动化我的意思是可以参数化并放入
python
/shell
/etc 脚本中的东西 - 经过高效的我是说快速编码或尽量减少重新编码
目前我正在使用python
并ffmpeg
使用流复制参数(非常快) 基于文本文件中的时间码。然后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