快速准备

这个章节说明了使用MoviePy的场合以及工作原理。

我需要MoviePy吗?

这些是你想用Python编辑视频的理由:

  • 你需要用很复杂的方法来处理或组成大量的视频;
  • 你想在web服务器(Django、Flask等)自动生成视频或GIF动图;
  • 你想自动完成无聊的任务,如插入标题、追踪对象、剪切场景、制作结尾的演职人员表、字幕等等;
  • 你想用代码实现视频编辑软件所不能达到的视频效果;
  • 你想将从别的Python库里(如Matplotlib、Mayavi、Gizeh、scikit-images等)生成的图片制作成动画。

但在以下情况中,MoviePy并非最好的选择:

  • 你只需要对视频进行逐帧分析(如人脸识别或其他有趣的东西),使用MoviePy和别的库可以联合完成。但是事实上,仅使用 imageioOpenCV 或者SimpleCV这些专用库即可达到要求。
  • 你只需要视频文件转换,或者将一系列图片文件转换成视频。在这种情况下,直接调用ffmpeg(或avconvmencoder等)将比使用MoviePy更快速、更有效率地使用内存。

优势与局限性

MoviePy在以下方面表现出色:

  • 易于上手:一行即可完成一项基本操作。对于新手来说,代码易学易懂。
  • 灵活:视频和音频的每一帧都尽在掌握,创作属于自己的特效就像Python一样简单。
  • 便携:代码使用十分常见的软件(Numpy和FFMPEG),而且可以在几乎所有版本的Python和几乎所有的机器上运行。

局限性:MoviePy目前还无法对流媒体进行处理(从摄像头或者远程设备获取视频),并且MoviePy并不是被设计成用来对电影的连续帧进行处理(例如视频去抖,你需要寻找另外的软件)。如果你同时处理大量视频,音频以及图片序列(数量大于100)可能会出现内存问题,但是这个问题会在将来的版本当中进行修复。

代码示例

在典型的MoviePy脚本是这样的:加载视频或音频、修改、将他们连接在一起并最后生成一个新视频文件。作为一个示例,我们加载一个关于我上个假期的视频,降低音量,在前十秒添加标题在视频的中央,然后写入一个文件:

# Import everything needed to edit video clips
from moviepy.editor import *

# Load myHolidays.mp4 and select the subclip 00:00:50 - 00:00:60
clip = VideoFileClip("myHolidays.mp4").subclip(50,60)

# Reduce the audio volume (volume x 0.8)
clip = clip.volumex(0.8)

# Generate a text clip. You can customize the font, color, etc.
txt_clip = TextClip("My Holidays 2013",fontsize=70,color='white')

# Say that you want it to appear 10s at the center of the screen
txt_clip = txt_clip.set_pos('center').set_duration(10)

# Overlay the text clip on the first video clip
video = CompositeVideoClip([clip, txt_clip])

# Write the result to a file (many options available !)
video.write_videofile("myHolidays_edited.webm")

MoviePy的工作原理

MoviePy使用ffmpeg软件来读取和导出视频和音频文件。也使用(可选)ImageMagick来生成文字和制作GIF文件。不同媒体的处理依靠Python的快速的数学库Numpy。高级效果和增强功能使用一些Python的图片处理库(PIL,Scikit-image,scipy等)。

http://zulko.github.io/moviepy/_images/explanations.jpeg

基本概念

在MoviePy中,核心对象是剪辑,可以使用AudioClipsVideoClips来处理。剪辑可被修改(剪切、降低速度、变暗等)或与其他剪辑混合组成新剪辑。剪辑可被预览(使用PyGame或IPython Notebook),也可生成文件(如MP4文件、GIF文件、MP3文件等)。以VideoClips为例,它可以由一个视频文件、一张图片、一段文字或者一段卡通动画而来。它可以包含音频轨道(即AudioClip)和一个遮罩(一种特殊的VideoClip),用于表明当两个剪辑混合时,哪一部分的画面被隐藏)。详见生成与导出视频剪辑混合剪辑

你可使用MoviePy的很多效果对一个剪辑进行修改(如clip.resize(width="360")clip.subclip(t1,t2)clip.fx(vfx.black_white)或使用用户自行实现的效果。MoviePy提供许多函数(如clip.flclip.fx等),可以用简单的几行代码实现你自己的效果。详见视频转换与效果

你还可以在moviepy.video.tools找到一些高级的效果来对视频中的对象进行追踪、画简单的形状和颜色渐变(对于遮罩来说很有用)、生成字幕和结束时的演职人员表等。参见高级工具中的详细描述。

最后,尽管MoviePy没有生动的用户界面,它也有许多方法来预览剪辑,使你能够调试脚本,从而确保你的视频在高质量的同时一切正常。详见如果更有效率地使用MoviePy