gpt4 book ai didi

c++ - 从 IAudioClient::GetMixFormat 解释 WAVEFORMATEXTENSIBLE

转载 作者:太空狗 更新时间:2023-10-29 20:35:39 26 4
gpt4 key购买 nike

我正在学习 Windows 核心音频 API。使用这个 Rendering a Stream例如,我发现 IAudioClient::GetMixFormat返回模棱两可的 WAVEFORMATEXTENSIBLE看起来像这样:

Format
wFormatTag = WAVE_FORMAT_EXTENSIBLE (65534)
nChannels = 2
nSamplesPerSec = 48000
nAvgBytesPerSec = 384000
nBlockAlign = 8
wBitsPerSample = 32
cbSize = 22
Samples // this is a union
wValidBitsPerSample = 32
wSamplesPerBlock = 32
wReserved = 32

因为 Format.cbSize 是 22,所以这是整个结构;没有 SubFormat GUID 来提供有关示例的更多信息。这看起来很奇怪,因为格式标记是 WAVE_FORMAT_EXTENSIBLE,我认为这意味着您必须依赖 Subformat GUID 来确定实际格式。

我可以看到有两个 channel 的 32 位样本。如何确定这些样本是整数还是浮点值?

[标签显然是针对 Apple API 的。 Windows Core Audio 是否有不同的标签?]

最佳答案

22 是 WAVEFORMATEX 之后的附加数据的大小数据:

cbSize

Size, in bytes, of extra format information appended to the end of the WAVEFORMATEX structure. This information can be used by non-PCM formats to store extra attributes for the wFormatTag. If no extra information is required by the wFormatTag, this member must be set to 0. For WAVE_FORMAT_PCM formats (and only WAVE_FORMAT_PCM formats), this member is ignored. When this structure is included in a WAVEFORMATEXTENSIBLE structure, this value must be at least 22.

如果您查看 WAVEFORMATEXTENSIBLE 的定义,它以 WAVEFORMATEX 开头,然后包含额外的数据:

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

WAVEFORMATEX 数据后至少有 22 个字节。

SubFormat 字段包含您要查找的格式值。

关于c++ - 从 IAudioClient::GetMixFormat 解释 WAVEFORMATEXTENSIBLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41876857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com