> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XAPU 概觀

> XBOX 音訊處理單元 (XAPU) API，可在 XBOX Series X|S 上進行硬體加速的 Opus 解碼與高品質取樣率轉換。

本主題提供 [XAPU API](/zh-TW/reference/audio/xapu/xapu_members) 的概觀，這些 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](/zh-TW/reference/audio/xapu/structs/xapudecodeconvertcommand) 實作的重大變更：使用 firstFrameIndex 時，現在不再包含先前會包含的剩餘資料。如需其他詳細資料，請參閱「最佳做法」一節或 API 參考頁面 [XApuDecodeConvertCommand](/zh-TW/reference/audio/xapu/structs/xapudecodeconvertcommand)。
* 先前如果 HSRC 輸出處理緩衝區中有資料，且使用了排清命令，就會遺失資料 (您可能會遺失部分已轉換的音訊資料，且輸出會不如預期)
* 如果傳送不受支援的 Opus 封包進行處理，現在會擲回錯誤而不是停止回應。(例如，在僅支援 10 毫秒或 20 毫秒的情況下傳送 2.5 毫秒的 Opus 封包)
* FIFO 預設為開啟
* 整體效能改善與穩定性修正

## Opus 硬體解碼版本規格

下表概述可用的命令與功能：

| - | CELT | - | - | - | SILK | - | - | - | Hybrid | - | - | - | PCM | - | - | - |
| - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 命令 | 支援模式 | 搜尋與循環 | 重設 | HSRC | 支援模式 | 搜尋與循環 | 重設 | HSRC | 支援模式 | 搜尋與循環 | 重設 | HSRC | 支援模式 | 搜尋與循環 | 重設 | HSRC |
| DECODE | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | | | | |
| DECODE and CONVERT | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | | | | |
| CONVERT ONLY | | | | | | | | | | | | | 是 | 是 | 是 | 是 |

### HSRC 使用方式的重要注意事項

高品質取樣率轉換器 (HSRC) 具有與頻率相關的群組延遲，對於 10 kHz 以下的頻率約為 *5 個畫面*。

啟用取樣率轉換器時，輸出的預期延遲為 *5 個畫面*，呼叫端可據此進行調整。如果使用音訊中介軟體解決方案，您的遊戲可能已處理此延遲。

### 最佳做法

