WAVEFORMATEX 结构 (mmreg.h)

WAVEFORMATEX 结构指定波形音频流的数据格式。

语法

typedef struct tWAVEFORMATEX {
  WORD  wFormatTag;
  WORD  nChannels;
  DWORD nSamplesPerSec;
  DWORD nAvgBytesPerSec;
  WORD  nBlockAlign;
  WORD  wBitsPerSample;
  WORD  cbSize;
} WAVEFORMATEX, *PWAVEFORMATEX, *NPWAVEFORMATEX, *LPWAVEFORMATEX;

成员

wFormatTag

指定波形音频格式类型。 有关更多信息,请参见下面的“备注”部分。

nChannels

指定音频数据的通道数。 对于单声道音频,将此成员设置为 1。 对于立体声,将此成员设置为 2。

nSamplesPerSec

指定应播放或录制每个通道的采样频率。 如果 wFormatTag = WAVE_FORMAT_PCM,则 nSamplesPerSec 的常见值为 8.0 kHz、11.025 kHz、22.05 kHz 和 44.1 kHz。 例如,若要指定 11.025 kHz 的采样频率,请将 nSamplesPerSec 设置为 11025。 对于非 PCM 格式,应根据格式标记的制造商规范计算此成员。

nAvgBytesPerSec

指定所需的平均数据传输速率(以字节/秒为单位)。 此值可用于估算缓冲区大小。

nBlockAlign

指定块对齐方式(以字节为单位)。 块对齐方式是 wFormatTag 格式类型的最小原子单元数据的大小。 如果 wFormatTag = WAVE_FORMAT_PCM 或 wFormatTag = WAVE_FORMAT_IEEE_FLOAT,请将 nBlockAlign 设置为 (nChannels*wBitsPerSample)/8,这是单个音频帧的大小。 对于非 PCM 格式,应根据制造商的格式标记规范计算此成员。

播放和录制软件应一次处理 多个 nBlockAlign 字节的数据。 写入设备以及从设备读取的数据应始终从块的开头开始。

wBitsPerSample

wFormatTag 指定的格式类型指定每个样本的位数。 如果 wFormatTag = WAVE_FORMAT_PCM,则应将 wBitsPerSample 设置为 8 或 16。 如果 wFormatTag = WAVE_FORMAT_IEEE_FLOAT,则应将 wBitsPerSample 设置为 32。 对于非 PCM 格式,根据制造商的格式标记规范设置此成员的值。 某些压缩方案无法定义 wBitsPerSample 的值。 在这种情况下,请将 wBitsPerSample 设置为零。

cbSize

指定追加到 WAVEFORMATEX 结构末尾的额外格式信息的大小(以字节为单位)。 非 PCM 格式可以使用此信息来存储 wFormatTag 的额外属性。 如果 wFormatTag 不需要额外的信息,请将此成员设置为零。 对于WAVE_FORMAT_PCM格式,客户端应忽略此成员 (其值为隐式零) 。 由于所有客户端可能都未遵循此规则,因此建议将 cbSize 初始化为WAVE_FORMAT_PCM格式。

注解

WAVEFORMATEX 结构只能描述由 WAVEFORMATEXTENSIBLE 结构描述的格式的子集。 例如,WAVEFORMATEX 可以描述单声道或 (双声道) 立体声脉冲代码调节 (具有 8 位或 16 位整数样本值或 32 位浮点样本值的 PCM) 流。 此外,WAVEFORMATEX 可以描述常用的非 PCM 格式,例如 AC-3 和 WMA Pro。

WAVEFORMATEX 可以明确描述单声道或立体声 PCM 格式,每个样本的有效位数与样本容器大小相同。 若要描述具有两个以上声道的 PCM 格式,需要使用 WAVEFORMATEXTENSIBLE,该格式具有一个通道掩码来指定扬声器配置 (即将通道映射到物理扬声器位置) 。 例如,为了描述每个样本的有效位数小于样本容器大小 (的 PCM 格式,存储在三字节容器) 中的 20 位样本需要 WAVEFORMATEXTENSIBLE,它同时指定有效样本位数和样本容器大小。

WAVEFORMATEX 可以描述头文件 Mmreg.h 中为其定义了 16 位格式标记的非 PCM 格式, (例如,WAVE_FORMAT_MPEG) 。 WAVEFORMATEX 的 wFormatTag 成员包含格式标记。 指定一种非 PCM 格式,该格式标记未在 Mmreg.h 中由 WAVEFORMATEXTENSIBLE 结构定义,该结构包含标识格式的 GUID。 如有必要,硬件供应商可以独立生成 GUID 值来标识新格式。 不需要向 Microsoft 注册 GUID。

有关 WAVEFORMATEX 和 WAVEFORMATEXTENSIBLE 之间的差异的详细信息,请参阅 Extensible Wave-Format 描述符

wFormatTag 成员设置为 Mmreg.h 中定义的波形格式标记之一。 下表列出了一些更常见的非特权格式的标记。

wFormatTag 值 含义
WAVE_FORMAT_PCM PCM (整数格式的脉冲代码调节) 数据。
WAVE_FORMAT_IEEE_FLOAT 采用 IEEE 浮点格式的 PCM 数据。
WAVE_FORMAT_DRM 受 Microsoft 数字版权管理) 保护的数字音频内容的 DRM 编码格式 (。
WAVE_FORMAT_EXTENSIBLE 可扩展 WAVEFORMATEX 结构 (请参阅 WAVEFORMATEXTENSIBLE) 。
WAVE_FORMAT_ALAW A-law 编码格式。
WAVE_FORMAT_MULAW Mu-law 编码格式。
WAVE_FORMAT_ADPCM ADPCM (自适应差分脉冲代码调节) 数据。
WAVE_FORMAT_MPEG MPEG-1 数据格式 (流符合 ISO 11172-3 音频规范) 。
WAVE_FORMAT_DOLBY_AC3_SPDIF AC-3 (又名 Dolby Digital) over S/PDIF。
WAVE_FORMAT_WMASPDIF Windows Media Audio (WMA) Pro over S/PDIF。
 

有关WAVE_FORMAT_Xxx 格式的完整列表,请参阅 Mmreg.h。

WAVEFORMATEX 几乎与 PCMWAVEFORMAT 结构相同,后者是用于指定 PCM 格式的过时结构。 唯一的区别是 WAVEFORMATEX 包含 cbSize 成员,而 PCMWAVEFORMAT 不包含。 按照约定,当 wFormatTag = WAVE_FORMAT_PCM (时应忽略 cbSize,因为 cbSize) 隐式为零。 此约定允许驱动程序软件在 PCM 格式的情况下以相同的方式处理 WAVEFORMATEX 和 PCMWAVEFORMAT 结构。 有关 PCMWAVEFORMAT 的详细信息,请参阅Microsoft Windows SDK文档。

如果 wFormatTag = WAVE_FORMAT_PCM 或 wFormatTag = WAVE_FORMAT_IEEE_FLOAT,请将 cbSize 设置为零。 对于 wFormatTag 的所有其他值, cbSize 指定追加到 WAVEFORMATEX 结构的附加格式数据的字节数。

如果 wFormatTag = WAVE_FORMAT_EXTENSIBLE,请将 cbSize 设置为 sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX) 加上追加到 WAVEFORMATEXTENSIBLE 结构的任何特定于格式的数据的大小。

要求

   
标头 mmreg.h (包括 mmsystem.h、mmreg.h、mmsystem.h)

另请参阅

WAVEFORMATEXTENSIBLE