跳转至

嘉宾请求 - 如何创建动画绘图视频

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/guest-request-how-to-create-an-animated-plot-video

13932 为本文评分:

4.5

嘉宾请求 - 如何创建动画绘图视频

Jim Pendleton 2014年8月21日 星期四

最近,我有机会和一位大学时代的朋友在博尔德附近徒步旅行。他现在是一位成功的科学家,从1985年左右就开始使用IDL。我觉得这之间有因果关系。

当然,因为我们俩都是科学和软件迷,话题很快就从家庭和大自然的恢复力量,转向了40多岁人群的普遍健康问题,以及编码难题。

他问了我一个实际问题。"假设我想制作一个动画绘图,并通过编程为演示文稿生成一个视频。如今在IDL中这容易实现吗?"

他已经有好几个版本没研究IDL文档的新功能部分了。科学研究优先,他的印象还停留在现在已经过时的MPEG_WRITE功能上。

答案当然是,现在的IDL确实让这个任务变得非常简单。下面是一个快速示例,展示如何制作一个简单的正弦波绘图动画。

(请记住,从8.3版本开始,您可以将包括IDL提示符在内的行从本网页复制并粘贴到Workbench IDL控制台,"IDL>"字符串会被自动去除。)

首先,使用 PLOT 函数生成您的波形。

IDL> x = findgen(361)*!dtor IDL> y = sin(x) IDL> p = plot(x, y)

对于本次练习,我们将在您的临时目录中生成一个MPEG-4输出文件。

IDL> file = filepath('test.mp4', /tmp)

我们将使用 Plot::CopyWindow 方法从绘图图形中抓取位图。该方法返回的数据格式完全符合 WRITE_VIDEO 过程所需的输入格式。

如果您是使用 Direct Graphics 生成输出,等效操作是调用函数 TVRD(TRUE=1) 。如果您使用的是 Object Graphics,则从您的目标对象(如 IDLgrWindow)中获取 IMAGE_DATA 属性。

IDL> write_video, file, p.copywindow(/antialias), handle = handle, $ IDL> format = 'mp4', video_fps = 30

现在我们已经写好了视频的第一帧。

这里,我们明确指定格式为MPEG-4,视频播放速率为每秒30帧。在第一次调用WRITE_VIDEO时,HANDLE 关键字是一个输出参数。我们在写入后续帧时将其用作输入。

让我们以1度为单位,循环遍历360度,并在每一步更新绘图。我们的动画将在播放时生成大约12秒的视频。(361帧 / 每秒30帧)。

IDL> for i = 0, 359 do begin & $ IDL> y = shift(y, 1) & $ IDL> p.setdata, x, y & $ IDL> write_video, file, p.copywindow(/antialias), handle = handle & $ IDL> endfor

一旦我们写完了所有帧,就显式地关闭视频文件以提交更改。

IDL> write_video, /close, handle = handle

如果您运行的操作系统支持文件关联,您应该能够直接从IDL SPAWN 该文件来验证其播放。

IDL> spawn, file, /hide

这确实很容易。

如果您想在关键时刻"放慢"动画以进行突出显示,只需将单个图像缓冲区多次写入视频即可。例如,您可以添加以下代码片段,在播放到中间帧时减慢动画速度:

if (i gt 90 && i lt 270) then begin
    for j = 0, 3 do begin
        write_video, file, p.copywindow(/antialias), handle = handle
    endfor
endif

WRITE_VIDEO 过程是 IDLffVideoWrite 类的一个封装器,而该类又封装了流行的开源FFmpeg库。WRITE_VIDEO 还提供了向视频写入音频流的选项。

如果您需要使用IDL默认不支持的格式(例如H.264视频格式或MP3音频)来编写动画,请在在线帮助中参阅 创建视频 主题下的"替换FFmpeg版本"说明。

利用气候分析即服务实现大数据科学 从过去到现在的态势感知