> ## 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.

# xWMA 概述

> 面向 XBOX 游戏的 xWMA 音频格式：WMA Professional 的子集，由 XAudio2 通过软件解码，用于压缩对白和音乐流。

xWMA 是 Windows Media Audio (WMA) Professional 压缩格式的子集。xWMA 的解码由 [XAudio2](/build/console-features/audio/overviews/xaudio2-overview) 通过软件支持。xWMA 使用 WMA 位流格式并采用轻量封装，适合在可承受少量 CPU 开销以换取更高压缩率的场合（如对白和音乐）中使用。通过质量设置，用户可以改变压缩声音的比特率。

<Note>xWMA 和 XMA2 都源自为 Windows Media Audio (WMA) 开发的编解码器，且都专为 XBOX 游戏开发。XMA2 使用的可用编解码器与参数子集比 xWMA 使用的更小。虽然二者都为 XBOX 开发，但并不可互换：它们的文件头不同，格式与 PC 版 Windows 不兼容。XMA2 与 xWMA 所用的编解码器也略有差异，因此各自会有各自所用压缩系统带来的伪影。</Note>

本主题内容：

* [xWMA 编码](#ID4EW)
* [xWMA 解码](#ID4E6B)
* [xWMA 循环](#ID4ETD)
* [xWMA 文件结构](#ID4ESE)

<a id="ID4EW" />

## xWMA 编码

要将音频数据编码为 xWMA，请使用 xWMAEncode 命令行工具，或使用依赖 XWMAEncoder.lib 的自定义工具。

### xWMAEncode

要将音频文件编码为 xWMA 以供 XAudio2 使用，请使用 [xWMA 命令行编码器](/build/console-features/audio/tools/xwmaencode-tools)。

### XWMAEncoder.lib

XWMAEncoder.lib 是一个静态链接库，可作为 [xWMA 命令行编码器](/build/console-features/audio/tools/xwmaencode-tools) 命令行工具的替代方案。你的自定义工具可以依赖这个库，通过 **XWMAEncoder** 函数进行 xWMA 编码。有关使用该函数的详细信息和示例，请参阅 XBOX 360 文档。

<a id="ID4E6B" />

## xWMA 解码

在 Windows 和 XBOX One 上，XAudio2 支持 xWMA 的软件解码，也可以通过 xWMADecode API 进行解码。

| 技术         | 说明                                                                                                                                                                                                                                                                                                                                               |
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| XACT       | XBOX One 不支持 XACT。                                                                                                                                                                                                                                                                                                                               |
| XAudio2    | 若要在 XAudio2 中使用 xWMA 编码的数据，(1) 使用 xWMA 相关的值初始化一个 WAVEFORMATEXTENSIBLE 结构，(2) 在创建源语音时将该结构作为参数传给 [CreateSourceVoice](https://learn.microsoft.com/windows/desktop/api/xaudio2/nf-xaudio2-ixaudio2-createsourcevoice)。有关在 XAudio2 中加载并播放声音的示例，请参见 [如何：使用 XAudio2 播放声音](https://msdn.microsoft.com/library/windows/desktop/ee415787\(v=vs.85\).aspx)。 |
| XWMADecode | 使用 XWMADecode API 可直接将 xWMA 缓冲区解码为 PCM 缓冲区，无需借助 XAudio2。                                                                                                                                                                                                                                                                                         |

<a id="ID4ETD" />

## xWMA 循环

xWMA 不支持循环区域，也不支持对 xWMA 文件中任意数据包的循环。只能对整个 xWMA 文件进行循环。在 XAudio2 中，将 xWMA 用于传给 [IXAudio2SourceVoice::SubmitSourceBuffer](https://learn.microsoft.com/windows/desktop/api/xaudio2/nf-xaudio2-ixaudio2sourcevoice-submitsourcebuffer) 的 [XAUDIO2\_BUFFER](https://learn.microsoft.com/windows/desktop/api/xaudio2/ns-xaudio2-xaudio2_buffer) 时，其循环相关字段存在限制。如果整个 xWMA 文件的音频数据作为单个缓冲区提交且用户希望进行循环，必须满足以下限制。

1. XAUDIO2\_BUFFER.LoopBegin 必须始终为零。
2. XAUDIO2\_BUFFER.LoopLength 必须为零，或等于整个文件 xWMA 数据以采样数计的大小。
3. XAUDIO2\_BUFFER.LoopCount 可为任意值。
4. XAUDIO2\_BUFFER.Flags 必须设置为 XAUDIO2\_END\_OF\_STREAM。

如果 xWMA 音频数据被作为多个缓冲区提交，则只能通过手动重新提交一系列缓冲区来实现循环。

由于在 xWMA 音频循环时可能会出现一段静音，通常只应对具有平滑淡入淡出的声音使用 xWMA 循环，例如海浪声或某些低沉的环境噪音。

<a id="ID4ESE" />

## xWMA 文件结构

xWMA 文件是一个标准的 RIFF 文件，包含以下类型的块。

\| 块 FCC| 描述|
\| --- | --- | --- | --- |
\| RIFF| 标准的 RIFF 块包含以下内容：<br />1. 在其数据段的前 4 字节中，是值为 `XWMA` 的文件类型标记。<br /> 2. 在数据段的其余部分中，包含文件里的其他块。 |
\| fmt| 该块包含 xWMA 文件的格式头。此块中的数据对应于一个 [WAVEFORMATEX](https://learn.microsoft.com/windows/desktop/api/mmreg/ns-mmreg-waveformatex) 结构（一或两个声道的 xWMA 数据），或一个 WAVEFORMATEXTENSIBLE 结构（三个或更多声道的 xWMA 数据）。 |
\| data| 该块包含编码后的 xWMA 音频数据。在 XAudio2 中使用 xWMA 时，data 块的内容会被读入一个缓冲区，并作为 [XAUDIO2\_BUFFER](https://learn.microsoft.com/windows/desktop/api/xaudio2/ns-xaudio2-xaudio2_buffer) 结构的 pAudioData 成员传给源语音。data 块的内容无需进行字节交换。 |
\| dpds| 该块包含解码后的数据包累计数据大小数组，每个元素表示按顺序解码到对应 xWMA 数据包后累计的字节数。此块的大小（以 UINT32 计）及其数据段内容会在 XAudio2 中用于填充 [XAUDIO2\_BUFFER\_WMA](https://learn.microsoft.com/windows/desktop/api/xaudio2/ns-xaudio2-xaudio2_buffer_wma) 结构。 |

<a id="ID4EPG" />

## 另请参阅

[xWMA 命令行编码器](/build/console-features/audio/tools/xwmaencode-tools)


## Related topics

- [概述](/zh-CN/build/console-features/audio/overviews/index.md)
- [XBOX One 中的音频架构](/zh-CN/build/console-features/audio/overviews/xbox-one-audio-architecture.md)
- [XMA2 概述](/zh-CN/build/console-features/audio/overviews/xma2-overview.md)
- [SHAPE 概述](/zh-CN/build/console-features/audio/overviews/shape-overview.md)
- [音频](/zh-CN/build/console-features/audio/gc-audio-toc.md)
