ADPCM 概述

自适应差分脉冲代码调制 (ADPCM) 是一种为 XAudio2 实现的有损压缩格式,用于提供用于指定压缩样本块大小的附加功能。 使用有损压缩格式时,某些数据在压缩过程中会更改和丢失。 ADPCM 可以实现高达 4:1 的压缩比。

ADPCM for XAudio2 的实现提供了其他功能来指定压缩示例块的大小。 ADPCM 使音频设计器能够选择一个设置,该设置在大小、质量和分辨率 (之间是适当的妥协,用于将循环点放置在) 。

XAudio2 使用 Microsoft ADPCM 编解码器的修改版本,该编解码器支持提供自定义示例块大小所需的扩展数据格式。 因此,XAudio2 音频数据不能由不支持此版本的 ADPCM 编解码器的音频引擎播放。

注意

目前,ADPCM 压缩仅适用于 Windows,包括 XNA Game Studio Express for Windows 部署。

 

ADPCM 编码

音频数据使用 AdpcmEncode 命令行工具编码为 ADPCM。

  • AdpcmEncode

    若要将音频文件编码为 ADPCM 以用于 XAudio2,请使用 AdpcmEncode 命令行工具。

ADPCM 解码

XAudio2 支持 ADPCM 的软件解码。

SamplesPerBlock

ADPCM 压缩的工作原理是将波形分为块,并预测每个块中波形样本的变化。 块的大小以样本为单位测量。 最小块大小为 32 个样本,最高为 512 个样本。

较大的块允许更好的压缩,这会导致更小的文件大小,但以声音质量和分辨率为代价来对齐循环点。

通常,修改 SamplesPerBlock 值会导致以下权衡:

如果 SamplesPerBlock... 文件压缩 声音质量 循环点解析
将 (增加到最大 512) 增加 减少 减少
将 (降低到最低 32) 减少 增加 增加

 

限制

由于 ADPCM 使用一个接一个对齐的示例块,因此使用 ADPCM 压缩的波的末尾可能有一个未完成的部分块。 ADPCM 解码器会为此部分块的其余部分生成静音,从而防止波形无缝循环。

SamplesPerBlock 参数的值会影响可对齐波形数据和循环点的分辨率。

如果尝试对不对齐波形应用压缩,则会收到错误或警告,具体取决于是否在任何循环播放事件中使用该波。 不能压缩任何循环播放事件中使用的波形。 将其从循环播放事件中删除,然后重新应用压缩。

如果在非循环模式下专门使用波形,则示例块对齐限制不适用。

ADPCM 文件结构

ADPCM 文件是具有以下区块类型的标准 RIFF 文件。

区块 FCC 说明
RIFF 标准 RIFF 区块包含一个文件类型,其数据节的前四个字节中包含值为 WAVE,文件的其他区块位于其数据节的其余部分。
Fmt 包含 ADPCM 文件的格式标头。 此区块中的数据对应于 ADPCMWAVEFORMAT 结构。
数据 包含编码的 ADPCM 音频数据。 在 XAudio2 中使用 ADPCM 时,需要将数据区块的内容读入缓冲区,并将其作为XAUDIO2_BUFFER结构的 pAudioData 成员传递给源语音。 无需对数据区块的内容进行字节交换。
smpl 和 wsmp 包含 ADPCM 文件的循环信息的可选区块类型。 在 XAudio2 中使用 ADPCM 时,smpl 或 wsmp 区块中包含的值用于填充 XAUDIO2_BUFFER 结构的 LoopBeginLoopLengthLoopCount 成员。 在 Xbox 360 上,需要对从 smpl 区块加载的数据进行字节交换,以考虑 Windows 和 Xbox 360 之间的字节差异。

 

编程指南