兄弟萌啊,使用wasapi获取音频数据时使用GetMixFormat获取的wFormatTag等于65534是什么类型啊,如何我手动指定音频格式啥的再初始化就会报错,E_INVALIDARG,参数 pFormat 指向无效的格式说明,有兄弟知道的吗
该回答内容部分引用GPT,GPT_Pro更好的解决问题
如果wFormatTag等于65534,这表明你正在使用的是一种未知的音频格式。在这种情况下,你可以分析pFormat结构中的变量,以获取确切的音频格式。
WAVEFORMATEX * pFormat;
// 获取pFormat
GetMixFormat(&pFormat);
DWORD wFormatTag = pFormat->wFormatTag;
// 如果wFormatTag等于65534,表示正在使用未知音频格式
if (wFormatTag == 65534){
// 分析pFormat结构中的变量,以获取确切的音频格式
DWORD nSamplesPerSec = pFormat->nSamplesPerSec; // 采样率
WORD wBitsPerSample = pFormat->wBitsPerSample; // 比特率
WORD nChannels = pFormat->nChannels; // 通道数
WORD nBlockAlign = pFormat->nBlockAlign; // 块对齐
DWORD cbSize = pFormat->cbSize; // 比特率大小
// 根据以上信息,可以定义自己想要的WAVEFORMATEX结构体,然后进行初始化。
WAVEFORMATEX waveformatex;
waveformatex.wFormatTag = WAVE_FORMAT_PCM; // 音频格式
waveformatex.nSamplesPerSec = nSamplesPerSec; // 采样率
waveformatex.wBitsPerSample = wBitsPerSample; // 比特率
waveformatex.nChannels = nChannels; // 通道数
waveformatex.nBlockAlign = nBlockAlign; // 块对齐
waveformatex.cbSize = cbSize; // 比特率大小
// 调用函数初始化
Initialize(&waveformatex); // &waveformatex为初始化函数的参数
}
如上代码所述,通过分析pFormat结构中的变量,我们可以获得采样率、比特率、通道数、块对齐、比特率大小信息,并将其用于定义WAVEFORMATEX 结构体,然后再初始化即可。
如果回答有帮助,望采纳。
该回答引用GPTᴼᴾᴱᴺᴬᴵ
当使用 IMMDevice::Activate 方法打开音频设备时,如果请求的数据流格式没有明确指定,那么会使用设备的默认数据流格式,这个默认格式的参数由 GetMixFormat 方法返回的 WAVEFORMATEXTENSIBLE 结构体指定。如果 WAVEFORMATEXTENSIBLE 结构体中的 wFormatTag 字段等于 65534(即 0xFFFE),那么这表示数据流格式是基于压缩的流式音频格式,称为扩展可变长度压缩格式(Extended and Variable-Length Compression Format,简称 EXtensible Varying-Length Compression Format,简称XVID)。
-
XVID 格式是一种用于压缩音频的格式,其中包括了一个 128 位的 GUID 用于标识该格式的详细参数。因为其可扩展性和可变长度,因此该格式可以适应多种压缩技术和音频编码格式。
-
如果你希望手动指定音频格式,可以使用 IAudioClient::Initialize 方法中的 pFormat 参数来指定。在这种情况下,你需要使用有效的格式参数。如果你指定了无效的参数,则会发生 E_INVALIDARG 错误。你可以使用 WAVEFORMATEXTENSIBLE 结构体的成员来设置特定的格式参数,并将其传递给 Initialize 方法的 pFormat 参数。例如,以下代码演示如何初始化 WAVEFORMATEXTENSIBLE 结构体,以指定 PCM 16 位、44.1 kHz、2 个通道的音频格式:
WAVEFORMATEXTENSIBLE wfx = { 0 };
wfx.Format.wFormatTag = WAVE_FORMAT_PCM;
wfx.Format.nChannels = 2;
wfx.Format.nSamplesPerSec = 44100;
wfx.Format.nAvgBytesPerSec = 44100 * 2 * 2;
wfx.Format.nBlockAlign = 2 * 2;
wfx.Format.wBitsPerSample = 16;
wfx.Format.cbSize = 0;
wfx.Samples.wValidBitsPerSample = 16;
wfx.dwChannelMask = KSAUDIO_SPEAKER_STEREO;
如果你需要使用自定义的音频格式,那么你需要仔细了解该格式的参数,并正确地设置 WAVEFORMATEXTENSIBLE 结构体的成员。