伍志元的博客分享 http://blog.sciencenet.cn/u/vuchiyuan

博文

[转载]如何制作科学演示动画?

已有 5112 次阅读 2019-2-21 04:52 |系统分类:科研笔记|文章来源:转载

如何制作科学演示动画?

转自北京大学物理学院大气与海洋科学系气候组


我们通常使用 NCL 或类似的科学计算/绘图软件,来计算数据、绘制图片。但某些时候,静态图片明显不如动态画面更有优势。那么如何用 NCL 来制作动画或视频呢?

基本原理

不论是动画文件(gif),还是视频文件(mov, mp4, avi, ogg, webm),本质上都是一连串静态图片的连续播放,速度越快,连贯性越好,看起来越舒服。在动画术语中,每 1 副静态图像在动画中称为 1 frame,传统胶片电影的播放速度是 26 frames/sec,导演在电影后期制作中本质上就是不断地 cut and paste,把适当的静态照片连起来而已。人眼的分辨能力有限,当播放速度达到 15-20 frames/sec 以上时,人眼就感觉是一个很不错的连续画面了。

还有一个概念,就是动画文件(gif)与视频文件(mov,mp4,avi,ogg,webm)的区别是什么?动画文件是简单地把静态图像连起来,其文件内部其实就是一个图片、一个图片连续保存、再加上一些播放参数(如画面间隔时间)而已。因此,动画文件等同于对静态图片的简单打包,通常一段很短的动画文件,体积都非常大。这对文件的拷贝、播放都提出了较高的硬件要求,连续性也达不到很高的速度。例如:gif文件一般只能连接几百~上千个静态图片,以 10 frames/sec 的速度播放,再高的速度通常要求画面尺寸要很小。与此相反,视频文件并不是简单地把一连串图片连续存储起来,而要在时间维度上进行超高效率的压缩。事实上,各种不同的视频格式本质上都是在pk压缩算法,看谁的压缩效率更高,而画面损失更少。正是由于视频文件比动画文件使用了高效的压缩算法,使得视频文件通常很小,对拷贝和播放的要求明显降低,而最终的播放效果却明显提高。

因此,如果只是简单展示几张图片连起来的动画,用 gif 动画文件是适合的;如果希望展示复杂的类似电影般的动画效果,还是应以制作视频文件为方向。

生成图片序列

在 NCL 中生成图片序列有两种方法。

第一种是在 NCL 脚本中的绘图部分使用 do 循环体;

第二种是 NCL 脚本只画一张图,但在 NCL 脚本外面嵌套一个 C Shell 脚本,通过 C Shell 脚本里的循环向 NCL 内部传递一些参数(如文件名、变量名、时间层等信息)来生成图片序列。我们推荐使用第二种,理由是第二种画图方法在调试时很方便,NCL脚本只需要但一地完成一幅静态图片的计算和绘制即可,而“重复”这个动作就交给 C Shell 脚本吧。两者各司其职,一个负责专心绘图,一个负责循环调用,是最好的解决方案。

制作动画文件(GIF)

用神一般的命令 convert 即可把一个图片序列生成为一个gif文件,而且还能指定播放时图片之间的时间间隔,如下:

convert -delay 10   demo.????.jpg demo.gif    把当前目录下 *.jpg 图片以每秒10张的速度连成 demo.gif
convert -delay 50   demo.????.gif demo.gif    把当前目录下 *.gif 图片以每秒2张的速度连成 demo.gif
convert -delay 100  demo.????.png demo.gif    把当前目录下 *.png 图片以每秒1张的速度连成 demo.gif

值得说明的是,只要是把图片序列转换为 gif 动画,画面质量是一定会损失的。因为 gif 文件格式要求只能使用 256 色,这几乎是目前各种图片格式里允许使用颜色数量最少的图片格式了。为什么?因为 gif 格式设计之初,是为了显示网页中的 logo 动画的,比如忽闪忽闪的霓虹灯,比如眨眼的小动物。这些卡通性质的 logo 通常只需要很少数量的颜色即可,因此 gif 就规定了 256 色的上限。另外,gif 有时候会有版权问题,因为本质上 gif 不是一个开放格式,是一个专属格式。只不过现在全世界对 gif 格式的使用已经到了泛滥的程度,估计其母公司已经不好意思起诉任何人了。

