最近有一个在 Powerpoint 中设置倒计时器的需求。由于 Powerpoint 没有提供原生的功能支持,网上找到了一些插件又觉得安装起来不便,所以决定使用一个倒计时视频放置在 Powerpoint 中,即可实现倒计时的功能。

由于不同用户所需要的倒计时时间不同,因此没办法找到用于倒计时的现成视频。因此想到使用 Python 的 Matplotlib 库写一个倒计时视频。代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation

total_time = 30
alert_time = 10

REPEAT = 100

fig, ax = plt.subplots(1, 1, figsize=(6, 2.5))
plt.axis("off")
plt.tight_layout()

t = ax.text(0.5, 0.5, f"{total_time//60:02d}:{total_time % 60:02d}",
verticalalignment="center",
horizontalalignment="center",
fontdict={"fontsize": 125, "color": "k",
"family": "sans-serif", "weight": "bold"})

def animate(i):
k = i // REPEAT
t.set_text(f"{(total_time - k) // 60:02d}:{(total_time - k) % 60:02d}")
if (total_time - k) <= alert_time:
t.set_color("r" if k % 2 == 0 else "k")

ani = FuncAnimation(fig, animate, range(1, (total_time + 1) * REPEAT),
interval=1000 // REPEAT, repeat=False)

plt.show()
# ani.save("countdown.mp4", dpi=100)

这里面 total_time 表示总的倒计时秒数, alert_time 是用来在最后几秒钟,通过闪烁来提醒倒计时即将结束。 REPEAT 是一个常量,表示每一秒的画面持续的帧数。如果使用 1 秒 1 帧的话,最后生成视频的时候会出现时间上的出入。因此这里设置为 1 秒 100 帧,误差就足够小了。

最后注释掉的语句用来把视频保存为 mp4 格式,可以插入 Powerpoint 中。注意现在 Matplotlib 在安装时,不默认安装视频编码器 FFMpeg ,因此需要自行安装。只需要使用

1
conda install ffmpeg

或使用 pip 安装,即可。