我正在开发一个程序的音频代码,需要能够在各种设备上录制和回放,其中一些是高端的,具有各种不同的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_SHARED或AUDCLNT_SHAREMODE_EXCLUSIVE以外的值”时返回。我正在通过AUDCLNT_SHAREMODE_SHARED。这似乎是文档中的一个错误。
为了实验,当我尝试的时候,这个谜团变得更加神秘:
hr = pTakeAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, &waveFormatEx, NULL);返回的错误是0x8889000e -我找不到对该错误的引用。我们将非常感谢您所能提供的任何帮助,即使是“使用MMSystem”。如果不是我们需要在有多个设备的情况下控制播放设备,我会从MMSystem开始。
发布于 2012-11-19 01:40:33
0x8889000e = AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED (HRESULT reading utility),这在很大程度上说明了原因:此格式不适用于独占模式音频客户端。你可能不需要独占,共享模式可能就足够好了。无论如何,要通过WASAPI录制和回放,您需要协商硬件支持的格式,这通常是PCM音频格式之一。
要在格式之间进行转换,您可以使用几种API (ACM、DirectShow、Media Foundation)。一些API,如DirectShow和Media Foundation,将能够将播放的数据自动转换为支持的格式,也可以通过音频设备播放。
发布于 2017-06-22 03:44:47
我知道这是一个非常老的帖子,但是这种情况显然已经得到了改善,尽管在提出问题时可能已经有了这个选项,但我不确定(而且文档,就像大多数微软的东西一样,通常没有太大帮助)。
无论如何,根据我的经验,假设你想使用标准的PCM音频,关键因素似乎是你所要求的采样率。大多数声卡在这方面似乎不会接受任何与他们的“混合格式”(这是为共享音频模式)报告的内容不同的内容。因此,您可以接受该卡的采样率,并以该采样率发送所有内容,如果这对您来说是一个可行的选择,或者您可以根据需要请求音频驱动程序在您的输出链中插入一个转换器。
最简单的方法是在发出Initialize()调用时使用AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM标志,这将执行我所说的操作,并将您请求的任何源音频格式转换为设备支持的格式。似乎甚至可以使用IAudioClockAdjustment::SetSampleRate动态更改SR,但我自己从未尝试过。请看一下this page中的不同标志,以了解更多信息。
https://stackoverflow.com/questions/12994567
复制相似问题