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::SubmitSourceBuffer 的 XAUDIO2_BUFFER 时,其循环相关字段存在限制。如果整个 xWMA 文件的音频数据作为单个缓冲区提交且用户希望进行循环,必须满足以下限制。- XAUDIO2_BUFFER.LoopBegin 必须始终为零。
- XAUDIO2_BUFFER.LoopLength 必须为零,或等于整个文件 xWMA 数据以采样数计的大小。
- XAUDIO2_BUFFER.LoopCount 可为任意值。
- XAUDIO2_BUFFER.Flags 必须设置为 XAUDIO2_END_OF_STREAM。
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 结构。 |
