跳轉到主要內容
本主題提供 XAPU API 的概觀,這些 API 用於硬體加速的 Opus 檔案解碼與高品質取樣率轉換。

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 串流的範例。)

連絡人

如果您對此功能有任何問題或疑慮,請傳送電子郵件至 AnaAud@microsoft.com 或使用線上論壇。

參考 API 文件

最後修改於 2026年10月6日