Max/MSP/Jitter 官方教程翻译03 - 播放 QuickTime 视频

00 翻译自 Cycling74 的 Max/MSP/Jitter 官方文档:Tutorial 1: Playing a QuickTime Movie

这个教程教你使用 Jitter 执行最简单但最有用的任务之一:在窗口中播放 QuickTime 视频。


打开 QuickTime 电影文件

这个 Patch 中有两个 Jitter 对象:jit.movi​​ejit.windowjit.window 会自动打开电脑屏幕上的窗口。jit.movi​​e 则打开 QuickTime 视频并开始播放。

单击 read countdown.mov 的消息框,jit.movi​​e 就会打开 QuickTime 视频文件 countdown.mov 并开始读取。

默认情况下,jit.movi​​e 会在打开文件后立即播放。但是请注意,即使 jit.movi​​e 对象正在播放电影,窗口中却没有显示,因为:

Jitter 中的每个对象都执行特定任务——可能非常简单,也可能相当复杂。播放 QuickTime 视频实际上被分解为两个任务:

  1. 从硬盘上的文件中将每帧视频数据读入 RAM
  2. 获取 RAM 中的数据,并将其显示为屏幕上的彩色像素

第一个任务由 jit.movi​​e 执行,第二个任务由 jit.window 执行。为了让 jit.window 知道要显示什么,这两个对象需要进行通信。

Jitter 对象如何通信

重要概念:Jitter 对象相互通信的关键是矩阵的名称 —— 它指定了数据在内存中的位置。Jitter 对象输出其他 Jitter 对象能理解的消息(jit_matrix,后跟空格和存储数据的矩阵名称)。此消息通过接线在对象之间传递。

接收的对象从入口接收消息,从内存中的指定位置获取数据,以某种方式修改数据,并发送修改后的名称数据,输出到对象的左侧出口。

这样每个对象查看内存中相应的位置来获取所需的数据,执行各自的任务,而不必知道其他对象正在做什么。大多数 Jitter 对象只有从另一个对象获取 jit_matrix 消息,得知该查看相应的矩阵,才会对那里的数据做一些事情。

在多数情况下,Jitter 对象自己会生成唯一的名称。你也可以指定名称(最好是这样)。显式地命名矩阵,不同对象就可以使用相同的内存空间。

由 Jitter 对象触发动作

是什么让一个 Jitter 对象将 jit_matrix 消息发送给另一个对象呢?大多数 Jitter 对象在收到消息 outputmatrixbang 时,会发出 jit_matrix 消息。另外,一个对象收到消息并修改了数据后,它会自动发出一条 jit_matrix 消息,通知其他包含相同矩阵名称的对象。

也就是说,当一个对象收到 jit_matrix 消息时,它会做一些事情并发出自己的 jit_matrix 消息。当一个对象收到 outputmatrixbang 时,它会发送一个 jit_matrix 消息,而不做任何其他事情。

因此在示例中,jit.movi​​e 对象正在播放 QuickTime 视频,不断存储当前的视频帧,但 jit.window 对象只会在从 jit.movi​​e 对象接收到 jit_matrix 消息时显示内容。只有当 jit.movi​​e 收到消息bang(或 outputmatrix)时才会发生这种情况。那时,jit.window 将显示当前正在电影中播放的任何视频帧。

为了使 jit.window 以一定速度更新并不断显示视频帧,就需要以同样的速度发送 bang 消息给 jit.movi​​e


视频在 jit.movi​​e 中播放,每当要显示一帧时都要发送 bang 消息

  • 单击标记了 play 的开关,metro 对象就会启动。这将以每秒 25 次(每 40 毫秒)的速度发出 bang 消息。这个速度足以显示该视频的每一帧。只要 bang 继续,我们就能看到窗口中显示的视频。


jit.window 显示矩阵的内容

  • 点击开关停止 metrojit.window 对象停止更新电影窗口,现在只会看到最后显示的静止图像。电影仍在播放 - jit.movi​​e 仍在逐帧更新内存 - 但 jit.window 会忽略这些更新,因为 jit.movi​​e 不再发送消息。

  • 你可以单击 metro 下方的按钮,来验证电影是否仍在播放。这会让 jit.movi​​ejit_matrix 消息发送到 jit.window,当前帧会更新 Movie 窗口。连续点几次,会看到电影在鼠标点击之间有变化。

总而言之,jit.movi​​e 以视频正常速率逐帧读取 QuickTime 文件的一帧。当 jit.movi​​e 收到 bang 消息时,会将该数据的位置传达给 jit.window,然后 jit.movi​​e 收到 bang 时所包含的任何帧都由 jit.window 显示出来。

对象中的参数

本教程中的 jit.movi​​e 的两个参数 320 和 240,指定了对象在内存中保留单帧视频时的宽度和高度。它会声明足够的 RAM 来存储这些帧。因此,使用 read 消息输入希望读入的视频的尺寸是 ok 的。这样我们知道 QuickTime 视频的尺寸是 320x240。

如果输入的维度小于读入的视频的尺寸,jit.movi​​e 没法声明足够的存储空间,就不得不忽略每帧的一些像素。相反,如果输入的维度大于读入的视频尺寸,则每一帧中都没有足够的像素来填充已分配的内存空间,因此 jit.movi​​e 会平均分发数据,并用重复数据填充空余的内存。

jit.window 对象有五个输入的参数:Movie 5 41 325 281。第一个参数是 jit.window 显示的矩阵的名称。它也会出现在视频窗口的标题栏中。它可以是任何单词(用引号括起来的话,可以是多个单词)。接下来的两个参数,表示视频窗口显示区域左上角的 x,y 屏幕坐标,后两个参数是显示区域右下角的坐标(左-上-右-下)。选择了这些数字是因为

  • 它们定义了一个 320x240 的显示区域,与视频尺寸相同
  • 当考虑操作系统默认的窗口边框、标题栏和菜单栏的尺寸时,窗口刚好隐藏在桌面的左上角。(当然也可以设置标题栏不显示)

输入 metro 的参数 40,使其每秒发出 25 次 bang消息。QuickTime 视频的帧速率是每秒24帧,因此这个 metro 持续触发 jit.movi​​e 对象,确保每帧都能显示。

要播放 QuickTime 视频,请使用 jit.movi​​e 打开文件并将视频的连续帧读入 RAM,然后使用 jit.window 在单独的窗口中显示视频。使用输入的参数指定视频的尺寸,以及屏幕上显示区域的精确坐标。

小结

Jitter 对象通过相互发送矩阵的名称,来传递特定视频帧的信息——该信息在内存中的位置。 Jitter 对象获得矩阵名称时,它使用该位置的数据执行指定的任务,然后将修改后的数据名称,发送给其他 Jitter 对象。几乎所有 Jitter 对象在收到bang消息 (或 outputmatrix)时都会发出一个名称(包含在jit_matrix消息中)。因此,为了显示视频的连续帧,以某个速率向 jit.movie 发送 bang 消息,然后​​连接到jit.window显示。


跟踪每个对象的消息和角色


友情提示:独自折腾 Max 易患上癔症……不妨入群互助

👇👇👇

kidult00 wechat
扫码关注 00 的公众号
如果文章帮您节省时间或者解答疑问,不妨打个赏 :)