一文看完 WWDC 2022 音视频相关的更新要点丨音视频工程示例
共 18489字,需浏览 37分钟
·
2022-07-24 19:02
关键帧Keyframe 这个公众号会路线图式的遍历分享音视频技术:音视频基础(完成) → 音视频工具(完成) → 音视频工程示例(进行中) → 音视频工业实战(准备)。关注一下成本不高,错过干货损失不小 ↓↓↓
WWDC 2022 一共发布了 170 多个 Session,其中与音视频相关的 Session 也有不少,在这里根据内容相关性分类整理了其中的要点,包括如下这些:
1、HLS 相关 HLS 插片广告(HLS Interstitials) HLS 内容转向(HLS Content Steering) 2、EDR 相关 在 iOS 上探索 EDR 基于 CoreImage、Metal、SwiftUI 展示 EDR 内容 基于 AVFoundation、Metal 展示 HDR 视频 3、媒体播放相关 打造强大的视频播放体验 NowPlaying 相关的信息展示和播放交互 4、相机相关 探索 iOS 相机的高级功能 使用 Core Media IO 创建 macOS 相机扩展 5、录屏相关 ScreenCaptureKit 初体验 探索 ScreenCaptureKit 的高级能力 6、Metal 相关 探索 Metal 3 快速资源加载 Shader 离线编译 MetalFX Upscaling Mesh Shaders 光线追踪优化 机器学习硬件加速 7、AR 相关 使用 RoomPlan 扫描房间 探索 ARKit 6 AR 体验设计建议 将你的世界带入 AR 8、视频质量相关 AVQT 的新功能
整理不易,如果对你有帮助,请帮忙关注、转发、点赞一下。
1、HLS 相关
1.1、HLS 插片广告(HLS Interstitials)
参见:What’s new in HLS Interstitials[1]
HLS interstitials 是苹果在 2021 年提出的插片广告技术方案,它属于 HLS 技术规范,目标是为了更方便的在直播、点播场景中支持广告内容的部署。在此规范下,无论是在服务器端还是客户端,它不再需要依赖 SSAI 中的特殊标签。服务器可以插入 EXT-X-DATERANGE
标签来告诉客户端安排插片式播放,如下图所示:
本期 HLS Interstitials 增加了新的特性支持,包括:
1)支持 CUE 属性配置。
通过该属性来支持前插广告(PRE)、后插广告(POST);也可以指定是否一次性广告(ONCE)。
2)支持 X-SNAP 属性。
通过该属性来对齐直播场景中广告插片的时间偏移。
3)新增 HLS_start_offset 和 HLS_primary_id 请求参数。
HLS_start_offset 用于获取广告已播时长;HLS_primary_id 用于标识播放片段和广告以避免重复播放相同广告。
4)AVFoundation 提供 AVPlayerInterstitialController 和 AVPlayerInterstitialEvent 等 API,用来支持客户端中插广告播放。
1.2、HLS 内容转向(HLS Content Steering)
参见:Deliver reliable streams with HLS Content Steering[2]
HLS Content Steering 是苹果公司为了提高全球性流媒体服务的可用性而提出的技术方案,它可以根据服务端负载和冗余情况来动态地将客户端引导到不同的服务器。
本期 HLS Content Steering 增加了新的特性:
1)HLS Content Steering 支持路径克隆功能。
该功能兼容 Content Stering 1.2。通过该功能可以向已有的 CDN 列表中添加新的 CDN 路径。配置文件中添加新的 CDN 路径时无需填写完整 URI,只需填写服务器和参数字段支持灵活的 URI 替换规则。
2、EDR 相关
EDR(Extended Dynamic Range)是苹果推出的一套渲染管线技术,以支持在不同的屏幕上同时正确显示 SDR 和 HDR 内容。当显示 HDR 的内容时,EDR 并不会直接将 HDR 区域变得更亮,而是识别到 HDR 内容后提高整体屏幕亮度的同时,降低非 HDR 区域的白点值,使得其看起来没有那么亮。
2.1、在 iOS 上探索 EDR
参见:Explore EDR on iOS[3]
这个 Session 的内容包含了下面几点:
1)介绍了 EDR API 的新增特性
EDR API 开始支持 iOS 和 iPadOS。 12.9 英寸 iPad Pro 新增两个新特性:Reference 模式支持 EDR 渲染;Sidecar 支持 EDR 渲染(Sidecar 是苹果的一项技术,支持将 iPad 作为 Mac 的扩展屏)。
其中,Reference 模式对 EDR 的支持如下:
修正 SDR 峰值亮度为 100 nits; 修正 HDR 峰值亮度为 1000 nits(这样就留出了 10 倍(1000 nits / 100 nits)的 EDR headroom); 支持关闭 HDR Tone Mapping; 支持关闭环境光自适应(比如,iPhone 的 True Tone、Auto Brightness、Night Shift 等功能); 支持白点和亮度的手动校准。
2)回顾了 EDR 的技术方案
当渲染时,像素浮点值范围为 [0.0, 1.0]
的 SDR 内容是始终会正常渲染的。(1.0, EDR headroom]
范围的 HDR 内容也是可以渲染的。但是,超过了 EDR headroom 的部分就会被丢掉。
EDR headroom 是动态的,它的值受到多种因素的影响,比如:设备的显示技术、当前的显示亮度等等。
我们通常可以使用下面这个公式粗略估计 EDR headroom:
Headroom ≈ Display Peak / SDR
3)EDR 内容的读取
流程如下:
4)使用 EDR
要使用 EDR 有下面几个注意点:
要使用 CAMetalLayer
;设置 wantsExtendedDynamicRangeContent
为 YES;内容支持 EDR: 支持像素缓冲区格式; 支持转换函数; 使用扩展的颜色空间。
5)查询 EDR headroom
EDR headroom 的信息可以通过 NSScreen(macOS)或 UIScreen(iOS)来获取。通过查询 EDR headroom 的信息,可以用来做自定义的 Tone Mapping 算法。
6)色调映射(Tone Mapping)
如果你不想去做自己的 Tone Mapping 算法,而是想用 Apple 内置的算法,需要用到这些能力:
CoreAnimation 库提供了跟 EDR metadata 相关的接口; 支持多种 metadata 参数设置,包括 HDR10 和 HLG 格式; 注意,内置的 Tone Mapping 算法不是全局支持的,使用之前要检查一下。
在使用之前要检查当前设备是否可以支持 EDR metadata,然后去初始化对应格式的 EDR metadata,最后将其应用到 CAMetalLayer 来渲染时,就使用系统自带的 Tone Mapping 算法了。
2.2、基于 CoreImage、Metal、SwiftUI 展示 EDR 内容
参见:Display EDR content with Core Image, Metal, and SwiftUI[4]
在这个 Session 中,回顾了一下 EDR 相关的概念和术语,然后展示了一个基于 Core Image 来添加 EDR 支持的 Demo,最后提到了如何用 CIFilter 来创建支持 EDR 的图像去服务于相关内容的生产。
1)EDR 相关的概念和术语
EDR 相关的概念和术语,在前面的内容已经介绍过了,这里就不再赘述了。
2)在 SwiftUI 应用中使用 CoreImage 和 Metal 并为其添加 EDR 支持
相关源码见:Generating an Animation with a Core Image Render Destination[5]
大致流程如下图所示,即 MetalView 调用其 delegate
来绘制,作为代理的 Renderer 在 draw()
方法中调用 ContentView 来提供图像去绘制:
接下来,则是在这个流程中添加 EDR 支持,包括 3 个步骤:
1、初始化 MetalView 时,为其添加 EDR 配置; 2、每次渲染动作前,计算 EDR headroom; 3、基于 EDR headroom 构造 CIImage。
3)使用内置的 CIFilter 来支持 EDR
CoreImage 中有超过 150 款内置的 CIFilter 支持 EDR。在使用一款 CIFilter 时,要想知道它是否支持 EDR,要做一下检查。
4)基于 CIColorCube filters 编写自定义的 CIFilter 来支持 EDR
其中 CIColorCubeWithColorSpace 是一个比较受欢迎的用于 SDR 图片的滤镜。以前,在使用它时有一个严格的限制:输入和输出的 RGB 颜色值都在 0-1 的范围内。当我们要支持 EDR 时,可以配置 CIColorCubeWithColorSpace 滤镜的颜色空间为 EDR 格式的颜色空间,比如:HLG 或 PQ,这时候就可以突破 RGB 颜色值只在 0-1 范围的限制了,从而生产出最佳效果的 EDR 的内容。但是,需要注意,对应的 cube data 需要在对应颜色空间的有效范围内。同时,还可能需要增加 cube data 的维度。
有时候,你可能想要使用 SDR cube data 用于 EDR 图像,在最新的 API 中,可以设置 extrapolate
属性为 true
来告诉 filter 来对 SDR cube data 进行推断,这时候你就可以给一个 filter 输入一个 EDR 图像,并从输出获得 EDR 图像。
5)编写自定义 CIKernel 的最佳实践
以往对于 RGB 的值必须保持在 0-1 范围内的限制可以去掉了,超过这个范围,CIKernel 也可以正常工作。但是,alpha 值仍然需要保持在 0-1 的范围内。
2.3、基于 AVFoundation、Metal 展示 HDR 视频
参见:Display HDR video in EDR with AVFoundation and Metal[6]
这个 Session 中介绍了如何基于 AVFoundation 和 Metal 来构建高效的 EDR 渲染管线。其中,包括:
介绍如何支持 EDR 视频的播放。不仅是简单的基于黑盒的 AVPlayer 来实现,会深入的介绍如何基于 AVFoundation 来解码 HDR 视频,并在自定义的 EDR layer/view 上渲染。 介绍如何支持 EDR 视频的后处理。基于 CoreVideo Display Link 实时访问解码后的的视频帧并送给 CoreImage filter 或 Metal shader 来进行图像或特效处理,最后将处理后的视频帧交给 Metal 来渲染。
整个 Session 的内容从下面几个方面展开:
1)Apple EDR 视频框架
Apple EDR 视频框架如下图所示:
对于不同的应用场景,我们可以选择不同的框架来实现:
简单的播放 HDR 视频,可以使用 AVKit 和 AVFoundation; 在指定的 layer 上播放 HDR 视频,可以使用 AVPlayerLayer; 对 HDR 视频帧做后处理,可以使用 AVPlayer、CADisplayLink 将 CVPixelBuffer 发送给 CoreImage 进行图像处理; 对 HDR 视频帧做后处理和渲染,可以使用 AVPlayer、CVMetalTextureCache 将 MetalTexture 发送给 Metal 进行图像处理和渲染。
2)使用 AVKit 和 AVFoundation
如果需要简单的播放 HDR 视频媒体渲染到 EDR,可以使用 AVPlayerViewController 渲染 AVPlayer,也可以使用 AVPlayer 和 AVPlayerLayer 在 iOS 或 macOS 上播放自己的视图。
如果需要实现实时视频效果,大致流程如下:
最终渲染一般都使用 CAMetalLayer,要支持正确的渲染 HDR 视频,还需要为 CAMetalLayer 设置一些属性:wantsExtendedDynamicRangeContent、pixelFormat、colorspace。
3)使用 CoreVideo 和 Metal
CVMetalTextureCache 是一种将 CVPixelBuffer 与 Metal 结合使用的简单有效的方法。CVMetalTextureCache 很方便,可以直接从缓存中获取 Metal 纹理,无需进一步转换。CVMetalTextureCache 自动桥接 CVPixelBuffer 和 MetalTexture,从而既简化了代码,又保持了高效。通过保持 MTLTexture 到 IOSurface 的映射,CVMetalTextureCache 与 CVPixelBufferPools 配合使用还提供了性能优势。最后,使用 CVMetalTextureCache 消除了手动跟踪 IOSurfaces 的需要。下面的示例将展示如何使用 CVMetalTextureCache 从 Core Video 中直接提取 Metal 纹理,大致流程如下图所示:
3、媒体播放相关
3.1、打造强大的视频播放体验
参见:Create a great video playback experience[7]
这个 Session 介绍了新设计的播放器,并展示了最佳实践来帮助我们构建最佳的媒体播放体验。此外,还探讨了视频对 Live Text 特性的支持,这个特性可以让我们从视频帧中直接识别和复制出文字,此外还介绍了如何在我们的应用中集成插片广告和播放速度控制能力。
1)新播放器界面
新界面如图:
此外,新播放器还支持了更多便捷的手势操作,比如:手指缩放画面来适配屏幕、全屏左右滑动来 seek 和预览等交互。
2)播放及交互体验
新的播放器设计总体上遵循 Intuitive、Integrated、Content forward 三个原则。
在很多细节设计上更符合人们对现实世界的习惯,能被更自然的理解。比如,播放器进入和拖拽退出的动画、拖动进度时的惯性效果等等。
3)视觉智能
新的播放器可以支持像处理其他文本一样获取视频帧中的文字:
4)插片广告
新的 iOS 播放器开始支持插片广告了,其中 HLS 流协议对插片广告的支持在前面 HLS 相关的内容中已经讲过,就不再多说了。对于非 HLS 协议的内容,AVFoundation 则提供了新的 API 来支持产品广告。
5)播放变速
AVPlayerView 和 AVPlayerViewController 开始支持播放速度控制的 menu,并且支持自定义倍速和文案的本地化。
3.2、NowPlaying 相关的信息展示和播放交互
参见:Explore media metadata publishing and playback interactions[8]
这个 Session 主要介绍了如何在每个平台上突出显示应用的 NowPlaying 信息。包括介绍媒体元数据的概述,以及如何在锁定屏幕和控制中心等区域中呈现 NowPlaying 界面,并展示如何编写和发布有效的媒体元数据。此外,还介绍了应用如何响应来自其他设备(比如 HomePod)的命令。
当使用 AVFoundation 进行媒体播放时,发布 NowPlaying 元数据和响应其播放交互的最佳方式是使用 MPNowPlayingSession 类。MPNowPlayingSession 可以用来表示不同的播放会话,并在应用中包含多个播放会话时,提供对 NowPlaying 状态的控制,支持手动发布元数据,并在 iOS 16 后支持自动发布元数据。
这里所讲的自动发布的元数据包括:媒体资源的时长、已播放时长、播放状态、播放进度,以及其他可以添加到 Player Item 的信息(标题、描述、封面等等)。
一旦设置了自动发布元数据(设置 MPNowPlayingSession 的 automaticPublishNowPlayingInfo 属性为 true),MPNowPlayingSession 实例将开始观察播放器的状态变化并更新对应的 UI。
4、相机相关
4.1、探索 iOS 相机的高级功能
参见:Discover advancements in iOS camera capture: Depth, focus, and multitasking[9]
这个 Session 中的内容从下面几个方面展开:
1)激光雷达扫描仪(LiDAR Scanner)
iPhone 12 Pro、iPhone 13 Pro、iPad Pro 等更高性能的设备上已经配置了 LiDAR 扫描仪,它可以在扫描时探测周围物体的远近,从而输出环境的深度信息。激光雷达和其他摄像头配合使用可以在拍摄景深图像和视频、增强现实等场景中实现更强大的功能。
2)面部驱动的自动对焦和自动曝光
自动对焦系统调整镜头以保持主体清晰,自动曝光系统则平衡场景中最亮和最暗的区域以保持主体可见。但是,有时所做的自动调整并不能使拍摄对象的脸部保持对焦,在明亮的背光场景下,拍摄对象的脸部可能很难看清。
如果不开启面部驱动的自动对焦,相机会保持对背景的对焦,而无需重新对焦于面部。启用面部驱动自动对焦后,相机会主动对焦人脸,这样就能使人脸更清晰。当人脸离开画面时,相机会将焦点转移到背景上。
下面是未开启面部驱动的自动对焦和自动曝光和开启后的对照:
3)高级视频采集流
iOS 16 和 iPadOS 16 中的新增功能,应用程序可以同时使用多个 AVCaptureVideoDataOutput。对于每个视频数据输出,可以自定义分辨率、防抖、方向和像素格式。
当我们需要预览采集的视频并进行录制时,我们可以对预览和录制分两路流采用不同的设置。对于预览,分辨率一般不用过高,适配设备的屏幕即可,这样可以处理的更快以实现低延迟预览。在录制时,则可以设置高分辨率捕获并应用质量效果。通过添加第二个 AVCaptureVideoDataOutput 的能力可以扩展内容采集,从而优化视频数据输出:一个输出可以使用较小的缓冲区用于预览,另一个可以使用全尺寸的 4K 缓冲区进行录制。
另外,对预览和录制使用不同的防抖模式也是对它们采用独立的视频数据输出的一个原因。因为防抖会为视频采集带来更大的延迟,在预览情况下是不可取的;而对于录制则可以应用防抖算法来获得更好的内容体验。
除了使用多个视频数据输出之外,从 iOS 16 和 iPadOS 16 开始,应用程序可以在从 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 接收数据的同时使用 AVCaptureMovieFileOutput 进行录制。
4)在多任务场景使用相机
在 iPad 上,用户可以通过多种方式执行多项任务。例如:在分屏浏览或使用幻灯片阅读笔记时录制语音备忘录;在 Safari 上方的浮动窗口中全屏书写笔记;使用画中画在播放视频时添加观看更多 WWDC 视频的提醒。借助 iPadOS 16 新增的 Stage Manager,用户可以在可调整大小的浮动窗口中打开多个应用程序。从 iOS 16 开始,AVCaptureSessions 将能够在多任务处理时使用相机。
但是,在多任务场景使用相机可能带来性能问题,这时候可以考虑降低帧率、使用降低分辨率、使用非 HDR 格式等方式来降低应用程序的资源消耗来提升性能。
4.2、使用 Core Media IO 创建 macOS 相机扩展
参见:Create camera extensions with Core Media IO[10]
这个 Session 主要介绍了如何使用 Core Media IO 来为软件相机、硬件相机以及创意相机创建 macOS 的扩展。这种扩展方式比旧版的 DAL 插件方案更安全、快速,并且可以与任何使用相机输入的应用程序兼容。
下面展示了将 macOS 的扩展用于创意相机场景的示例:扩展程序访问来自多个相机的视频流,将它们合成后再发送到应用程序。
像这样的创意相机可能会需要一个配置程序来控制合成、过滤器的参数。
5、录屏相关
5.1、ScreenCaptureKit 初体验
参见:Meet ScreenCaptureKit[11]
这个 Session 介绍了如何使用 ScreenCaptureKit 为 macOS 上的屏幕共享应用、视频会议应用、游戏流媒体应用等提供高性能的音频和视频的屏幕录制能力。ScreenCaptureKit 支持对录制内容进行实时动态过滤,可以从显示器、应用程序和窗口的任意组合中选择要录屏的内容。ScreenCaptureKit 还支持设置与显示器一致的原始分辨率和帧率,也可以根据流的内容调整相关质量参数,还支持隐藏鼠标光标。
5.2、探索 ScreenCaptureKit 的高级能力
参见:Take ScreenCaptureKit to the next level[12]
这个 Session 更加细致的介绍了如何使用 ScreenCaptureKit 进行复杂的屏幕录制,包括:如何合并各种高级选项,包括微调内容过滤器、帧元数据解释、窗口选择器等;如何配置流以获得最佳性能。
ScreenCaptureKit 提供了丰富的功能,包括高度可定制的内容控制,可以轻松选择要捕获的窗口、应用程序和显示的任意组合;能够捕捉到屏幕内容的原始分辨率和帧率;动态设置流属性,如分辨率、帧速率、像素格式;这些配置可以在不重新创建流的情况下即时修改。此外,ScreenCaptureKit 支持:捕获由 GPU 内存支持的缓冲区以减少内存副本;支持硬件加速的内容捕获、缩放、像素和颜色格式转换,以降低 CPU 使用率来实现高性能捕获;支持视频和音频捕获。
下图展示了 ScreenCaptureKit 的窗口过滤效果:
下图展示了如何设置 ScreenCaptureKit 的纹理缓冲区长度来避免帧延迟和丢帧:
6、Metal 相关
6.1、探索 Metal 3
参见:Discover Metal 3[13]
这个 Session 介绍了升级后的 Metal 3 带来的性能提升和引入的新特性。比如:更快的资源加载、支持 Shader 离线编译(构建时编译而非运行时编译)、上采样渲染高分辨率图像、使用 Mesh Shader 处理复杂的几何图形、光线追踪优化、机器学习硬件加速等等。
下面从这几个方面展开介绍一下:
1)Fast Resource Loading
现在的游戏和应用很多都需要加载资源素材来进行绘制,将众多的小资源从文件中流式的加载传输到 Metal 资源中是实现高质量视觉效果的一种方案,但是传统的存储 API 是为大尺寸的资源请求而设计的。
Metal 3 的 Fast Resource Loading 机制可以支持多个小尺寸资源的请求,通过使用与图形和计算指令模式一样的加载指令来请求小尺寸资源,每个指令都进入指令队列进行异步提交,无需额外步骤即可直接加载资源到 Metal 缓冲区和纹理中,从而节省开发工作量和传输时间。Fast Resource Loading 使用 Metal 同步原语使得 GPU 指令和加载指令可以轻松的协作。
下面展示了 Metal 纹理串流如何从 Fast Resource Loading 中受益:
更多内容可以了解:Load resources faster with Metal 3[14]
2)Offline Shader Compilation
下图展示了 Shader 离线编译降低卡帧:
下图展示了 Shader 离线编译降低加载耗时:
更多内容可以了解:Target and optimize GPU binaries with Metal 3[15]
3)MetalFX Upscaling
MetalFX 是为 Metal 应用程序提供平台优化的图形渲染效果的一个框架,兼顾高性能和高质量。MetalFX Upscaling 机制通过高性能的上采样和抗锯齿能力帮助我们在更短的时间内渲染高质量的图形,并支持选择时间或空间算法的组合来提高性能。
虽然 Retina 分辨率为我们的应用和游戏提供了更清晰的图像,但生成所有这些像素也带来了很大的性能开销。使用 MetalFX Upscaling 则可以生成较低分辨率的图像,然后让框架动态生成高质量、高分辨率图像,这样也能以更低成本获得更高的帧率。
更多内容可以了解:Boost performance with MetalFX Upscaling[16]
4)Mesh Shaders
传统的可编程图形管道可以在着色器中变换顶点,然后将其组装到图元中,以便通过固定功能的硬件进行栅格化。对大部分的应用场景,这套方案已经足够了。但是在有些使用案例中,比如剔除,需要访问整个图元,每个顶点需要独立读取、变换和输出,因此不能在绘制中途增加顶点或图元。
高级的几何图形处理需要更高的灵活性,通常这就意味着要在计算过程中对图形进行预处理,这样需要在设备内存中存储大量的中间几何,很难对内存开销做预估。Metal Mesh Shader 则推出了另一种几何处理管线:用灵活的二阶段模型取代了传统的顶点阶段,支持对几何图形进行分层处理。第一阶段分析整个对象以决定是否在第二阶段扩展、收缩或细化几何。它通过在渲染过程中提供计算能力来实现这一点,而不需要中间设备内存存储。Mesh Shader 非常适合执行 GPU 驱动的剔除、LOD 选择和程序生成几何的应用。
简而言之,即渲染管线中用新的 Object 和 Mesh Shader 取代原先的 Vertex Shader,从而支持更加灵活的遮挡剔除和 LOD 选择。
下面对比了传统的程序生成几何流程和基于 Mesh Shader 的程序生成几何流程的差异:
更多内容可以了解:Transform your geometry with Metal mesh shaders[17]
5)光线追踪优化
Metal 3 为光线追踪管道带来了显着的加速。首先,加速结构的构建时间更短,有更多的 GPU 时间来绘制和追踪光线;其次,由于新增了 Indirect Command Buffer 对光线追踪的支持,诸如剔除之类的 CPU 操作可以转移到 GPU;最后,Metal 3 光线追踪支持直接访问原始数据以精简和优化相交和着色。
更多内容可以了解:Maximize your Metal ray tracing performance[18]
6)机器学习硬件加速
Metal 3 在加速机器学习方面进行了重大改进,额外支持在 Mac 上加速网络训练,并对图形和媒体处理应用程序中的 ML 推理过程进行了重大优化。
TensorFlow 在 Mac Studio/M1 Ultra 上通过 GPU 加速与在 CPU 上的训练相比,在各种网络上达到了高达 16 倍的加速。
PyTorch 在 Mac Studio/M1 Ultra 上通过 GPU 加速与在 CPU 上的训练相比,可以将 BERT 模型的训练速度提高 6.5 倍,将 ResNet50 的训练速度提高 8.5 倍。
更多内容可以了解:Accelerate machine learning with Metal[19]
7)Metal 3 开发工具
Metal 3 不仅仅是功能,它还包括一套全面的高级开发工具。比如:Xcode 14 中的 Metal Dependency Viewer 可以更轻松地可视化整个渲染器或放大单个通道;Xcode 14 中改进的 Acceleration Structure Viewer 可帮助您充分利用 Metal 3 的优化光线追踪,等等。
7、AR 相关
7.1、使用 RoomPlan 扫描房间
参见:Create parametric 3D room scans with RoomPlan[20]
这个 Session 介绍了 RoomPlan 框架,使用它可以在支持 LiDAR 激光雷达的 iPhone/iPad 上扫描您的房间。它会生成房间的参数化 3D 模型及房间定义对象,您可以在应用程序中使用这些模型。
RoomPlan 使用由 ARKit 提供支持的复杂机器学习算法来检测墙壁、窗户、开口、门、壁炉、沙发、桌子和橱柜等房间定义对象。其中 RoomCaptureView API 使用 RealityKit 实时呈现扫描进度,可以轻松地将扫描体验集成到应用程序中。当完成扫描后,RoomCaptureView 会显示最终的后处理结果。
通过 RoomPlan 扫描的数据可以导出为 USD/USDZ 的数据格式,并且可以在 Cinema 4D 中直接打开和编辑。
7.2、探索 ARKit 6
参见:Discover ARKit 6[21]
这个 Session 介绍了 ARKit 新的能力:在 ARKit 中启用 4K 视频模式,支持以目前最高的图像分辨率运行相机;增加了一些额外的相机增强功能,可以更好地控制视频背景;更新了平面锚点的行为,添加了 Motion Capture API;扩充了支持位置锚点的新城市。
1)4K 视频
在为 ARKit 拍摄图像时,使用了图像传感器上一个 3840x2880 像素的区域,在捕获图像后,做了一个 Binning 的过程:对每个 2x2 像素的区域,平均像素值,然后写回单个像素。
这个处理有 2 个的优点:1)图像尺寸减少了 4 倍,缩小到 1920x1440 像素。因此,每一帧消耗的内存和处理能力要少得多,从而允许设备以高达每秒 60 帧的速度运行相机,并释放资源用于渲染。2)此过程在弱光环境中具有优势,其中像素值的平均可降低传感器噪声的影响。
如果使用 RealityKit,则会自动对图像进行进一步处理以用作背景:缩放以匹配 2532 像素的屏幕宽度,并裁剪以匹配显示纵横比。RealityKit 在框架顶部执行渲染和合成虚拟内容的任务,并在屏幕上显示最终结果。在 4K 模式下,支持每秒 60 帧的速度采集视频,RealityKit 会做好缩放、裁剪和渲染。
2)相机增强
新的增强功能包括:高分辨率背景照片 API、启动新的 HDR 模式、在 ARKit 中读取 EXIF 标签(EXIF 标签包含有关白平衡、曝光和其他对后期处理有价值的信息)等等。
3)平面锚点(Plane Anchor)
ARKit 6 中更新了平面锚点的行为,可以清晰地分离平面锚点和底层几何平面。
在 iOS 15 中,运行会话时,平面会根据新进入视野的画面逐渐更新平面,并且在每次更新几何平面时,平面锚点也会旋转更新以反映平面的新方向。在 iOS 16 中,在平面锚点和它的几何平面之间做了更清晰的分离,当新的画面逐渐进入视野,平面逐渐更新时,平面锚点却保持自身不变。
所有关于平面几何的信息现在都包含在一个名为 ARPlaneExtent 的类中,旋转更新不再通过旋转平面锚本身来表示。相反,ARPlaneExtent 包含一个新属性 rotationOnYAxis,它表示旋转角度。除了这个新属性之外,平面完全由宽度和高度以及 PlaneAnchor 的中心坐标定义。
4)动作捕捉(Motion Capture)
动作捕捉的更新包括 2D 骨架和 3D 骨架。
对于 2D 骨架:新增两个新关节的跟踪能力:左耳和右耳;改进了整体姿势检测。
在 iPhone 12 及更高版本上,以及配备 M1 芯片的最新 iPad Pro 和 iPad Air 机型上,3D 骨架跟踪也得到了改进:更少的抖动和更好的时间一致性;如果人的部分被遮挡或走近相机时,跟踪也会更加稳定。
4)地理位置锚点(Location Anchor)
Location Anchor 已经在美国越来越多的城市和英国伦敦推出。后续将继续增加支持的城市包括:加拿大的温哥华、多伦多和蒙特利尔等城市;新加坡和日本的七个大都市区(东京等);澳大利亚的墨尔本和悉尼;新西兰奥克兰;以色列特拉维夫;法国巴黎。
如果想知道在特定坐标处是否支持地理位置锚点,需使用 ARGeoTrackingConfiguration 的 checkAvailability 方法。
7.3、AR 体验设计建议
参见:Qualities of great AR experiences[22]
这个 Session 主要讨论了创建 AR 应用时的一些设计建议。包括如何将人们引导到正确的环境、如何合理利用屏幕空间、怎样对持续移动的场景设计 AR 交互、如何考虑人体工程学和有限视野的限制、如何使用深度提示以及对体验时长加以限制避免性能问题和用户疲倦。
7.4、将你的世界带入 AR
参见:Bring your world into augmented reality[23]
这个 Session 介绍了如何使用 Object Capture 和 RealityKit 将现实世界的对象带入 AR 游戏。展示了如何使用 Object Capture 框架捕获物体,将它们添加到 Xcode 中的 RealityKit 项目,应用程式化着色器和动画,并将它们用作 AR 体验的一部分。还介绍了使用 ARKit、RealityKit 和 Object Capture 时的最佳实践。
要做好对象捕获,有几点需要注意:
选择具有正确特征的对象: 物体表面要有足够的纹理。如果对象的某些区域是无纹理或透明的,则这些区域的细节可能无法很好地重建。 物体表面没有眩光和反射。如果物体没有磨砂表面,可以尝试使用漫射照明减少其上的镜面反射。 如果想翻转物体以捕捉其底部,请确保您的物体保持刚性,即物体在翻转时不应该改变它的形状。 物体在一定程度上包含精细的结构,但你需要使用高分辨率相机并拍摄特写照片才能重建物体的精细细节。 建立一个理想的捕捉环境: 捕捉环境具有良好、均匀和漫射的照明。确保稳定的背景很重要并在物体周围留有足够的空间。 拍摄对象的高质量照片: 物体处在干净简洁的环境下,使得物体能在照片中明显脱颖而出。比如,放在干净的白色桌子上。 多角度拍摄多种照片。包括不同高度,不同旋转角度等。 确保物体全部展现在照片中,并且最大程度兼顾清晰度和细节。
在拍完照片后,下一步就是将照片复制到 Mac 上使用 Object Capture API 处理它们。
可以从四个不同的详细级别中进行选择,这些级别针对不同的用例进行了优化:
8、视频质量相关
8.1、AVQT 的新功能
参见:What’s new in AVQT[24]
AVQT(Advanced Video Quality Tool)是苹果在 2021 年推出了视频质量分析工具。通过输入给 AVQT 源视频和编码后的视频,经过 AVQT 处理后对编码后的视频进行打分。AVQT 是一个 macOS 的工具,可以模拟真人对视频质量进行打分,支持帧级别以及段级别(一段一般是 6s,可配置)的打分,支持基于 AVFoundation 的所有视频格式,包括 SDR、HDR、HDR 10、HLG 以及 Dolby Vision。
AVQT 独有的三个关键特性:首先,AVQT 与人们如何评价视频具有高度相关性。这适用于所有内容类型,例如动画、自然场景和运动。其次,AVQT 具有优秀的处理速度,这要归功于 AVQT 依靠 AVFoundation 和 Metal 来进行视频解码和处理。第三,AVQT 旨在适应不同的观看设置。根据观看设置,相同的视频可能会产生不同的体验。这可以通过显示分辨率、显示尺寸和观看距离等因素在 AVQT 中进行配置。
今年对 AVQT 的更新包括以下几点:
1)支持 HTML 可视化报告
今年对 AVQT 做了增强,最新版本的 AVQT 可生成 HTML 的可视化报告,其中包含显示视频质量分析的交互式图表和图表。通过添加新的『可视化』标志可以轻松生成这些报告。
2)支持对视频指定时间段的内容进行评分
另一个新功能是可以给要评估的视频和参考视频指定时间窗口(通过指定帧数),从而可以只关注这个视频中的某些片段或特定场景的质量。它还允许比较未在时间上对齐的视频。
3)支持原始 YUV 格式
在最新的版本中,AVQT 扩展了对原始 YUV 格式的支持,包括 444、422、420、411、410 等采样格式,8 位、10 位、12 位、16 位等位深。这可以对从未压缩过的视频进行评分,例如原始相机发送过来的视频。
4)支持 Linux
AVQT 现在可以在 Linux 上使用,这将允许人们评估存储在云中或在基于 Linux 的服务器中压缩的内容,而无需移动视频。
参考资料
What’s new in HLS Interstitials: https://developer.apple.com/videos/play/wwdc2022/10145/
[2]Deliver reliable streams with HLS Content Steering: https://developer.apple.com/videos/play/wwdc2022/10144/
[3]Explore EDR on iOS: https://developer.apple.com/videos/play/wwdc2022/10113/
[4]Display EDR content with Core Image, Metal, and SwiftUI: https://developer.apple.com/videos/play/wwdc2022/10114
[5]Animation with a Core Image Render: https://developer.apple.com/documentation/coreimage/generating_an_animation_with_a_core_image_render_destination
[6]Display HDR video in EDR with AVFoundation and Metal: https://developer.apple.com/videos/play/wwdc2022/110565/
[7]Create a great video playback experience: https://developer.apple.com/videos/play/wwdc2022/10147/
[8]Explore media metadata publishing and playback interactions: https://developer.apple.com/videos/play/wwdc2022/110338/
[9]Discover advancements in iOS camera capture: https://developer.apple.com/videos/play/wwdc2022/110429/
[10]Create camera extensions: https://developer.apple.com/videos/play/wwdc2022/10022/
[11]Meet ScreenCaptureKit: https://developer.apple.com/videos/play/wwdc2022/10156/
[12]Take ScreenCaptureKit to the next level: https://developer.apple.com/videos/play/wwdc2022/10155/
[13]Discover Metal 3: https://developer.apple.com/videos/play/wwdc2022/10066/
[14]Fast Resource Loading: https://developer.apple.com/videos/play/wwdc2022/10104
[15]Offline Shader Compilation: https://developer.apple.com/videos/play/wwdc2022/10102
[16]MetalFX Upscaling: https://developer.apple.com/videos/play/wwdc2022/10103
[17]Metal Mesh Shader: https://developer.apple.com/videos/play/wwdc2022/10162
[18]Maximize Metal Ray Tracing Performance: https://developer.apple.com/videos/play/wwdc2022/10105
[19]Accelerate Machine Learning with Metal: https://developer.apple.com/videos/play/wwdc2022/10063
[20]Create parametric 3D room scans with RoomPlan: https://developer.apple.com/videos/play/wwdc2022/10127/
[21]Discover ARKit 6: https://developer.apple.com/videos/play/wwdc2022/10126/
[22]Qualities of great AR experiences: https://developer.apple.com/videos/play/wwdc2022/10131
[23]Bring your world into augmented reality: https://developer.apple.com/videos/play/wwdc2022/10128
[24]What’s new in AVQT: https://developer.apple.com/videos/play/wwdc2022/10149/