Jitter 教程翻译 03 - 播放 QuickTime 视频
Max/MSP/Jitter 教程 02 - Jitter 对象的属性
00 翻译自 Cycling74 的 Max/MSP/Jitter 官方文档:Tutorial 1: Playing a QuickTime Movie
https://docs.cycling74.com/max7/tutorials/jitterchapter01
这个教程教你使用 Jitter 执行最简单但最有用的任务之一:在窗口中播放 QuickTime 视频。
打开 QuickTime 电影文件
这个 Patch 中有两个 Jitter 对象:jit.movie
和 jit.window
。
jit.window
会自动打开电脑屏幕上的窗口。jit.movie
则打开 QuickTime 视频并开始播放。
单击 read countdown.mov
的消息框,jit.movie
就会打开 QuickTime 视频文件 countdown.mov 并开始读取。
默认情况下,jit.movie
会在打开文件后立即播放。但是请注意,即使 jit.movie
对象正在播放电影,窗口中却没有显示,因为 Jitter 中的每个对象都执行特定任务——可能非常简单,也可能相当复杂。播放 QuickTime 视频实际上被分解为两个任务:
从硬盘上的文件中将每帧视频数据读入 RAM
获取 RAM 中的数据,并将其显示为屏幕上的彩色像素
第一个任务由 jit.movie
执行,第二个任务由 jit.window
执行。为了让 jit.window
知道要显示什么,这两个对象需要进行通信。
Jitter 对象如何通信
重要概念:Jitter 对象相互通信的关键是矩阵的名称 —— 它指定了数据在内存中的位置。Jitter 对象输出其他 Jitter 对象能理解的消息(
jit_matrix
,后跟空格和存储数据的矩阵名称)。此消息通过接线在对象之间传递。接收的对象从入口接收消息,从内存中的指定位置获取数据,以某种方式修改数据,并发送修改后的名称,输出到对象的左侧出口。
每个对象查看内存中相应的位置来获取所需的数据,执行各自的任务,而不必知道其他对象正在做什么。大多数 Jitter 对象只有从另一个对象获取 jit_matrix 消息,得知该查看相应的矩阵,才会对那里的数据做一些事情。
在多数情况下,Jitter 对象自己会生成唯一的名称。你也可以指定名称(最好是这样)。显式地命名矩阵,不同对象就可以使用相同的内存空间。
由 Jitter 对象触发动作
是什么让一个 Jitter 对象将 jit_matrix
消息发送给另一个对象呢?大多数 Jitter 对象在收到消息 outputmatrix
或 bang
时,会发出 jit_matrix
消息。另外,一个对象收到消息并修改了数据后,它会自动发出消息通知其他包含相同矩阵名称的对象。
也就是说,当一个对象收到 jit_matrix
消息时,它会做一些事情并发出自己的 jit_matrix
消息。当一个对象收到 outputmatrix
或 bang
时,它会发送一个 jit_matrix
消息,而不做任何其他事情。
在示例中,jit.movie
对象正在播放 QuickTime 视频,不断存储当前的视频帧,但 jit.window
对象只会在从 jit.movie
对象接收到 jit_matrix
消息时显示内容。只有当 jit.movie
收到消息bang
(或 outputmatrix)时才会发生这种情况。那时 jit.window
将显示当前正在电影中播放的任何视频帧。
为了使 jit.window
以一定速度更新并不断显示视频帧,就需要以同样的速度发送 bang
消息给 jit.movie
。
视频在 jit.movie 中播放,每当要显示一帧时都要发送 bang 消息
单击标记了 play 的开关,
metro
对象就会启动。这将以每秒 25 次(每 40 毫秒)的速度发出bang
消息。这个速度足以显示该视频的每一帧。只要bang
继续,我们就能看到窗口中显示的视频。
jit.window 显示矩阵的内容
点击开关停止 metro
。jit.window
对象停止更新电影窗口,现在只会看到最后显示的静止图像。电影仍在播放 - jit.movie
仍在逐帧更新内存 - 但 jit.window
会忽略这些更新,因为 jit.movie
不再发送消息。
可以单击 metro
下方的按钮来验证电影是否仍在播放。这会让 jit.movie
将 jit_matrix
消息发送到 jit.window
,当前帧会更新 Movie 窗口。连续点几次,会看到电影在鼠标点击之间有变化。
总而言之,jit.movie
以视频正常速率逐帧读取 QuickTime 文件的一帧。当 jit.movie
收到 bang
消息时,会将该数据的位置传达给 jit.window
,然后 jit.movie
收到 bang
时所包含的任何帧都由 jit.window
显示出来。
对象中的参数
本教程中的 jit.movie
的两个参数 320 和 240,指定了对象在内存中保留单帧视频时的宽度和高度。它会声明足够的 RAM 来存储这些帧。因此,使用 read 消息输入希望读入的视频的尺寸是 ok 的。这样我们知道 QuickTime 视频的尺寸是 320x240。
如果输入的维度小于读入的视频的尺寸,jit.movie
没法声明足够的存储空间,就不得不忽略每帧的一些像素。相反,如果输入的维度大于读入的视频尺寸,则每一帧中都没有足够的像素来填充已分配的内存空间,因此 jit.movie
会平均分发数据,并用重复数据填充空余的内存。
jit.window
对象有五个输入的参数:Movie 5 41 325 281
。第一个参数是 矩阵的名称。它也会出现在视频窗口的标题栏中。它可以是任何单词(用引号括起来的话,可以是多个单词)。接下来的两个参数,表示视频窗口显示区域左上角的 x,y 屏幕坐标,后两个参数是显示区域右下角的坐标(左-上-右-下)。选择了这些数字是因为
它们定义了一个 320x240 的显示区域,与视频尺寸相同
当考虑操作系统默认的窗口边框、标题栏和菜单栏的尺寸时,窗口刚好隐藏在桌面的左上角。(当然也可以设置标题栏不显示)
输入 metro
的参数 40,使其每秒发出 25 次 bang
消息。QuickTime 视频的帧速率是每秒24帧,因此这个 metro
持续触发 jit.movie
对象,确保每帧都能显示。
要播放 QuickTime 视频,请使用 jit.movie
打开文件并将视频的连续帧读入 RAM,然后使用 jit.window
在单独的窗口中显示视频。使用输入的参数指定视频的尺寸,以及屏幕上显示区域的精确坐标。
小结
Jitter 对象相互发送矩阵的名称来传递特定视频帧的信息——该信息在内存中的位置。 Jitter 对象获得矩阵名称时,它使用该位置的数据执行指定的任务,然后将修改后的数据发送给其他 Jitter 对象。几乎所有 Jitter 对象在收到 bang
消息 (或 outputmatrix)时都会发出一个名称(包含在jit_matrix
消息中)。因此,为了显示视频的连续帧,以某个速率向 jit.movie
发送 bang
消息,然后连接到 jit.window
显示。
友情提示:独自折腾 Max 易患上癔症……不妨入群互助
👇👇👇
更多 Max/MSP 应用,请翻阅 MakeNoise 系列
MakeNoise01 - 声音是什么?
MakeNoise02 - 频率和音高
MakeNoise03 - 振幅/响度/音量/增益 大乱斗
MakeNoise04 - 波形和相位
MakeNoise05 - Envelope 包络(ADSR)
MakeNoise06 - 音色和均衡器(EQ)
MakeNoise07 - 音频的「分辨率」
MakeNoise08 - 振荡器和滤波器
MakeNoise09 - 压缩 Compression
MakeNoise10 - 延时和混响