Furality Ultra Club A/V 技术报告
摘要
一份由 Furality 制作人撰写的技术报告,详细介绍了 Furality Ultra Club 活动的音视频制作流程,包括视频广播、DMX 灯光控制和虚拟世界功能。
<p><a href="https://lobste.rs/s/r3ln3z/furality_ultra_club_v_writeup">评论</a></p>
查看缓存全文
缓存时间: 2026/06/30 11:36
# Furality Ultra Club 音视频制作报告
来源:https://value.gay/blog/furality-ultra-av/
嗨,我是 Value。我是 Furality 音视频团队的制作人之一,想聊聊 Furality Ultra 筹备过程中的音视频制作。这不是 Furality 的官方报告,也不代表 Furality 的任何观点或未来计划。这只是我个人的分享,讲述我在本届音视频制作周期中接触和学习到的东西。
今年我负责制作场景、开发工具、创建工作流,帮助处理突发问题并协调工作。
我不是世界场景的制作人——那是 Micca(以及创意团队的其他成员)的工作。因此,任何与俱乐部世界相关的内容可能并非 100% 准确。
### 术语 (https://value.gay/blog/furality-ultra-av/#terminology)
- **"CRVF"** – 俱乐部就绪视频文件(Club Ready Video File),即我们播出的包含 DJ 介绍、DJ 混音、视觉、灯光、倒计时等内容的文件。
## 舞台技术 (https://value.gay/blog/furality-ultra-av/#stage-tech)
今年我们以 2560x1440 分辨率、30fps、H.264 编码、8Mbps 码率通过 RTSP 流式传输到世界。广播交付由 VRCDN 处理。所有俱乐部节目都通过这个视频广播传入。因此,你所看到的一切都由这个视频控制。
CRVF
这个视频被分割成多个“切片”,我们可以向其中填充内容。
CRVF
CRVF
世界将这些视频切片切割开,并将切片用于各个元素,如屏幕、全息投影、DJ 台等。
顶部的“DMX”切片包含使用 MDMX 系统编码为二进制的 DMX 数据。每个白色/黑色方块是一个 4x4 像素区域,编码单个比特。黑色区域为 0,白色区域为 1。每列包含 6 字节数据,末尾附带 4 位 CRC 用于错误检查。因此每列有 `6*8+4=52` 位。关于 MDMX 的更多信息,请参阅 Stage Flight 补丁表 (https://docs.google.com/spreadsheets/d/1Ja2MNUpNjJ7rvvbwJbI7oPJigNGIpVu1WQi0lew35io/edit?gid=394322462#gid=394322462) 和 Micca 的 MDMX 仓库 (https://github.com/micksam7/VRC-MDMX)。
我们使用 Furality Gridnode (https://github.com/furality/furality-grid-node) 从专业灯光软件(如 grandMA3、MagicQ、QLC)以及 Blender 和其他 DMX 输出软件中接收 DMX。Fgrid 随后将 DMX 转换为二进制网格节点,我们可以将其广播到世界。
CRVF
Fgrid 通过 Spout 输出这个二进制网格节点,因此我们可以在 OBS 中捕获并录制它。也可以截图。
### 世界特性 (https://value.gay/blog/furality-ultra-av/#world-features)
今年世界拥有:
- 8 个屏幕,具备 6 自由度(DoF)和 2 轴缩放。
- 一个粒子屏幕,具备 6 DoF 和缩放。
- 一个粒子系统。
- 36 个聚光灯,附带预烘焙体积光(“lutbeams”),安装在具备 3 DoF 的灯光机器人上。
- 82 个遍布世界的帕灯。
- 20 个 2D 激光,安装在具备 6 DoF 的 FX 机器人上。
- Jill 😳(那个大生物)。
- 包含多个可选行星的背景,以及中间的扭曲模式。
- FX 机器人上的烟花。
### 屏幕 (https://value.gay/blog/furality-ultra-av/#screens)
屏幕很有趣。每个屏幕可以在 `[-50;50]` 立方体内移动和旋转,并在 `[0;5.8]` 单位之间缩放。每个屏幕可以从视频映射的 8 个屏幕切片中选取一个。每个屏幕还可以选择哪个其他屏幕作为其遮罩,从而使我们能够构建比单纯正方形更复杂的形状。
### DMX 编程 (https://value.gay/blog/furality-ultra-av/#dmx-programming)
除了视觉内容,世界的其余部分通过 DMX 进行编程,并通过二进制 MDMX 流式传输到世界。我们使用补丁表来了解俱乐部的功能,并明确要编程的内容。以下是 Stage Flight 的补表示例 (https://docs.google.com/spreadsheets/d/1Ja2MNUpNjJ7rvvbwJbI7oPJigNGIpVu1WQi0lew35io/edit?gid=0#gid=0)。补丁表概述了各个灯具的位置及其能力。然后我们可以将这些灯具映射到我们的 DMX 软件中,从而控制世界。
为了快速编程和预览 DMX,我们使用 MIDIDMX (https://github.com/micksam7/VRC-MIDIDMX)。它通过 MIDI 编码 DMX 并发送到 VRChat 客户端。世界读取这些 MIDI 数据,使我们能够以最小延迟控制世界。
## Blender (https://value.gay/blog/furality-ultra-av/#blender)
鉴于俱乐部几乎所有部分都具备 6 DoF 和缩放控制,我们需要一种方式来整体控制。我们最终使用了 Blender 和 Happyrobot 的 DMX 插件 (https://github.com/Happyrobot33/blender-DMX-connector)。
我将绑定导入一个 Blender 文件,创建了设置说明,并与团队其他成员分享。
CRVF
每个对象代表一个灯具,我们在这些对象上设置了自定义属性来控制该灯具的通道。对于更复杂的通道,如 XYZ 位置、XYZ 欧拉角和缩放,我们使用文本块属性,该属性运行一个脚本,将对象变换编码为 DMX。
CRVF
这样,我们就能从 Blender 控制屏幕和其他物体了!
这是我工作用的 blend 文件中最终拥有的集合数量。
我使用的工作流是将每个场景分离到自己的集合中,创建该场景所需参考灯具的链接副本,并将其放入集合中。
由于 Blender 拥有完整的动画工具套件,我们可以实现一些有趣且不平凡的效果!
### 设置指南 (https://value.gay/blog/furality-ultra-av/#setup-guide)
你可以在我编写的指南中找到如何设置这个 Blender 工具的方法(抱歉,不包含 .blend 文件!),点击此处查看 (https://value.gay/blog/assets/files/F9_Blender_Plugin_Guide-9fa8a3b93b4856fdbe5b66a4e1d46804.pdf)。
### 约束 (https://value.gay/blog/furality-ultra-av/#constraints)
我们可以让物体追踪其他物体。例如,这被用于 Daxan 的 Jill 与 UFO 的战斗场景。Jill 和 UFO 都配备了带有激光的 FX 无人机,彼此追踪。我还为 UFO 设置了一些小型绑定,以便轻松制作动画,从而使 UFO 及其上的 FX 无人机和粒子屏幕能够随着 UFO 根对象一起运动。
追踪是通过单个物体上的“追踪到”约束实现的,并将它们指向一个追踪对象。
Trackto
### 驱动器 (https://value.gay/blog/furality-ultra-av/#drivers)
驱动器允许我们在灯具的各个通道之间建立关系。例如,我利用它创建了一个简单的 Jill 尾巴绑定:
Tail 1 控制其他 4 条尾巴的折叠度和宽度。
Tail 5 摆动 = `1 - Tail 1 摆动`
Tail 4 摆动 = `1 - Tail 2 摆动`
因此,驱动器让我们能够轻松映射这些关系。
### 动画 (https://value.gay/blog/furality-ultra-av/#animations)
Blender 支持关键帧!因此我们可以对物体变换和自定义属性设置关键帧。
回到 Daxan 的 Jill 对 UFO 的战斗,整个过程都是通过动画完成的。我导出了该段落的音频,将其放入 Blender 的视频编辑器时间线中,以便根据音乐进行记时,然后在一系列场景中设置关键帧动作。
这是 Jill 戏弄 UFO 的场景。取消静音以听到音频。
Timeline
请注意,这仅仅是 DMX 编程,因此我们看不到视觉效果和 UFO。视觉内容是在 Davinci Resolve 中后期添加的。
### 视频播放 (https://value.gay/blog/furality-ultra-av/#video-playback)
虽然我没勇气在 Blender 中做视频编辑(它不太符合我的需求),但 Blender 的视频播放功能对于精确依据时间码编排场景非常有用。上面我提到了如何使用音频为 Jill 对 UFO 战斗编排时间码,但我们也可以用视频做同样的事情。
例如,我使用参考视频作为纹理源,并在视频时间线中使用音频,关键帧制作了开场动画。每个屏幕都正确进行了 UV 展开,以便像在世界中一样从传入的视频广播中采样,因此我只需创建一个新材质,将开场视频(由 nullreff 制作)作为纹理输入拖入该材质,设置节点,并将该材质分配给屏幕对象。音频则是单独引入的:将视频拖入视频编辑标签,移除视频片段但保留音频。
取消静音以听到音频。
结果就是我们有了音频和视频可以设置关键帧!
### 限制 (https://value.gay/blog/furality-ultra-av/#limitations)
在录制俱乐部开场的 DMX 期间,我注意到有些帧被丢弃,捕获的 DMX 偶尔出现卡顿。Nullreff 建议我们以 0.5 倍速录制,然后在 Davinci 中加速 2 倍。最终解决了问题,但我认为这对未来不适用。
卡顿的确切原因未知,但我注意到场景越复杂,卡顿的可能性越大。开场包含大量物体和物体过渡,Blender 及其 Python 接口可能无法跟上。未来,我认为为 DMX 数据设置一个“离线”渲染流程有助于避免这个问题。
### 一些思考 (https://value.gay/blog/furality-ultra-av/#some-thoughts)
我认为我们对 Blender 如何在 VR 音视频场景中提供帮助还只是触及皮毛。我一直在思考 VR 表演的优势所在,并且非常幸运能与 Furality 和 Stage Flight 的优秀人才合作探索这一点。这种 6 DoF 加 Blender 的组合感觉就像 VR 表演的独门秘技。其他任何方式都无法企及看到 MeowMix 或 Daxan 表演时的壮观场面,这些表演中的舞台运动只有借助 Blender 的工具才能实现。
VRSL 的灰度 16x16 方块受到视频编码器执行的视觉心理调优的影响,而 MDMX 则是在这种模拟媒介上解决数据丢失的方案。二进制网格节点是能够正确传输我们在 Blender 中编程内容的技术基石之一,没有它就不可能实现。我不是 MDMX 的开发人员,所有功劳都应归于 Micca 和 Torvid(可能还有其他人,抱歉我忘了!)。
尽管这些 Blender 工具现已可供大家尝试,但我真心希望我们能发布 MDMX,让所有人受益!
在 Somna 和 Stage Flight 期间,大量时间花费在 Davinci 中进行合成或内容编程。因此,投入时间为我们自己打造更好的工具是明智之举。
### MDMX 灯具 (https://value.gay/blog/furality-ultra-av/#mdmx-fixture)
我一直在考虑为自己编写一个 DMX 控制软件,但我很懒,想尽可能少干活。于是最终写了一个 Davinci Resolve 插件,可以加载灯具并在 Davinci 时间线中创建可关键帧的参数,供我编程。
虽然我们可以在 Blender、QLC、grandMA3 等程序中控制 DMX,但无法直接在 Davinci Resolve 中编程 DMX,而这个插件让我们能够做到。插件以 JSON 格式加载灯具,暴露参数供你控制,然后将这些参数的值直接写入视频,作为 MDMX 二进制网格节点。
MDMX 灯具是开源的,可在此处找到 (https://github.com/valuef/mdmx-davinci)
例如,这是我用于屏幕的屏幕灯具定义:
F9 Screen V2.json
```json
{
"id" : "F9 Screen v2",
"default_dmx_universe": 7,
"default_dmx_channel": 283,
"num_fixtures_in_sequence": 8,
"controls": [
{
"name": "Position",
"type": "pos_xyz_16",
"x_channel": 1,
"x_fine_channel": 2,
"y_channel": 3,
"y_fine_channel": 4,
"z_channel": 5,
"z_fine_channel": 6,
"display_min": -50,
"display_max": 50
},
{
"name": "Rotation",
"type": "euler_xyz_16",
"display_min": -270,
"display_max": 270,
"x_channel": 7,
"x_fine_channel": 8,
"y_channel": 9,
"y_fine_channel": 10,
"z_channel": 11,
"z_fine_channel": 12
},
{
"name": "Size X",
"type": "float_16",
"channel": 13,
"channel_fine": 14,
"default_value": 0.7,
"display_min": 0,
"display_max": 5.6
},
{
"name": "Size Y",
"type": "float_16",
"channel": 15,
"channel_fine": 16,
"default_value": 0.7,
"display_min": 0,
"display_max": 5.6
},
{
"name": "Dimmer",
"type": "float",
"channel": 17,
"default_value": 1
},
{ "name": "Black as Alpha", "type": "float", "channel": 18 },
{ "name": "Bloom", "type": "float", "channel": 19 },
{
"name": "Alpha Mask",
"type": "integer",
"channel": 20,
"display_min": 0,
"display_max": 8
},
{ "name": "Hide Robot", "type": "toggle", "channel": 21 },
{ "name": "Motion Speed", "type": "float", "channel": 22 },
{ "name": "Rotation Speed", "type": "float", "channel": 23 },
{ "name": "Force Snap", "type": "toggle", "channel": 24 }
]
}
```
一旦我们在插件中加载该文件,就可以访问这些参数:
Fixture
每个灯具参数都可在 Davinci 时间线编辑器中设置关键帧。
“写入掩码”让我可以选择哪些参数被生成。如果某个参数的写入掩码未选中,与之相关的 MDMX 像素将不会发射,也不会覆盖之前的内容。因此,这还允许我们将值插入到先前已编程的灯具中间。
一个注意事项是,MDMX 灯具插件不计算其输出的 MDMX 列的 CRC。这是下一步。
### MDMX CRC (https://value.gay/blog/furality-ultra-av/#mdmx-crc)
MDMX 网格节点被分解为独立的列,每列 6 字节。每列末尾有 4 位,包含这 6 字节的 CRC。这 4 位用于少量错误检查,考虑到我们通过实际上是一种模拟媒介传输这些二进制数据,这非常有用。如果检测到错误,我们可以使用上一次正确的值。
但这种 CRC 的存在带来一个问题:我们不容易将值插入到 MDMX 列的中间。如果更改了列中的任何字节,就需要重新计算 CRC。
此外,用于 Davinci 的 MDMX 灯具插件本身并不计算 CRC。因此,为了能够插入值并使用 MDMX 灯具插件,我们需要一种在视频编辑器中重新计算 CRC 的方法。
我最终编写了 MDMX CRC 重算 Davinci 插件来支持这一工作流。你可以将其放在调整剪辑上,设置二进制网格节点的分辨率,它会获取调整剪辑下方的所有 MDMX 网格节点并重新计算其 CRC。
MDMX CRC 重算是开源的,可在此处找到 (https://github.com/valuef/mdmx-davinci)
它非常有用!事实上,在烟花表演的最终合成中,我们用它来关闭一些烟花发射器,因为它们导致视频声音崩溃。MDMX CRC 重算让我们能够将 0 插入烟花发射通道,而不会破坏 CRC。
### VideoRemap (https://value.gay/blog/furality-ultra-av/#videoremap)
我们通常使用 Resolume Arena 来将视频切割成视频映射。然而,Resolume Arena 针对实时工作流设计,没有时间线或工具帮助我们精确切换映射并尽可能快地录制重映射内容。
在 Somna 期间这非常烦人,所以我在 Somna 和 Ultra 之间制作了 VideoRemap (https://videoremap.com/)。这是一个 Davinci Resolve 插件。
VideoRemap 允许我们定义如何将输入视频切割成不同部分。我们可以在 Resolume 中定义这个映射。
相似文章
yuxinlu1/gemma-4-12B-coder-fable5-composer2.5-v1-GGUF
针对代码任务的 Gemma 4 12B 专注微调版本,从思维链数据(Composer 2.5 和 Fable 5)中蒸馏而来,并量化为 GGUF 格式,以在本地离线使用,仅需极低 VRAM 要求
@omarsar0: 天哪!Fugu Ultra 在这些3D渲染中表现得极其出色。
Sakana AI 发布了 Fugu Ultra,这是一种多智能体编排模型,在避免出口管制的同时,其性能媲美 Fable 和 Mythos 的前沿水平。
@Modular:AI工程师世界博览会第二天@aiDotEngineer!在U-G28展位与团队会面,讨论Mojo、MAX和Modu……
Modular正在AI工程师世界博览会上演示Mojo、MAX和Modular Cloud,使用FLUX.2在DGX Spark上进行快速图像生成,以及实时视频生成。
@richardzphotoz: a16z 新媒体团队制作了这段视频。以下是幕后解析:视觉效果经过精心构建、渲染和处理,
a16z 新媒体团队制作视频的幕后解析,包括精心制作的 3D 视觉效果、定制配乐,以及一个用于筛选数千条存档素材的工具。
@trq212: 很多人问我如何用Fable编辑自己的发布视频,所以我做了一个视频来说明!简而言之,它写了大量…
用户解释了他们如何使用Fable(一款AI工具)通过代码和工具调用来编辑自己的发布视频,包括转录、ffmpeg、色彩校正、Figma MCP和Remotion UI,全程无需触碰视频编辑器。