解码 Vision Pro 空间视频格式 MV-HEVC

236 阅读5分钟

iOS 17.2 拍摄 Apple Vision Pro 空间视频

iOS 17.2 Beta 版本的更新让我们能够通过手机(iPhone 15 Pro 系列)拍摄 Apple Vision Pro 空间视频,在 6 月份 WWDC 2023 开发者大会上, 同时公布了对空间视频格式的编解码SDK 支持。本文主要用官方 SDK(Video Toolbox) 对手机拍摄的空间视频进行编解码分析。

关于 MV-HEVC

Apple Vision Pro 的空间视频采用 MV-HEVC (即多视图-高效视频编码)标准进行编码,所谓的多视图是指在同一帧保存多个画面信息,例如空间视频的每一帧都保存左、右双眼的画面信息, 只是有别于当前以双目画面并排显示(Side by Side,SBS)的方式,MV-HEVC 通过主视图(Hero Eye)和辅助视图差别信息的方式存储,这样既可以更好地提升存储效率。

WWDC23 关于 3D 视频的介绍

WWDC23 关于 3D 视频的介绍

MV-HEVC 编码

MV-HEVC 编码

关于 MV-HEVC 标准的技术细节,可以参考腾讯云音视频V265编码器的详细说明:

助力Vision Pro等3D应用,腾讯V265新增对MV-HEVC标准的编码支持

Video Toolbox 对 MV-HEVC 的支持

基于硬件加速视频编解码SDK

基于硬件加速视频编解码SDK

苹果官方的 Video Toolbox SDK 已经提供了对 MV-HEVC 编码的支持,可以通过以下方法检查当前平台是否支持空间视频编/解码功能:

func VTIsStereoMVHEVCEncodeSupported() -> Bool

func VTIsStereoMVHEVCDecodeSupported() -> Bool

解码(Decompression)

读取手机拍摄的空间视频后,可以先查看一下视频的格式描述(formatDescriptions),其中包括以下和空间视频及其拍摄设备相关的重要信息:

let h265url = URL(fileURLWithPath: "IMG_0757.MOV")
let asset = AVAsset(url: h265url)

// 获取视频轨道对象
let videoTrack = try await asset.loadTracks(withMediaType: .video).first!
print("Video Format Desc:")
print(try await videoTrack.load(.formatDescriptions).first!)
  • 编码类型为 hvc1,是苹果采用的 HEVC/H.265 标准的编解码实现;
  • 视频分辨率为:1920 x 1080,是当前 iPhone 15 所能拍摄的 1080P 30FPS 分辨率;
  • HasLeftStereoEyeViewHasRightStereoEyeView 标记了当前视频文件是否保存左右眼视图信息;
  • DisparityAdjustment:表示左右图像相对移动的值,该值是一个 32 位整数,测量范围为 -10000 到 10000,映射到 -1.0 到 1.0 的统一范围,它会改变零视差平面;
  • StereoCameraBaseline :代表摄影系统镜头中心间距的数值,单位为微米,iPhone 15 Pro 超广角(14mm)主摄镜头(35mm) 的中心间距约为 19mm,即下图中的 19240 微米。

视频格式描述信息

视频格式描述信息

通过 Video Toolbox 对 MV-HEVC 视频进行解码需要以下几个步骤:

  1. 创建 VTDecompressionSession
func VTDecompressionSessionCreate(
    allocatorCFAllocator?,
    formatDescription videoFormatDescriptionCMVideoFormatDescription,
    decoderSpecification videoDecoderSpecificationCFDictionary?,
    imageBufferAttributes destinationImageBufferAttributesCFDictionary?,
    decompressionSessionOutUnsafeMutablePointer<VTDecompressionSession?>
) -> OSStatus
  1. 设置解码器属性:VTSessionSetProperty ,这里需要设置 kVTDecompressionPropertyKey_RequestedMVHEVCVideoLayerIDs 来告诉解码器需要解码的视图图层:
