Opus 硬體解碼版本功能
過去,XMA 是 XBOX One 系列主機上唯一提供硬體卸載解碼的選項。現在,在 XBOX Series X|S 世代的主機上,我們透過 XAPU (XBOX 音訊處理單元) API 推出 Opus 硬體卸載解碼。 Opus 是免權利金的音訊壓縮轉碼器,其設計目的是將語音與一般音訊有效率地編碼為單一格式。Opus 具有低延遲。在內部評估中,Opus 在品質與檔案大小壓縮比方面都優於 XMA。 此外,還新增了高品質取樣率轉換器 (HSRC),以搭配硬體解碼功能 (Opus) 運作。將 Opus 硬體卸載解碼與 HSRC 功能結合以變更音高時,開發人員會發現輸出品質比上一代的 SHAPE 方案有所提升。(為了回溯相容性,XBOX Series X|S 主機仍支援 SHAPE。)此版本的新功能
- June FAL QFE3 新增:在 Quick Resume 案例中,遊戲在繼續後不再需要重新建立與硬體的連線。
- June FAL QFE4 新增:CELT 現在支援長度為 2.5 和 5 毫秒的 Opus 封包。
- August 2020 Preview Recovery 版本 10.0.19041.4124 (rs_xbox_release_2008- 19041.4124.200814-0000) / 10.0.19041.3562 (rs_xbox_release_sirius- 19041.3562.200814-2300) 或更新版本:XApuDecodeConvertCommand 實作的重大變更:使用 firstFrameIndex 時,現在不再包含先前會包含的剩餘資料。如需其他詳細資料,請參閱「最佳做法」一節或 API 參考頁面 XApuDecodeConvertCommand。
- 先前如果 HSRC 輸出處理緩衝區中有資料,且使用了排清命令,就會遺失資料 (您可能會遺失部分已轉換的音訊資料,且輸出會不如預期)
- 如果傳送不受支援的 Opus 封包進行處理,現在會擲回錯誤而不是停止回應。(例如,在僅支援 10 毫秒或 20 毫秒的情況下傳送 2.5 毫秒的 Opus 封包)
- FIFO 預設為開啟
- 整體效能改善與穩定性修正
Opus 硬體解碼版本規格
下表概述可用的命令與功能:HSRC 使用方式的重要注意事項
高品質取樣率轉換器 (HSRC) 具有與頻率相關的群組延遲,對於 10 kHz 以下的頻率約為 5 個畫面。 啟用取樣率轉換器時,輸出的預期延遲為 5 個畫面,呼叫端可據此進行調整。如果使用音訊中介軟體解決方案,您的遊戲可能已處理此延遲。最佳做法
- 關於 XApuDecodeConvertCommand 實作:傳入 XApuDecodeConvertCommand 的 firstFrameIndex 會指定將複製到 PCM 輸出緩衝區的第一個畫面。firstFrameIndex 搭配 frameCount 會指定要複製到輸出緩衝區的內容。使用 firstFrameIndex 時,我們的實作不會包含剩餘資料。如果有 100 個剩餘畫面,且 firstFrameIndex 設為 50、frameCount 設為 200,則會從解碼資料中的第 50 個畫面開始,將 200 個畫面加入整個剩餘資料。這表示進入 HSRC 的緩衝區會有來自剩餘資料的原始 100 個畫面,後面接著從目前解碼封包中第 50 個畫面開始的 200 個畫面。
- 建議您謹慎建立 XAPU 用戶端。最好預先建立 XAPU 用戶端 (在啟用音訊引擎資源期間),並在遊戲的整個存留期間持續使用。呼叫 XApuConnect 與 XAapuDisconnect 的運算成本很高。如果頻繁建立和刪除具有不同記憶體需求的用戶端,就有資源耗盡的風險。
- 針對循環用途,是否使用 XApuCommandType::Reset 由呼叫端決定,因為它可能會在輸出中造成暫態效果。不過,使用 XApuCommandType::Reset 時,必須提交預先滾動封包以避免暫態效果。
- 若要獲得最佳效能,請使用以 20 毫秒封包大小編碼的 Opus 串流
- 就效能而言,使用較少用戶端搭配較多串流,可能會比使用較多用戶端搭配較少串流更好。例如,5 個用戶端、每個用戶端 20 個串流,總共 100 個串流,其效能會優於 50 個用戶端、每個用戶端 2 個串流。兩者都可以用來解碼 100 個串流,但前者的效能較佳
- OPUS_SET_PREDICTION_DISABLED 會停用封包間預測,且受到支援。使用此旗標進行編碼會降低壓縮效能,進而降低解碼輸出的品質。
- 當硬體裝置處於不良狀態時,XAPU 會傳回 XAPU_E_DEVICE_FATAL 錯誤。此時應先中斷所有 XAPU 用戶端的連線,然後再建立任何新的用戶端,以便從此錯誤中復原。
- 命令完成的訊號機制以 3 毫秒計時器運作,並針對每個 XAPU 用戶端截至目前為止完成的所有命令發出一次訊號,不論有多少命令使用了 XApuCommandOptions::SignalOnCompletion 旗標。
- 如果遊戲無法容許 3 毫秒的訊號機制,可以在迴圈中尋找回應,或使用 Sleep(0) 並檢查回應。
- 在中斷用戶端連線之前,務必等候所有回應。如果有尚未取回的未完成要求,XApuDisconnect 現在會傳回 XAPU_E_PENDING_RESULTS 錯誤。此錯誤無法採取動作,應僅在開發期間使用。XApuDisconnect 會釋放為用戶端配置的所有資源,如果在硬體仍在處理此用戶端的命令時呼叫它,可能會因為硬體寫入已釋放的記憶體而發生記憶體損毀。
- 傳遞給硬體的所有記憶體指標 (例如:inputData、outPutData 和 processingBuffer) 都應採用 16 位元組對齊。
- 使用 ConvertOnly 或 DecodeConvert 模式時,較大的輸出畫面計數大小會帶來較佳的效能。使用解碼轉換與轉換時,支援的最大輸出畫面大小為 1024。
- 僅支援可變位元速率 (VBR) 編碼。不支援固定位元速率 (CBR) 編碼,因為它會新增轉換封包,而這類封包的效率和品質都比 VBR 編碼中使用的備援封包差。因此,不支援此封包類型,連帶也不支援 CBR。
- 針對 HYBRID 與 SILK:僅支援使用 10 或 20 毫秒封包且取樣率為 48000 Hz 的單聲道和立體聲 Opus 串流。
- 針對 CELT:僅支援使用 2.5、5、10 或 20 毫秒封包且取樣率為 48000 Hz 的單聲道和立體聲 Opus 串流。
暫停與繼續遊戲
遊戲必須能夠暫停與繼續,例如當使用者將其置於受限模式時。呼叫暫停處理常式時,只需停止向硬體提交 XAPU 命令即可。已提交的命令會正常完成,並放入其對應的回應佇列中。範例 (原始程式碼位於外部 .zip 檔案中,請傳送電子郵件至 AnaAud@microsoft.com 索取)
- 解碼一個 Opus 串流。(此範例的概觀請參閱這裡。)
- 解碼多個 Opus 串流。
- 播放一個 Opus 串流。(執行緒處理方式與「解碼一個 Opus 串流」不同。)
- 播放多個 Opus 串流。
- 解碼轉換一個 Opus 串流,並提供循環與取樣精確搜尋的選項。
- 解碼轉換多個 Opus 串流。
- 播放解碼轉換的一個 Opus 串流。
- SimpleXAPU (在具有 UI 的 GDK 遊戲中解碼 Opus 串流的範例。)
