📜  MoviePy - 使用 Matplotlib 创建动画(1)

📅  最后修改于: 2023-12-03 14:44:23.993000             🧑  作者: Mango

MoviePy - 使用 Matplotlib 创建动画

简介

MoviePy 是一款 Python 库,用于编辑视频和动画特效。它可以简化视频处理流程,提供了一系列工具,如裁剪、剪辑、合成、特效等,还可以实时生成动画效果。

Matplotlib 是一款 Python 的数据可视化库,主要用于绘制 2D 图形,包括线条、散点图、条形图、图像等。在 MoviePy 中,Matplotlib 负责生成动画的每一帧,将其逐帧保存为图像,然后 MoviePy 再将这些图像合成为视频。

结合使用 MoviePy 和 Matplotlib,可以非常方便地生成精美的动画效果,尤其适用于科学、工程和教育等领域。

安装

使用 pip 指令可以安装 MoviePy 和 Matplotlib:

pip install moviepy matplotlib
基本用法

以下示例演示了如何用 Matplotlib 创造一个简单的动画,并用 MoviePy 合成为视频文件。

首先,我们导入需要的模块:

import numpy as np
import matplotlib.pyplot as plt
from moviepy.video.io.bindings import mplfig_to_npimage
import moviepy.editor as mpy

定义一个函数,该函数负责生成每一帧的图像,这里使用 Matplotlib 来绘制一个二次函数图像:

def make_frame(t):
    x = np.linspace(-5,5,1000)
    y = x**2 * (3-x) * np.sin(t)
    fig, ax = plt.subplots()
    ax.plot(x,y)
    ax.set_xlim([-5,5])
    ax.set_ylim([-50,50])
    return mplfig_to_npimage(fig)

然后定义视频参数,包括分辨率、帧率、时长等:

video_clip = mpy.VideoClip(make_frame, duration=5)

最后,将视频写入文件:

video_clip.write_videofile("quadratic_curve.mp4", fps=25)

现在可以在当前目录下看到生成的视频文件 quadractic_curve.mp4。

高级用法

除了简单的动画效果外,MoviePy 还支持丰富的特效,如文字、声音、转场等。在这里我们介绍如何使用 MoviePy 和 Matplotlib 创建一个带文字和声音的动画。

首先定义生成每一帧的函数,这里我们绘制一个正弦曲线图,同时添加一个随时间变化的文本标签:

def make_frame(t):
    x = np.linspace(-5,5,1000)
    y = np.sin(x+t)
    fig, ax = plt.subplots()
    ax.plot(x,y)
    ax.set_xlim([-5,5])
    ax.set_ylim([-1,1])
    text = ax.text(0,0,'Time={:.2f}'.format(t), fontsize=20)
    return mplfig_to_npimage(fig)

接下来定义一个声音剪辑,这里我们使用 SciPy 的 signal 模块生成一个频率为 220Hz 的正弦波:

from scipy import signal

sample_rate = 44100
duration = 5

t = np.linspace(0, duration, duration * sample_rate, False)
audio_data = np.sin(2 * np.pi * 220 * t)
audio_clip = mpy.AudioClip(audio_data, duration=duration)

然后定义一个视频剪辑,其中包括上面的图像和声音,以及一个过渡特效:

transition = mpy.transitions.crossfadein(0.5)
video_clip = mpy.VideoClip(make_frame, duration=5).with_audio(audio_clip)
video_clip = video_clip.fx(mpy.vfx.freeze, t=0.5)
video_clip = transition(video_clip.to_videofile('sin_curve.mp4', fps=25))

终于可以将视频写入文件了:

video_clip.write_videofile("sin_curve.mp4", fps=25, audio_fps=sample_rate)

这将生成一个带声音和文本标签的动画文件 sin_curve.mp4。

结束语

MoviePy 和 Matplotlib 的结合使得 Python 编写动画特别方便。除了上面的简介,还有更多丰富的功能可以供读者探索,希望这篇文章对初学者有所帮助。