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的地图(地球)画法,你记住了么?