WAVEFORMATEXTENSIBLE 结构 (mmreg.h)

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

WAVEFORMATEXTENSIBLE 结构定义波形音频数据的格式,这些格式具有两个以上的通道或高于 WAVEFORMATEX 允许的采样分辨率。 它还可用于定义由 WAVEFORMATEX 定义的任何格式。

语法

typedef struct {
  WAVEFORMATEX Format;
  union {
    WORD wValidBitsPerSample;
    WORD wSamplesPerBlock;
    WORD wReserved;
  } Samples;
  DWORD        dwChannelMask;
  GUID         SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;

成员

Format

指定基本格式的 WAVEFORMATEX 结构。 wFormatTag 成员必须WAVE_FORMAT_EXTENSIBLE。 cbSize 成员必须至少为 22。

Samples

描述示例格式的联合。

Samples.wValidBitsPerSample

信号中的精度位数。 通常等于 WAVEFORMATEX.wBitsPerSample。 但是, wBitsPerSample 是容器大小,必须是 8 的倍数,而 wValidBitsPerSample 可以是任何不超过容器大小的值。 例如,如果格式使用 20 位样本, 则 wBitsPerSample 必须至少为 24,但 wValidBitsPerSample 为 20。

Samples.wSamplesPerBlock

一个压缩的音频数据块中包含的样本数。 此值用于缓冲区估计。 此值用于每个块中样本数固定的压缩格式。 如果每个压缩的音频数据块中包含可变数量的样本,则可以将此值设置为 0。 在这种情况下,需要通过其他方式获取缓冲区估计和位置信息。

Samples.wReserved

保留供操作系统内部使用。 设置为 0。

dwChannelMask

位掩码,用于指定流中通道到说话人位置的分配。

SubFormat

数据的子格式,例如KSDATAFORMAT_SUBTYPE_PCM。 子格式信息类似于 WAVEFORMATEX 结构的 wFormatTag 成员中的 标记所提供的信息。

备注

WAVEFORMATEXTENSIBLE 可以描述 由 WAVEFORMATEX 描述的任何格式,但为两个以上的通道、每个样本的位数以及新的压缩方案提供更高的精度支持。

WAVEFORMATEXTENSIBLE 可以安全地转换为 WAVEFORMATEX,因为它只是配置 由 WAVEFORMATEX.cbSize 指定的额外字节。

dwChannelMask 成员指定多通道流中存在的通道。 最小有效位对应于左前扬声器,下一个最小有效位对应于右前扬声器,依此。 位按重要性顺序进行定义,如下所示。

扬声器位置 标记位
SPEAKER_FRONT_LEFT 0x1
SPEAKER_FRONT_RIGHT 0x2
SPEAKER_FRONT_CENTER 0x4
SPEAKER_LOW_FREQUENCY 0x8
SPEAKER_BACK_LEFT 0x10
SPEAKER_BACK_RIGHT 0x20
SPEAKER_FRONT_LEFT_OF_CENTER 0x40
SPEAKER_FRONT_RIGHT_OF_CENTER 0x80
SPEAKER_BACK_CENTER 0x100
SPEAKER_SIDE_LEFT 0x200
SPEAKER_SIDE_RIGHT 0x400
SPEAKER_TOP_CENTER 0x800
SPEAKER_TOP_FRONT_LEFT 0x1000
SPEAKER_TOP_FRONT_CENTER 0x2000
SPEAKER_TOP_FRONT_RIGHT 0x4000
SPEAKER_TOP_BACK_LEFT 0x8000
SPEAKER_TOP_BACK_CENTER 0x10000
SPEAKER_TOP_BACK_RIGHT 0x20000
 

dwChannelMask 中指定的通道必须按规定顺序存在, (从最低有效位向上) 。 例如,如果只指定SPEAKER_FRONT_LEFT和SPEAKER_FRONT_RIGHT,则左前扬声器的示例必须首先出现在交错流中。 dwChannelMask 中设置的位数应与 WAVEFORMATEX.nChannels 中指定的通道数相同。

为了向后兼容,可由独立 WAVEFORMATEX 结构指定的任何波形格式也可以由 WAVEFORMATEXTENSIBLE 结构定义。 因此,mmreg.h 中的每个波形格式标记都有相应的 SubFormat GUID。 下表显示了一些典型的波形格式标记及其相应的 SubFormat GUID。 这些 GUID 在 Ksmedia.h 中定义。

Wave-Format 标记 SubFormat GUID
WAVE_FORMAT_PCM KSDATAFORMAT_SUBTYPE_PCM
WAVE_FORMAT_IEEE_FLOAT KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
WAVE_FORMAT_DRM KSDATAFORMAT_SUBTYPE_DRM
WAVE_FORMAT_ALAW KSDATAFORMAT_SUBTYPE_ALAW
WAVE_FORMAT_MULAW KSDATAFORMAT_SUBTYPE_MULAW
WAVE_FORMAT_ADPCM KSDATAFORMAT_SUBTYPE_ADPCM
 

由于 WAVEFORMATEXTENSIBLEWAVEFORMATEX 的扩展版本,因此它可以描述不能单独由 WAVEFORMATEX 描述的其他格式。 供应商可以自由定义自己的 SubFormat GUID,以识别不存在波形格式标记的专有格式。

对于特定的扩展格式,以下结构定义为 WAVEFORMATEXTENSIBLE

定义 SubFormat 的值
WAVEFORMATIEEEFLOATEX KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
WAVEFORMATPCMEX KSDATAFORMAT_SUBTYPE_PCM

要求

   
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
标头 mmreg.h

另请参阅

波形音频

波形结构