1. 视频分割
在这节课里,咱们的重点是用 MoviePy 分割视频和合并剪辑。你会学到怎么把视频分成小段,以及如何用这些小段创建完整的新视频项目。就像一顿用你最喜欢的编程教程拼起来的“Python 混搭”视频早餐。
我们先从如何将视频分割成片段开始。这技能在很多场景下都可能派上用场:从给你的最新科学发现做个 demo 到剪辑出你在 Zoom 会议里眨眼的所有瞬间。
根据时间分割视频
视频分割基于使用 MoviePy 的 cut
方法。我们可以设定感兴趣的起始和结束时间区间。
from moviepy.editor import VideoFileClip
# 加载视频
clip = VideoFileClip("input_video.mp4")
# 剪出10到20秒的片段
clip1 = clip.subclip(10, 20)
# 保存剪辑出的片段
clip1.write_videofile("clip1.mp4")
上面的代码剪出了原视频第10秒到第20秒之间的片段。为了省心、省硬盘空间,一定要确保时间戳正确,别弄出个“意外”的片段,比如你远程咖啡休息的片段。
将视频分成多个部分
你可以把视频分成多个部分,并将它们分别保存为独立的剪辑,之后再进行合并。
将视频分成三个部分
比如,咱们有一个总长度为30秒的视频,想把它平均分成三个每段10秒的小片段。
# 创建三个相等的片段
clip1 = video.subclip(0, 10)
clip2 = video.subclip(10, 20)
clip3 = video.subclip(20, 30)
# 保存片段
clip1.write_videofile("clip_part1.mp4")
clip2.write_videofile("clip_part2.mp4")
clip3.write_videofile("clip_part3.mp4")
这段代码生成了三个视频片段:
clip1
— 从0到10秒,clip2
— 从10到20秒,clip3
— 从20到30秒。
每个片段都被保存成独立的视频文件。
剪辑出最有趣的片段
有时候一个片段还不够,你需要整一束视频“花束”。我们可以创建多个这样的片段并保存它们。
clip2 = clip.subclip(30, 40)
clip3 = clip.subclip(50, 60)
clip2.write_videofile("clip2.mp4")
clip3.write_videofile("clip3.mp4")
现在咱们有了三个从原视频中剪辑出的片段。几乎像是在拼谜题,只不过是反过来。
2. 合并剪辑
剪好后,是时候把我们的视频“云”重新拼回去了,只不过是以新的、加工过的形式。这时,MoviePy 的合并功能就派上用场了。
从多个视频片段创建合集
要合并剪辑,可以用 concatenate_videoclips
方法。这个方法能按照指定顺序把剪辑一个接一个排好。
from moviepy.editor import concatenate_videoclips
# 合并剪辑到一个视频中
final_clip = concatenate_videoclips([clip1, clip2, clip3])
# 保存合并后的视频
final_clip.write_videofile("final_video.mp4")
现在咱们有了一个新视频项目,它是你最佳瞬间的合集。或者是一些随机片段,如果你忘了顺序。
合并剪辑时添加音频
合并视频剪辑时,你也可以加入音轨。比如,如果有一个音乐文件或其他音频片段,你可以将其覆盖到合并后的视频上。
带音频的剪辑合并
from moviepy.editor import AudioFileClip
# 创建音频剪辑
audio_clip = AudioFileClip("background_music.mp3")
# 将音频剪辑添加到合并视频中
final_clip_with_audio = final_clip.set_audio(audio_clip)
final_clip_with_audio.write_videofile("combined_with_audio.mp4")
这里:
AudioFileClip("background_music.mp3")
从音乐文件创建一个音频剪辑。set_audio(audio_clip)
将音轨添加到合并的视频final_clip
。
3. 剪辑间的过渡效果
在 MoviePy 中,可以通过 CompositeVideoClip
类以及各种效果创建剪辑间的过渡。核心想法是用特效(比如透明度变化或者移动)将一个剪辑叠加到另一个剪辑上。过渡效果通常包括调节透明度或者移动帧,让一个剪辑平滑地过渡到另一个剪辑。
渐隐过渡
渐隐 是最流行的过渡效果之一,第一段剪辑逐渐消失,第二段剪辑慢慢出现在屏幕上。这个效果可以用 crossfadein()
或 crossfadeout()
实现。
两段剪辑间的渐隐过渡
from moviepy.editor import VideoFileClip, concatenate_videoclips
# 加载两个视频剪辑
clip1 = VideoFileClip("clip1.mp4").subclip(0, 5) # 第一个5秒的视频
clip2 = VideoFileClip("clip2.mp4").subclip(0, 5) # 第二个5秒的视频
# 设置渐隐效果
clip1 = clip1.crossfadeout(1) # clip1 渐隐一秒
clip2 = clip2.crossfadein(1) # clip2 渐现一秒
# 合并剪辑并加入过渡
final_clip = concatenate_videoclips([clip1, clip2], method="compose")
final_clip.write_videofile("fade_transition.mp4")
在这个例子中:
crossfadeout(1)
让第一个剪辑在1秒内逐渐透明。crossfadein(1)
让第二个剪辑在1秒内逐渐清晰。concatenate_videoclips([clip1, clip2], method="compose")
将两个剪辑通过渐隐过渡合并。
转黑过渡
转黑(或者“淡入黑”)是指第一个剪辑淡出到黑屏,然后下一个剪辑从黑屏中显现。这种过渡效果让一段场景结束而下一段开始。
from moviepy.editor import VideoFileClip, concatenate_videoclips
# 加载两个剪辑
clip1 = VideoFileClip("clip1.mp4").subclip(0, 5)
clip2 = VideoFileClip("clip2.mp4").subclip(0, 5)
# 设置转黑效果
clip1 = clip1.fadeout(1) # clip1 淡出到黑
clip2 = clip2.fadein(1) # clip2 从黑中显现
# 合并剪辑并加入转黑效果
final_clip = concatenate_videoclips([clip1, clip2], method="compose")
final_clip.write_videofile("fade_to_black_transition.mp4")
这里:
fadeout(1)
让剪辑在1秒内渐隐到黑屏。fadein(1)
让下一剪辑在1秒内从黑屏渐现。
现在你的视频不仅仅是一些片段的合集,而是一部带有平滑过渡的真正力作。咱们给视频加了进出效果,让它看起来更流畅。
4. 实践应用
掌握了这些技巧后,你会发现它们非常实用。无论你是做编程教程、新库宣传片,还是为自己的猫进军 IT 的第一步做 montaje(是的,这也可能发生!),学会分割和合并视频是成为视频剪辑和自动化大师的入门技能。
常见错误
操作视频分割和合并时,一定要小心时间戳。我们都看过那些视频被突然打断的糟糕场面(还有那些无聊的会议幻灯片又重复播放)。确保时间戳设置正确,没有任何错误。MoviePy 有时候可能会因为格式错误或空剪辑而报错,所以在运行前多检查一下代码。
希望现在你不仅掌握了这些知识,还对面前无限的可能性感到兴奋。让我们一起用 Python 和 MoviePy 探索视频剪辑和创意的世界吧!
GO TO FULL VERSION