6.6 自动生成图像视频¶
6.6.1 准备工作¶
如果你和我一样使用的是 Jupyter
这个工具的话,在绘制之前,需要安装一个工具,就是 ffmpeg
。
安装方法,可以参考 「在Windows上安装FFmpeg程序」
由于我使用的是 Anaconda ,我需要将其安装到我的环境中。首先打开我们的命令行(注意不是一般的CMD),使用windows 的查找入口:
然后执行如下命令安装
conda install -c conda-forge ffmpeg
6.6.2 绘制原理¶
我们都知道,视频是由一帧一帧的图片画面组合而成的。只不过其切换的速度很快,过渡平滑,才让我们看起来毫无违和感。
视频的录制,其实和上一章的 gif
动态图用法是一致的,只不过有用的工具方法有所不同而已。这里使用的是HTML(ani.to_html5_video())
接下来,来看看绘制的整体代码框架(伪代码)。
# 导入相关模块
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import HTML
from matplotlib.animation import FuncAnimation
# 生成数据(用于传入updata函数)
def data_gen():
pass
# 初始化图像(譬如 坐标范围)
def init():
pass
# 将最新数据添加到图像中
def update(data):
pass
# 核心方法入口
ani = FuncAnimation()
# 生成一个视频动画
HTML(ani.to_html5_video())
需要注意的是,最后一个 HTML 函数里指定 to_html5_video
方法,能和这一整个变化的过程,转换成一个视频片段。可以很方便的让我们在
Jupyter NoteBook 里观察整个变化的过程。
生成的视频,可以反复播放,当然也可以右键进行下载
。
6.6.3 方法参数¶
本节最重要的知识点,其实就一个函数(FuncAnimation
),他可以接收很多参数。要使用它,必须得先知道这些参数都有什么用途。
fig
:进行动画绘制的figureinit_func
:自定义开始帧,即传入刚定义的函数initinterval
:更新频率,以ms计。blit
:选择更新所有点,还是仅更新产生变化的点。应选择True。func
:接收来自 frames 函数传来的 frame 值,作为更新图像最新数据。frames
:可接收对象有 iterable, int, generator function, or None。用途生成数据传递给func函数
6.6.4 录制实战¶
这里截取官网上一个小例子,来做个演示。代码如下:
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import HTML
from matplotlib.animation import FuncAnimation
# 生成数据(用于传入updata函数)
def data_gen(x=0):
cnt = 0
while cnt < 1000:
cnt += 1
x += 0.1
yield x, np.sin(2*np.pi*x) * np.exp(-x/10.)
# 初始化图像(譬如 坐标范围)
def init():
ax.set_ylim(-1.1, 1.1)
ax.set_xlim(0, 10)
del xdata[:]
del ydata[:]
line.set_data(xdata, ydata)
return line,
# 将最新数据添加到图像中
def update(data):
x, y = data
xdata.append(x)
ydata.append(y)
line.set_data(xdata, ydata)
return line,
fig, ax = plt.subplots()
line, = ax.plot([], [], lw=2)
ax.grid()
xdata, ydata = [], []
ani = FuncAnimation(fig=fig,
func=update,
frames=data_gen,
init_func=init,
interval=20,
repeat=False,
blit=False)
HTML(ani.to_html5_video())
将这段代码放入,NoteBook 里运行后。会输出一个小短片。
我将这个小短片下载并上传至后台,你可以点击 公众号原文 感受一下。