我正在尝试使用WASAPI捕获音频。我的代码主要基于ChatterBox VoIP sample app。我正在获取音频缓冲区,但它们都是静音的(标记为AUDCLNT_BUFFERFLAGS_SILENT)。
我正在使用Visual Studio Express 2012 for Windows Phone。在模拟器上运行。
答案 0 :(得分:3)
我遇到了完全相同的问题,并设法在ChatterBox示例应用程序中重现它,如果我将Visual Studio设置为本机调试并且在任何时候逐步完成代码。
此外,关闭应用程序而不通过“停止”过程并停止AudioClient将要求您重新启动模拟器/设备,然后才能再次捕获音频数据。
在我弄清楚前面提到的问题之前,它几乎让我疯了,但我终于让它运转了。
所以.. 1.务必不要进行本机调试 2.始终调用IAudioClient-> Stop();在终止应用程序之前。 3.确保将正确的参数传递给IAudioClient-> Initialize();
我已经包含了一段代码,它可以100%的时间为我工作。为了清晰起见,我省略了错误检查。
LPCWSTR pwstrDefaultCaptureDeviceId =
GetDefaultAudioCaptureId(AudioDeviceRole::Communications);
HRESULT hr = ActivateAudioInterface(pwstrDefaultCaptureDeviceId,
__uuidof(IAudioClient2), (void**)&m_pAudioClient);
hr = m_pAudioClient->GetMixFormat(&m_pwfx);
m_frameSizeInBytes = (m_pwfx->wBitsPerSample / 8) * m_pwfx->nChannels;
hr = m_pAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED,
AUDCLNT_STREAMFLAGS_NOPERSIST | AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
latency * 10000, 0, m_pwfx, NULL);
hr = m_pAudioClient->SetEventHandle(m_hCaptureEvent);
hr = m_pAudioClient->GetService(__uuidof(IAudioCaptureClient),
(void**)&m_pCaptureClient);
就是这样..在调用这段代码之前,我已经启动了一个工作线程,它将监听m_hCaptureEvent并调用IAudioCaptureClient-> GetBuffer();每当触发捕获事件时。
当然使用Microsoft.XNA.Audio.Microphone可以正常工作,但它并不总是引用XNA框架的选项.. :)
答案 1 :(得分:1)
这是一个非常烦人的问题,浪费了我整整2天。通过将AudioClientProperties.eCatagory
设置为AudioCategory_Communications
而不是AudioCategory_Other
来解决我的问题。
经过这么长的尝试和错误期后,我不确定问题将来不会重复,因为API不会非常稳定,每次运行都可能会返回不同的结果。
编辑:是的,我的猜测是真的。重新启动wp模拟器会使缓冲区再次静音。但是将AudioClientProperties.eCatagory
更改回AudioCategory_Other
再次解决它。我仍然不知道有什么问题它和最终的解决方案是什么。
我再次遇到同样的问题,这次评论(删除)
properties.eCategory = AudioCategory_Communications;
解决问题。
答案 2 :(得分:1)
我可以为Windows Phone 8.1添加我的建议。 我做了以下实验。
然后我用AudioDeviceRole :: Communications打开捕获设备,捕获设备一直工作正常。
对于Windows 10,捕获设备始终有效,无论您是否使用AudioDeviceRole :: Communications打开它。
答案 3 :(得分:0)
我遇到了同样的问题。您似乎只能使用AudioCategory_Other
或创建VoipPhoneCall
的实例,并且只能使用AudioCategory_Communications
。
因此,我的解决方案是使用AudioCategory_Communications
并创建传出VoipPhoneCall
。您应该像Chatterbox VoIP sample app中一样实施后台代理,以使VoipCallCoordinator
正常工作。