制作视频文件

视频制作需要的不仅是技术,也需要你具有一定的美术感觉。两者的结合才能制作出令人赏心悦目的视频。如果你只需要把一个图片序列制作成一个 video,那么只要看下面的简单版即可。如果你希望对图片的摆放等进行一定的调整,使得视频画面更加美观,可参考下面的高级版。

1. 简单版

使用 mencoder 命令可以指定很多制作视频时的参数,可以制作出高分辨率、高压缩率的视频文件。一个例子如下:

mencoder "mf://*.jpg" -mf w=1920:h=1080:fps=25:type=jpg -oac copy -ovc x264 -x264encopts preset=veryslow:tune=film:crf=15:frameref=15:fast_pskip=0:threads=auto -nosound -o demo.avi

这个命令可以把当前目录下 *.jpg 文件制作成一个 demo.avi 视频文件。这个视频是标准 1080p HD 分辨率(1920×1080),这也是高清电影的标准尺寸。视频信号采用 x264 标准进行压缩。剔除了所有音轨。播放速度为 25 frames/sec。

注意:我们在 climateserver 上安装了 mencoder,这并不是一个常见软件,在通常的服务器上都不是默认安装的。如果你所使用的服务器上没有这个命令,你可以和管理员联系安装。

2. 高级版

如何把已有的图片序列,按照一定的布局组织起来,制作出精美的视频文件,是这一节所要讨论的内容。

假定我们有3个图片序列,1个是 CPU 计算产生的模拟结果,1个是 GPU 计算产生的模拟结果,最后1个是两者之差。我们已经画出了3个图片序列,想把他们摆放在一起,做一个视频。那么可以用如下脚本,本质上就是反复使用 convert 神命令来安排画面布局,来生成一个经过合理布局后的新的图片序列:

#!/bin/tcsh set lacoas = LaCOAS.jpg set n = 0 while ($n <= 1499) 	if ($n < 10) then		set no = 000$n	endif 	if (($n >= 10)&&($n < 100)) then		set no = 00$n	endif 	if (($n >= 100)&&($n < 1000)) then		set no = 0$n	endif 	if ($n >= 1000) then		set no = $n	endif 	echo "processing ... $no" 	set demo1 = ./pic.cpu/eps/demo.$no.eps	set demo2 = ./pic.gpu/eps/demo.$no.eps	set demo3 = ./pic.diff/eps/demo.$no.eps if(-e $demo1) then 	set tmp1 = tmp1.jpg	set tmp2 = tmp2.jpg	set tmp3 = tmp3.jpg 	set tmp11 = tmp11.jpg	set tmp22 = tmp22.jpg	set tmp33 = tmp33.jpg 	convert -trim -density 200 $demo1 $tmp1	convert $tmp1 -resize 550 $tmp11 	convert -trim -density 200 $demo2 $tmp2	convert $tmp2 -resize 550 $tmp22 	convert -trim -density 200 $demo3 $tmp3	convert $tmp3 -resize 550 $tmp33 	convert -size 1920x1080 xc:white \		$tmp11  -geometry +80+280	-composite \		$tmp22  -geometry +680+280	-composite \		$tmp33  -geometry +1280+280	-composite \		$lacoas -geometry +1480+20	-composite \		-fill black -font Helvetica-Bold -pointsize 40 -draw "text 30,60 'Normal Bell Test" \		-fill gray  -font Helvetica      -pointsize 33 -draw "text 30,100 'PKU Shallow Water Model (2x2)'" \		-fill black -font Times-Roman -pointsize 20 -draw "text 1500,1060  'Xinyu Wen, Zhe Jia & Wengui Liang, Dec 2013'" \-fill navy -font Helvetica-Bold -pointsize 60 -draw "text 296,230 'CPU'" \-fill navy -font Helvetica-Bold -pointsize 60 -draw "text 890,230 'GPU'" \-fill red -font Helvetica-Bold -pointsize 60 -draw "text 1418,230 'CPU-GPU'" \		./pic/compose.$no.jpg 	rm -f $tmp1 $tmp2 $tmp3 $tmp11 $tmp22 $tmp33 endif 	@ n++end

