python语言可以方便地制作和编辑视频,制作视频的核心是moviepy库,在使用moviepy的基础上综合调用其它的功能库,就可以做出各种有趣的视频。旋转的地球是比较常见的一个视频内容,我们看看怎样用20行代码实现它。
【视频生成的基本概念】
视频的本质就是连续的图片,利用人眼的视觉暂留而形成运动的感觉。视频有一个基本的参数叫做:FPS(frames per second):每秒多少张图片。如果一个视频的FPS=20,也就是每秒会闪过20张图片。
所以,使用moviepy生成视频的一个核心就是如下的两句代码:
animation = VideoClip(make_frame, duration=3.6)
animation.write_videofile("earth.mp4", fps=20)
- 第一句代码定义一个动画
核心中的核心:make_frame是一个自定义函数,这个函数接收一个时间参数,返回的是一张图片。
duration是视频总时长,秒为单位。比如,这里是生成一个3.6秒的动画。 - 第二句,以某个把这个帧率(FPS)将动画保存为视频文件。其实也完全可以保存为GIF,将第二行改为如下的代码:
animation.write_gif("earth.gif", fps=20)
【怎样画地球】
剩下的工作,就是在make_frame函数中,根据传入的时间参数,画出地球的图片了。我们将使用另外一个库:Basemap。basemap提供了非常方便的画地图的功能。它的安装略有复杂,但按照网上提示肯定可以操作成功,。
我们来看看地球怎样画。
def make_frame(t):
# 地图信息,采用正射投影(ortho),就有立体效果
# 面向0纬度,经度随时间而变,就出现了旋转效果!
map = Basemap(projection='ortho', lat_0=0, lon_0=-t*100)
# 地球的底色就是海洋
map.drawmapboundary(fill_color='aqua')
# 画大洲
map.fillcontinents(color='coral',lake_color='aqua')
# 海岸线
map.drawcoastlines()
# 国界线
map.drawcountries()
# 将结果转换为图片返回
return mplfig_to_npimage(fig)
是不是非常简单呢?
【加上晨昏线】
在太阳的照射下,地球上才有白天和黑夜。地球是一个球体,恰好半球黑天,半球白天。白天半球和黑夜半球的交界处,就称为晨昏线,由于它正好是一个圆形,也称为晨昏圈。我们注意到晨昏线的角度是倾斜的,因为地轴与太阳平面有一个23.5度的交角。我们还看到,北极部分完全笼罩在阴影中,而南极部分则在阳光下。说明现在是北半球的冬天,北极处于极夜状态,而南极是极昼。
只需增加两行代码,就可以实现这一功能。
time= datetime.fromtimestamp(t*24*1000)
map.nightshade(time, delta=0.2)
我们这里,将传入的参数t做一个转换。因为实际制作3.6秒视频地球旋转360度,而在实际上,地球是24个小时才转动360度。相当于放大了24*1000倍。这样的参数转换,才能让晨昏圈处于稳定的位置。
【总结】
本文讲了制作视频的基本原理,以及基于basemap的地图(地球)画法,你记住了么?