捕获的音频缓冲区在Windows Phone 8上都是静音的

时间:2013-02-10 10:42:49

标签: windows-phone-8 wasapi windows-phone-voip

我正在尝试使用WASAPI捕获音频。我的代码主要基于ChatterBox VoIP sample app。我正在获取音频缓冲区,但它们都是静音的(标记为AUDCLNT_BUFFERFLAGS_SILENT)。

我正在使用Visual Studio Express 2012 for Windows Phone。在模拟器上运行。

4 个答案:

答案 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添加我的建议。 我做了以下实验。

  1. 打开捕获设备。缓冲区并非沉默。
  2. 使用AudioDeviceRole :: Communications打开渲染设备。缓冲区立即沉默。
  3. 关闭渲染设备。缓冲区并非沉默。
  4. 然后我用AudioDeviceRole :: Communications打开捕获设备,捕获设备一直工作正常。

    对于Windows 10,捕获设备始终有效,无论您是否使用AudioDeviceRole :: Communications打开它。

答案 3 :(得分:0)

我遇到了同样的问题。您似乎只能使用AudioCategory_Other或创建VoipPhoneCall的实例,并且只能使用AudioCategory_Communications

因此,我的解决方案是使用AudioCategory_Communications并创建传出VoipPhoneCall。您应该像Chatterbox VoIP sample app中一样实施后台代理,以使VoipCallCoordinator正常工作。