Skip to main content
在 XBOX One 上,XMA2 音訊解壓縮是以硬體實作。不過,xWMA 並非如此,它需要軟體解碼。XMA2 和 xWMA 都使用相同的壓縮演算法,但 xWMA 提供更廣泛的編碼格式。為了效能與壓縮的優點,請編碼為 XMA2,但請注意,某些高傳真音樂透過 xWMA 轉譯可能聽起來更好,這需要進行聆聽測試。透過 XAudio2 處理 XMA2 應該是最簡單的方法,但也可以使用音訊控制處理器 (ACP) 命令直接對硬體處理 XMA2。
xWMA 和 XMA2 都源自為 Windows Media Audio (WMA) 開發的轉碼器,而且兩者都是專為 XBOX 遊戲所開發。XMA2 所使用的可用轉碼器與參數子集比 xWMA 所使用的子集小。雖然 xWMA 和 XMA2 都是為 XBOX 開發的,但兩者不能互換:每種檔案格式的標頭都不同,而且這些格式與 PC 版 Windows 不相容。XMA2 和 xWMA 使用的轉碼器也略有不同,因此各自會因所使用的壓縮系統而產生自己的失真。
本主題涵蓋下列內容:

XMA2 編碼

使用 Microsoft Game Development Kit (GDK) 隨附的 XMA2 編碼器工具,將音訊資料編碼為 XMA2。XMA2 檔案是具有 XMA2WAVEFORMATEX 格式標頭,並在 Seek 位置表內有額外 seek 區塊的 .wav 檔案。 XMA2 格式與 XBOX 360 相容,而 Seek 表在 XBOX One 上需要進行 ULONG 位元組交換。如果輸入是 .wav 檔案,則輸出可直接使用而不需修改。 若要對 Seek 表進行位元組交換,請使用下列程式碼。
建議您先將此程式碼加入應用程式以測試功能,之後或許可以撰寫一個獨立工具來執行交換,讓您的應用程式不需要任何前置處理。 在 XBOX One 上,所有搭配流程圖使用的直接記憶體存取 (DMA) 輸入和輸出緩衝區,以及所有提交至來源緩衝區的 XMA 內容,都必須使用 ApuAlloc 方法配置,並使用 ApuFree 方法釋放。如下列程式碼所示。請注意使用 SHAPE_XMA_INPUT_BUFFER_ALIGNMENT 旗標來協助確保區塊正確對齊。
如需搭配 XMA2 編碼檔案使用結構欄位的詳細資訊,請參閱 XMA2WAVEFORMATEX 結構。

XMA2 AXI 匯流排錯誤

XMA 硬體解碼器 (以及 XBOX 360) 中有一個長期存在的錯誤,要求直接使用 AcpHal 的遊戲必須提供因應措施。XAudio2 已提供此因應措施。不過,在 XMA2 編碼器工具更新之前,請留意下列資訊。 在解碼 XMA 位元串流且只使用單一 XMA 輸入緩衝區時,如果 XMA 緩衝區的最後 64 個位元組包含編碼資料,就可能觸發 AXI 匯流排錯誤。XMA 位元串流很少會在最後 64 個位元組內包含編碼資料。儘管如此,仍必須處理此情況以避免 AXI 匯流排錯誤。在 XMA2 編碼器工具更新為確保沒有任何編碼檔案在位元串流的最後 64 個位元組中包含編碼資料之前,您可以使用下列其中一種方法來避免此問題。
  • 一律同時使用兩個 XMA 輸入緩衝區,且絕不將任一輸入緩衝區的指標設為無效值。
  • 將未使用之輸入緩衝區的指標設為等於另一個輸入緩衝區的指標,即使您不會啟用另一個緩衝區也一樣。範例如下。
  • 在產生內容時,使用離線工具掃描您的 XMA 檔案。如果編碼 XMA 位元串流最後 64 個位元組中的任何一個值不是 0xFF,請重新編碼該檔案。
上述任一方法都能防止 XMA 預先擷取器讀取無效的位址。

參考 API 文件

另請參閱

XMA2 編碼器工具
Last modified on October 6, 2026