Skip to main content
xWMA 是 Windows Media Audio (WMA) Professional 压缩格式的子集。xWMA 的解码由 XAudio2 通过软件支持。xWMA 使用 WMA 位流格式并采用轻量封装,适合在可承受少量 CPU 开销以换取更高压缩率的场合(如对白和音乐)中使用。通过质量设置,用户可以改变压缩声音的比特率。
xWMA 和 XMA2 都源自为 Windows Media Audio (WMA) 开发的编解码器,且都专为 XBOX 游戏开发。XMA2 使用的可用编解码器与参数子集比 xWMA 使用的更小。虽然二者都为 XBOX 开发,但并不可互换:它们的文件头不同,格式与 PC 版 Windows 不兼容。XMA2 与 xWMA 所用的编解码器也略有差异,因此各自会有各自所用压缩系统带来的伪影。
本主题内容:

xWMA 编码

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

xWMAEncode

要将音频文件编码为 xWMA 以供 XAudio2 使用,请使用 xWMA 命令行编码器

XWMAEncoder.lib

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

xWMA 解码

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

xWMA 循环

xWMA 不支持循环区域,也不支持对 xWMA 文件中任意数据包的循环。只能对整个 xWMA 文件进行循环。在 XAudio2 中,将 xWMA 用于传给 IXAudio2SourceVoice::SubmitSourceBufferXAUDIO2_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 循环,例如海浪声或某些低沉的环境噪音。

xWMA 文件结构

xWMA 文件是一个标准的 RIFF 文件,包含以下类型的块。 | 块 FCC| 描述| | --- | --- | --- | --- | | RIFF| 标准的 RIFF 块包含以下内容:
1. 在其数据段的前 4 字节中,是值为 XWMA 的文件类型标记。
2. 在数据段的其余部分中,包含文件里的其他块。 | | fmt| 该块包含 xWMA 文件的格式头。此块中的数据对应于一个 WAVEFORMATEX 结构(一或两个声道的 xWMA 数据),或一个 WAVEFORMATEXTENSIBLE 结构(三个或更多声道的 xWMA 数据)。 | | data| 该块包含编码后的 xWMA 音频数据。在 XAudio2 中使用 xWMA 时,data 块的内容会被读入一个缓冲区,并作为 XAUDIO2_BUFFER 结构的 pAudioData 成员传给源语音。data 块的内容无需进行字节交换。 | | dpds| 该块包含解码后的数据包累计数据大小数组,每个元素表示按顺序解码到对应 xWMA 数据包后累计的字节数。此块的大小(以 UINT32 计)及其数据段内容会在 XAudio2 中用于填充 XAUDIO2_BUFFER_WMA 结构。 |

另请参阅

xWMA 命令行编码器
最后修改于 2026年8月24日