Build live production tools for Apple Immersive Video
visionOS & Spatial Computing 高级 16m

为 Apple 沉浸视频构建实时制作工具

Build live production tools for Apple Immersive Video

2026年6月10日

在 Apple 官方观看视频

一句话判断

Apple 终于把 Vision Pro 的“看片”体验推向了广电级直播工业标准,SMPTE 2110 和流式 ProRes 的直接打通,意味着第三方导播台和即时回放系统可以无缝接入 Apple Immersive Video (AIV) 生态了。

这场 Session 讲了什么

之前 AIV 主要是录播内容,现在 Apple 要把 NBA 场边视角这种高动态场景做成直播。但 8K+ 3D 视频加上 64 声道空间音频,数据量是传统 2D 广播的 32 倍,老一套的 SDI 线缆和广播设备根本扛不住。

Apple 给出的解法是全面拥抱 IP 网络。他们定义了基于 SMPTE 2110 标准的实时传输协议:视频用流式 ProRes,音频用 uncompressed PCM (非压缩脉冲编码调制),元数据用 per-frame JSON (逐帧 JSON)。录制和回放时,利用 AVAssetWriter 和 Immersive Media Support 框架,直接把 ProRes 帧零损耗写入 MOV 文件。

这对做广电级软硬件、导播系统、即时回放(Instant Replay)工具的开发者是巨大利好。你不需要再自己造轮子去处理 3D 视频流的网络分发和画质损耗问题,Apple 已经把底层管道铺好了。

值得深挖的点

SMPTE 2110-22 与“单流双眼”的巧妙设计

在 3D 视频传输中,最头疼的就是左右眼画面的同步和路由。传统做法要么是把左右眼拼成一张图(Side-by-Side),要么是搞两个独立的 IP 流。前者浪费了带宽和分辨率,后者让导播台(Video Switcher)的切像逻辑极其痛苦,必须时刻保证两个流的帧同步。

Apple 选择了 SMPTE 2110-22 标准,这是一个专门针对 IP 压缩媒体传输的协议。它的巧妙之处在于,允许在单个 RTP (实时传输协议) 流中封装左右眼两个独立的 data essence (数据本质)。这意味着在网络层,它只是一个流,路由和同步极其简单;但在解码层,左右眼数据是物理隔离的。这种设计极大降低了制作架构的复杂度,第三方导播软件在切换机位时,只需要处理一个 2110-22 流,而不用去写复杂的双眼帧对齐算法。

ProRes 贯穿全链路消灭“世代损失”

做体育直播,即时回放(Instant Replay)是刚需。传统 2D 直播中,录像机把 H.264/HEVC 流解码,再重新编码写入磁盘,回放时又得解码推流,这种“世代损失”(Generation Loss)在 1080p 下勉强能看。但在 AIV 这种 32 倍像素量的场景下,几次重编码后画面就会糊成一团,直接打破沉浸感。

Apple 的解法非常暴力且优雅:全链路使用流式 ProRes。摄像机直接输出 ProRes,导播台切像时处理 ProRes,录像机(EVS)写入磁盘时,因为已经是 ProRes payload (有效载荷),直接 copy 到 MOV 容器里,完全不需要额外的编解码环节。配合 Apple Silicon 强大的 ProRes 硬件加速引擎,这种“零损耗”的即时回放不仅保住了极致画质,还大幅降低了 CPU/GPU 的实时运算压力。

代码片段

1. 配置 VideoToolbox 沉浸式投影类型

场景:在使用 VideoToolbox 进行硬件编码或配置解码器时,必须显式告诉系统这是一个 Apple 沉浸视频流,以便启用正确的 3D 投影和渲染管线。

import VideoToolbox

// 配置压缩属性,指定投影类型为 Apple 沉浸视频
let compressionProperties: [String: Any] = [
    // 设置投影类型为 AppleImmersiveVideo
    kVTCompressionPropertyKey_ProjectionKind as String: kVTProjectionKind_AppleImmersiveVideo,
    // 其他常规配置如码率、帧率等...
]

坑:如果忘记设置 kVTProjectionKind_AppleImmersiveVideo,系统会把它当成普通的 2D 平面视频处理,导致 Vision Pro 上播放时没有 3D 深度效果。

2. 使用 AVAssetWriter 零损耗录制沉浸视频

场景:在即时回放系统中,将接收到的 SMPTE 2110 流直接写入本地 MOV 文件,不触发二次编码。

import AVFoundation

// 初始化 AVAssetWriter,输出格式为 QuickTime Movie
let writer = try AVAssetWriter(outputURL: outputURL, fileType: .mov)

// 配置视频输出设置,关键点在于 passthrough (直通) 模式
let videoInput = AVAssetWriterInput(mediaType: .video, outputSettings: nil)
// outputSettings 传 nil,避免重新编码 ProRes
videoInput.expectsMediaDataInRealTime = true

if writer.canAdd(videoInput) {
    writer.add(videoInput)
}

// 开始写入并追加 CMSampleBuffer (包含原始 ProRes 数据)
writer.startWriting()

坑:outputSettings 绝对不能传具体的压缩字典(如 H.264 配置),必须传 nil 明确指定 passthrough,否则 AVAssetWriter 会强制把 ProRes 解码后再重新编码,导致严重的世代损失和性能暴跌。

最佳实践

  • 网络基建升级:SMPTE 2110 跑的是未压缩或轻度压缩的巨型数据流(尤其是 64 通道的 PCM 音频和 8K ProRes)。别指望普通的千兆交换机,直接上万兆(10GbE)甚至 25G/100G 网络,并且必须开启 IGMP Snooping 来优化多播(Multicast)流量。
  • 全面拥抱 Apple Silicon:这套工作流高度依赖 M 系列芯片(尤其是 Ultra 级别)内部的 Media Engine (媒体引擎) 来处理 ProRes 的硬解和硬编。如果你的制作工具还要兼容老旧的 Intel Mac,趁早放弃,性能根本撑不住实时 3D 8K 流。
  • 元数据与音视频强绑定:2110-41 传输的逐帧 JSON 包含了镜头校正和空间音频动态数据。在开发回放工具时,必须确保 JSON 元数据与 ProRes 视频帧的 PTS (显示时间戳) 严格对齐,否则画面边缘的畸变校正和声音的空间定位会出现明显的撕裂感。

还有什么值得关注

  • ASAF (Apple Spatial Audio Format) 的 64 通道 PCM 传输:空间音频不再是后期混音的专利,直播中直接通过 2110-30 传输 64+ 通道的高阶环境声和对象音频,现场感拉满。
  • 逐帧 JSON 元数据 (2110-41):除了常规的镜头数据,它还能携带“创意事件”(比如进球瞬间的特效触发标记),让前端播放器能实时响应赛场高潮。
  • 前置知识要求:Apple 强烈建议先看 WWDC25 的“了解 Apple 沉浸视频技术”,这次的 Session 默认你已经懂了 AIV 的基础容器结构。
SMPTE 2110 ProRes AVAssetWriter VideoToolbox Spatial Audio