打造出色的空间视频播放体验
Create a great spatial playback experience
2023年6月5日
一句话判断
如果你要在 visionOS 上做视频播放,用 AVPlayerViewController 就够了——它已经为你处理了 3D 视频、空间音频和 RealityKit 渲染的集成,你只需要确保用 visionOS SDK 编译并把播放器全屏展示。
这场 Session 讲了什么
Session 介绍了 visionOS 上视频播放的最佳实践,核心信息是:尽量复用你现有的 AVFoundation + AVKit 代码。
开箱即用的体验。AVFoundation 负责流媒体、解析、解码和同步。AVKit 的 AVPlayerViewController 在 visionOS 上被增强为使用 RealityKit 渲染——视频可以无缝融入用户周围的空间环境中,音频也会响应环境(空间音频)。播放控件包括标准的播放/暂停/快进等,还有平台特有的能力。
最低要求:Xcode 项目必须使用 visionOS SDK 编译。用 iOS SDK 编译的兼容 App 会获得 iOS 兼容的播放体验(不会自动获得空间增强)。使用方式与 iOS/tvOS 完全相同——创建 AVPlayerViewController,设置 player 属性,然后全屏展示。
新的媒体格式。AVFoundation 增强了对新媒体格式的支持,包括 3D 视频,以利用 visionOS 的独特能力。
展示方式的选择。标准的窗口展示、全屏沉浸式展示、以及通过 RealityKit 自定义渲染管线展示。Session 对比了不同方式的适用场景。
值得深挖的点
iOS SDK vs visionOS SDK 编译的差异:这是一个容易忽略的细节。如果你的 App 使用了 iOS 的兼容模式运行,视频播放器会获得基本的播放功能,但不会自动获得空间渲染增强。要获得完整体验,必须用 visionOS SDK 原生编译。
RealityKit 的渲染增强:视频通过 RealityKit 渲染意味着它可以与环境中的 3D 物体进行正确的遮挡和光照交互。这不是简单的”在一个窗口里放视频”——视频内容与空间环境是融合的。
空间音频的自动处理:当视频通过 AVPlayerViewController 播放时,音频自动获得空间化处理。如果你的 App 已经使用了 AVFoundation 的音频管线,不需要额外配置。
代码片段
在 visionOS 上展示视频播放(与 iOS 代码几乎相同):
import AVKit
import SwiftUI
struct VideoPlayerView: View {
let videoURL: URL
var body: some View {
// 使用 AVPlayerViewController —— 与 iOS 代码一致
VideoPlayer(player: AVPlayer(url: videoURL))
}
}
// 更灵活的方式:直接使用 AVPlayerViewController
struct CustomPlayerView: UIViewControllerRepresentable {
let player: AVPlayer
func makeUIViewController(context: Context) -> AVPlayerViewController {
let controller = AVPlayerViewController()
controller.player = player
return controller
}
func updateUIViewController(_ uiViewController: AVPlayerViewController,
context: Context) {}
}
最佳实践
- 使用 visionOS SDK 编译项目以获得完整的空间播放体验
- 复用现有的 AVFoundation/AVKit 代码,无需学习新的 API
- 让 AVPlayerViewController 填满窗口以获得最佳沉浸感
- 不要自己实现播放控件——系统的控件已经针对 visionOS 优化
- 3D 视频内容需要对应的媒体格式支持,参考相关 Session
还有什么值得关注
- 3D 视频的具体编码格式和制作工作流
- 自定义 RealityKit 渲染管线的视频展示方式
- 空间音频在不同播放场景下的表现
- 视频播放的性能优化和电池使用