* 關於 [XApuDecodeConvertCommand](/zh-TW/reference/audio/xapu/structs/xapudecodeconvertcommand) 實作：傳入 [XApuDecodeConvertCommand](/zh-TW/reference/audio/xapu/structs/xapudecodeconvertcommand) 的 firstFrameIndex 會指定將複製到 PCM 輸出緩衝區的第一個畫面。firstFrameIndex 搭配 frameCount 會指定要複製到輸出緩衝區的內容。使用 firstFrameIndex 時，我們的實作不會包含剩餘資料。如果有 100 個剩餘畫面，且 firstFrameIndex 設為 50、frameCount 設為 200，則會從解碼資料中的第 50 個畫面開始，將 200 個畫面加入整個剩餘資料。這表示進入 HSRC 的緩衝區會有來自剩餘資料的原始 100 個畫面，後面接著從目前解碼封包中第 50 個畫面開始的 200 個畫面。
* 建議您謹慎建立 XAPU 用戶端。最好預先建立 XAPU 用戶端 (在啟用音訊引擎資源期間)，並在遊戲的整個存留期間持續使用。呼叫 [XApuConnect](/zh-TW/reference/audio/xapu/functions/xapuconnect) 與 [XAapuDisconnect](/zh-TW/reference/audio/xapu/functions/xapudisconnect) 的運算成本很高。如果頻繁建立和刪除具有不同記憶體需求的用戶端，就有資源耗盡的風險。
* 針對循環用途，是否使用 [XApuCommandType::Reset](/zh-TW/reference/audio/xapu/enums/xapucommandtype) 由呼叫端決定，因為它可能會在輸出中造成暫態效果。不過，使用 [XApuCommandType::Reset](/zh-TW/reference/audio/xapu/enums/xapucommandtype) 時，必須提交預先滾動封包以避免暫態效果。
* 若要獲得最佳效能，請使用以 20 毫秒封包大小編碼的 Opus 串流
* 就效能而言，使用較少用戶端搭配較多串流，可能會比使用較多用戶端搭配較少串流更好。例如，5 個用戶端、每個用戶端 20 個串流，總共 100 個串流，其效能會優於 50 個用戶端、每個用戶端 2 個串流。兩者都可以用來解碼 100 個串流，但前者的效能較佳
* OPUS\_SET\_PREDICTION\_DISABLED 會停用封包間預測，且受到支援。使用此旗標進行編碼會降低壓縮效能，進而降低解碼輸出的品質。
* 當硬體裝置處於不良狀態時，XAPU 會傳回 [XAPU\_E\_DEVICE\_FATAL](/zh-TW/reference/audio/xapu/enums/xapuerrors) 錯誤。此時應先中斷所有 XAPU 用戶端的連線，然後再建立任何新的用戶端，以便從此錯誤中復原。
* 命令完成的訊號機制以 3 毫秒計時器運作，並針對每個 XAPU 用戶端截至目前為止完成的所有命令發出一次訊號，不論有多少命令使用了 [XApuCommandOptions::SignalOnCompletion](/zh-TW/reference/audio/xapu/enums/xapucommandoptions) 旗標。
* 如果遊戲無法容許 3 毫秒的訊號機制，可以在迴圈中尋找回應，或使用 Sleep(0) 並檢查回應。
* 在中斷用戶端連線之前，務必等候所有回應。如果有尚未取回的未完成要求，[XApuDisconnect](/zh-TW/reference/audio/xapu/functions/xapudisconnect) 現在會傳回 [XAPU\_E\_PENDING\_RESULTS](/zh-TW/reference/audio/xapu/enums/xapuerrors) 錯誤。此錯誤無法採取動作，應僅在開發期間使用。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](mailto:AnaAud@microsoft.com) 索取)

* 解碼一個 Opus 串流。(此範例的概觀請參閱[這裡](/zh-TW/build/console-features/audio/overviews/xapu-overview-single-stream-audio-decode)。)
* 解碼多個 Opus 串流。
* 播放一個 Opus 串流。(執行緒處理方式與「解碼一個 Opus 串流」不同。)
* 播放多個 Opus 串流。
* 解碼轉換一個 Opus 串流，並提供循環與取樣精確搜尋的選項。
* 解碼轉換多個 Opus 串流。
* 播放解碼轉換的一個 Opus 串流。
* SimpleXAPU (在具有 UI 的 GDK 遊戲中解碼 Opus 串流的範例。)

### 連絡人

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

## 參考 API 文件

* [Xapu (API 內容)](/zh-TW/reference/audio/xapu/xapu_members)
  * 函式
    * [XApuConnect](/zh-TW/reference/audio/xapu/functions/xapuconnect)
    * [XAapuDisconnect](/zh-TW/reference/audio/xapu/functions/xapudisconnect)
  * 結構
    * [XApuDecodeConvertCommand](/zh-TW/reference/audio/xapu/structs/xapudecodeconvertcommand)


## Related topics

- [XBOX Series X|S 音訊硬體概觀](/zh-TW/build/console-features/audio/overviews/scarlett-audio.md)
- [XApuConnect](/zh-TW/reference/audio/xapu/functions/xapuconnect.md)
- [XApuDisconnect](/zh-TW/reference/audio/xapu/functions/xapudisconnect.md)
- [XApuDecodeConvertCommand](/zh-TW/reference/audio/xapu/structs/xapudecodeconvertcommand.md)
- [概觀](/zh-TW/build/console-features/audio/overviews/index.md)
