gpt4 book ai didi

windows - WASAPI 的问题

转载 作者:可可西里 更新时间:2023-11-01 09:30:30 27 4
gpt4 key购买 nike

我正在为需要能够在各种设备上录制和播放的程序开发音频代码,其中一些是高端设备,具有各种不同的 wav 和 AIFF 格式。我希望能够使用 WASAPI 库,但我遇到了一些主要问题。目前最大的问题是,据我所知,设备只允许播放格式完全匹配的流。

这就是我正在做的 - 我设置设备(这里我只是获取默认控制台设备):

hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pPlaybackDevice);

我激活设备:

hr = pPlaybackDevice->Activate( __uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pTakeAudioClient);

然后我检查混合格式:

hr = pTakeAudioClient->GetMixFormat(&pWaveFormatEx);

但是,如果我在调用 Initialize 时使用不同的格式:

hr = pTakeAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST,hnsRequestedDuration, 0, pAnotherWaveFormatEx,NULL);

我得到一个错误。看起来文件绝对必须采用 GetMixFormat 返回的格式。如果我调用 IsFormatSupported 来了解我可以提交哪些格式:

hr = pTakeAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_SHARED, &waveFormatEx, &pAnotherWaveFormatEx);

我得到 E_INVALIDARG,即使两个结构完全相同。根据 WASAPI 文档,当“参数 ShareMode 的值不是 AUDCLNT_SHAREMODE_SHAREDAUDCLNT_SHAREMODE_EXCLUSIVE 时,就会返回。”我正在传递 AUDCLNT_SHAREMODE_SHARED。这似乎是文档中的错误。

当我为了实验而尝试时,谜团加深了:

hr = pTakeAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, &waveFormatEx, NULL);

返回的错误是 0x8889000e - 我无法找到对该错误的引用。您可以提供的任何帮助都将非常感激,即使是“使用 MMSystem”。我会从 MMSystem 开始,除非我们需要能够在有多个设备时控制播放设备。

最佳答案

0x8889000e = AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED ( HRESULT reading utility ),这几乎说明了原因:这种格式不适用于独占模式音频客户端。而且您可能不需要它独占,共享模式可能就足够了。无论如何,要通过 WASAPI 进行录制和播放,您需要协商一种硬件支持的格式,通常是 PCM 音频格式之一。

要在格式之间进行转换,您可以使用多种 API(ACM、DirectShow、Media Foundation)。 DirectShow 和 Media Foundation 等一些 API 将能够将播放的数据自动转换为支持的格式,并通过音频设备播放。

关于windows - WASAPI 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12994567/

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