这样就生成了全新的图片序列 ./pic/compose.????.jpg,接下来在运行如下脚本,即可把这些经过布局排版后的新图片序列连接制作出视频文件:

#!/bin/tcsh set id = demo.CPU.vs.GPUcd pic#mencoder "mf://*.jpg" -mf w=1920:h=1080:fps=30:type=jpg -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1600 -of lavf -oac copy -nosound -o $id.mp4mencoder "mf://*.jpg" -mf w=1920:h=1080:fps=25:type=jpg -oac copy -ovc x264 -x264encopts preset=veryslow:tune=film:crf=15:frameref=15:fast_pskip=0:threads=auto -nosound -o $id.avi

最终生成的视频效果如下,请下载后观看:

Download PKU Shallow Water Model 1.0_c_hu

视频格式

最后一个值得讨论的问题是:视频格式。

用上面的 mencoder 命令生成视频文件是 avi 扩展名,avi 本质上只是一个“容器格式”,英文是 container。它并不意味着内部的视频和声频采用什么样的压缩算法。具体到上面我们使用的命令,实际上使用了 x264 作为编码算法对视频进行压缩,而没有任何声频数据。这样的视频文件在一般的计算机上播放都是没有任何问题的。

如果要在网页上展示怎么办?

在网页上显示视频动画,本质上一定要依赖于 HTML5 标准。因为在 HTML5 标准中包含了对 video 的直接支持。目前,HTML5标准中一共给出了三种解决方案:ogg开放格式;webm开放格式;mp4专有格式。实际上,不同的浏览器对三种格式的支持程度差距不小,因此恐怕短期内还没有任何一种在主流浏览器中都获得了完美支持,这本质上反映了一个标准诞生之前各个厂商的自利的心态。关于这一点,欲了解更多信息,请参考如下网页:

http://www.w3school.com.cn/html5/html_5_video.asp

我们推荐使用如下网页的服务,把 avi 格式的视频文件转换为 ogg 格式,就可以很容易获得 Chrome/Firefox/Opera 等主流浏览器的支持了。不用管 IE/Safari 这两个自私的浏览器吧,自私者不需要获得别人的关照。

http://video.online-convert.com/convert-to-ogg

如果要在 slides 报告中使用又怎么办?

在 Windows 操作系统下,通常使用 Powerpoint 作为报告演示软件(以下简称ppt)。ppt中对视频的支持并不完备,因此至少在我使用的 2007 之前的版本中,几乎都无法流畅地插入视频文件,而且即使能够插入,在播放时也没有 navigation bar。所以,通常我们不在 ppt 中直接插入视频文件。注意!!!这一点可能在最新的版本中有所改善,只是我没用过 Powerpoint 2011/2013,所以不清楚最新近况。

在 Mac OS 操作系统中,通常使用 KeyNote 作为报告演示软件(以下简称kn)。kn中对视频的支持也有限,几乎只对一种它自己的专有格式支持良好:mov 视频。因此,我们通常使用如下网页服务,把 avi 格式的视频转换为 mov 格式,再插入kn即可。kn对mov格式的视频支持效果很出色,方便易用,演示时有漂亮的 navigation bar 附在动画下方。

http://video.online-convert.com/convert-to-mov

总结

更好地利用动画和视频来展示你的结果,说明你的观点,是一个虽然学习曲线不算太平,但值得学习并使用的能力。如果说一张图可以代替100个文字、1分钟语言的话,那么一个高水准、清晰、美观的视频,则有可能代表一个报告的全部!并且,令人印象深刻、难以忘怀。




https://blog.sciencenet.cn/blog-715445-1163322.html

上一篇:动画:2015年西北太平洋表层海流运动
收藏 IP: 134.88.255.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-25 13:53

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部