一文看完 WWDC 2022 音視訊相關的更新要點丨音視訊工程示例

語言: CN / TW / HK

這個公眾號會路線圖式的遍歷分享音視訊技術:音視訊基礎(完成) → 音視訊工具(完成) → 音視訊工程示例(進行中) → 音視訊工業實戰(準備)。關注一下成本不高,錯過乾貨損失不小

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 標籤來告訴客戶端安排插片式播放,如下圖所示:

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 Rendering

EDR headroom 是動態的,它的值受到多種因素的影響,比如:裝置的顯示技術、當前的顯示亮度等等。

我們通常可以使用下面這個公式粗略估計 EDR headroom:

Headroom ≈ Display Peak / SDR

3)EDR 內容的讀取

流程如下:

HDR 圖片檔案的渲染流程

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 來提供影象去繪製:

MetalView、Renderer、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 來渲染。

HDR 視訊的播放

HDR 視訊後處理

整個 Session 的內容從下面幾個方面展開:

1)Apple EDR 視訊框架

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 上播放自己的檢視。

AVPlayer 的用法

如果需要實現實時視訊效果,大致流程如下:

實時視訊效果

最終渲染一般都使用 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 紋理,大致流程如下圖所示:

CVMetalTextureCache 從 CoreVideo 提取 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 還支援設定與顯示器一致的原始解析度和幀率,也可以根據流的內容調整相關質量引數,還支援隱藏滑鼠游標。

錄屏相關 API 呼叫流程

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 中受益:

Sparse texture streaming

Sparse texture streaming with fast resource loading

更多內容可以瞭解:Load resources faster with Metal 3[14]

2)Offline Shader Compilation

下圖展示了 Shader 離線編譯降低卡幀:

Shader 離線編譯降低卡幀

下圖展示了 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 的程式生成幾何流程的差異:

傳統的程式生成幾何流程

基於 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 倍。

圖片

Metal 3 支援的裝置

更多內容可以瞭解:Accelerate machine learning with Metal[19]

7)Metal 3 開發工具

Metal 3 不僅僅是功能,它還包括一套全面的高階開發工具。比如:Xcode 14 中的 Metal Dependency Viewer 可以更輕鬆地視覺化整個渲染器或放大單個通道;Xcode 14 中改進的 Acceleration Structure Viewer 可幫助您充分利用 Metal 3 的優化光線追蹤,等等。

Metal Dependency 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 掃描

通過 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 中,在平面錨點和它的幾何平面之間做了更清晰的分離,當新的畫面逐漸進入視野,平面逐漸更新時,平面錨點卻保持自身不變。

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 具有優秀的處理速度,這要歸功於 AVQT 依靠 AVFoundation 和 Metal 來進行視訊解碼和處理。第三,AVQT 旨在適應不同的觀看設定。根據觀看設定,相同的視訊可能會產生不同的體驗。這可以通過顯示解析度、顯示尺寸和觀看距離等因素在 AVQT 中進行配置。

AVQT 在 M1 系列上的處理速度

今年對 AVQT 的更新包括以下幾點:

1)支援 HTML 視覺化報告

今年對 AVQT 做了增強,最新版本的 AVQT 可生成 HTML 的視覺化報告,其中包含顯示視訊質量分析的互動式圖表和圖表。通過新增新的『視覺化』標誌可以輕鬆生成這些報告。

AVQT 的 HTML 報告

2)支援對視訊指定時間段的內容進行評分

另一個新功能是可以給要評估的視訊和參考視訊指定時間視窗(通過指定幀數),從而可以只關注這個視訊中的某些片段或特定場景的質量。它還允許比較未在時間上對齊的視訊。

3)支援原始 YUV 格式

在最新的版本中,AVQT 擴充套件了對原始 YUV 格式的支援,包括 444、422、420、411、410 等取樣格式,8 位、10 位、12 位、16 位等位深。這可以對從未壓縮過的視訊進行評分,例如原始相機發送過來的視訊。

4)支援 Linux

AVQT 現在可以在 Linux 上使用,這將允許人們評估儲存在雲中或在基於 Linux 的伺服器中壓縮的內容,而無需移動視訊。

參考資料

[1]

What’s new in HLS Interstitials: http://developer.apple.com/videos/play/wwdc2022/10145/

[2]

Deliver reliable streams with HLS Content Steering: http://developer.apple.com/videos/play/wwdc2022/10144/

[3]

Explore EDR on iOS: http://developer.apple.com/videos/play/wwdc2022/10113/

[4]

Display EDR content with Core Image, Metal, and SwiftUI: http://developer.apple.com/videos/play/wwdc2022/10114

[5]

Animation with a Core Image Render: http://developer.apple.com/documentation/coreimage/generating_an_animation_with_a_core_image_render_destination

[6]

Display HDR video in EDR with AVFoundation and Metal: http://developer.apple.com/videos/play/wwdc2022/110565/

[7]

Create a great video playback experience: http://developer.apple.com/videos/play/wwdc2022/10147/

[8]

Explore media metadata publishing and playback interactions: http://developer.apple.com/videos/play/wwdc2022/110338/

[9]

Discover advancements in iOS camera capture: http://developer.apple.com/videos/play/wwdc2022/110429/

[10]

Create camera extensions: http://developer.apple.com/videos/play/wwdc2022/10022/

[11]

Meet ScreenCaptureKit: http://developer.apple.com/videos/play/wwdc2022/10156/

[12]

Take ScreenCaptureKit to the next level: http://developer.apple.com/videos/play/wwdc2022/10155/

[13]

Discover Metal 3: http://developer.apple.com/videos/play/wwdc2022/10066/

[14]

Fast Resource Loading: http://developer.apple.com/videos/play/wwdc2022/10104

[15]

Offline Shader Compilation: http://developer.apple.com/videos/play/wwdc2022/10102

[16]

MetalFX Upscaling: http://developer.apple.com/videos/play/wwdc2022/10103

[17]

Metal Mesh Shader: http://developer.apple.com/videos/play/wwdc2022/10162

[18]

Maximize Metal Ray Tracing Performance: http://developer.apple.com/videos/play/wwdc2022/10105

[19]

Accelerate Machine Learning with Metal: http://developer.apple.com/videos/play/wwdc2022/10063

[20]

Create parametric 3D room scans with RoomPlan: http://developer.apple.com/videos/play/wwdc2022/10127/

[21]

Discover ARKit 6: http://developer.apple.com/videos/play/wwdc2022/10126/

[22]

Qualities of great AR experiences: http://developer.apple.com/videos/play/wwdc2022/10131

[23]

Bring your world into augmented reality: http://developer.apple.com/videos/play/wwdc2022/10128

[24]

What’s new in AVQT: http://developer.apple.com/videos/play/wwdc2022/10149/

- 完 -

推薦閱讀

《WWDC 2022 音視訊相關 Session 概覽(EDR 相關)》

《WWDC 2022 音視訊相關 Session 概覽(HLS 相關)》

《iOS 視訊處理框架及重點 API 合集》

《iOS 音訊處理框架及重點 API 合集》