func VTSessionSetProperty(
    _ sessionVTSession,
    key propertyKeyCFString,
    value propertyValueCFTypeRef?
) -> OSStatus
  1. 设置多视图解码回调函数,该回调函数用于处理每一帧解码获得的图像信息,要注意的是目前这一函数 仅支持 Objective-C 且强制限定 Swift 不可用:
OSStatus VTDecompressionSessionSetMultiImageCallback(
 VTDecompressionSessionRef decompressionSession, 
 VTDecompressionOutputMultiImageCallback outputMultiImageCallback, 
 void *outputMultiImageRefcon);
  1. 在回调函数中处理每一帧的图像信息,如果解压缩成功,则 taggedBufferGroup 包含解压缩帧的多个图像;否则为 NULL:
typealias VTDecompressionOutputMultiImageCallback = (
 UnsafeMutableRawPointer?, 
 UnsafeMutableRawPointer?, 
 OSStatus, 
 VTDecodeInfoFlags, 
 __CMTaggedBufferGroup?, 
 CMTimeCMTime) -> Void
  1. 调用 VTDecompressionSessionDecodeFrame 开始解压每一帧;
  2. 调用 VTDecompressionSessionInvalidate 销毁 DecompressionSession。

通过以上方法,我们就可以将 iPhone 或 Vision Pro 拍摄的空间视频进行解码,以获得完整的左、右视图信息,或者转换成传统的 SBS 格式。

编码(Compression)

Video Toolbox 进行 MV-HEVC 编码的流程与解码过程类似:

  1. 通过 VTCompressionSessionCreate 函数创建 CompressionSession;
  2. 设置左右视图对应的图层 ID:

  1. 设置上文所展示的视频格式描述信息:

  1. 调用多视图帧编码方法 VTCompressionSessionEncodeMultiImageFrame
func VTCompressionSessionEncodeMultiImageFrame(
    _ session: VTCompressionSession,
    taggedBuffers: [CMTaggedBuffer],
    presentationTimeStamp: CMTime,
    duration: CMTime,
    frameProperties: CFDictionary?,
    infoFlagsOut: UnsafeMutablePointer<VTEncodeInfoFlags>?,
    outputHandler@escaping (OSStatus, VTEncodeInfoFlags, CMSampleBuffer?) -> Void
) -OSStatus
  1. 在回调函数中处理编码完成得到的 sampleBuffer:
typealias VTCompressionOutputCallback = (
 UnsafeMutableRawPointer?, 
 UnsafeMutableRawPointer?, 
 OSStatus, 
 VTEncodeInfoFlags, 
 CMSampleBuffer?) -> Void

通过以上方法,我们可以将其他设备所拍摄的 SBS 立体视频文件编码为 Vision Pro 支持的 MV-HEVC 空间视频格式。

总结

本文主要总结记录了使用苹果官方 SDK (Video Toolbox)对 iPhone 和 Vision Pro 支持的空间视频格式进行编解码操作的方法。在这一标准和开发工具的支持下,打通了不同设备之间进行 3D 视频创作、分享的障碍,这将让 iPhone 成为目前市场份额最大、使用门槛最低的 3D 视频创作工具。

下面的视频展示了使用 iPhone 15 Pro 和 Quest 3 进行 3D 视频拍摄的效果对比,iPhone 拍摄的空间视频可以在 Quest 视频浏览器中查看,Quest 所拍摄的第一视角立体视频也将能够直接分享给未来的 Apple Vision Pro 用户!

www.bilibili.com/video/BV1pb…

👉 原文链接 🔗

微信公众号:V2XR

参考

  1. 腾讯V265新增对MV-HEVC标准的编码支持 | mp.weixin.qq.com/s/RZUNiQv76…
  2. Video Toolbox | developer.apple.com/documentati…
  3. WWDC23 | Deliver video content for spatial experiences

本文使用 markdown.com.cn 排版