WASAPI捕获缓冲区大小

时间:2013-12-04 09:04:45

标签: audio windows-phone-8 wasapi audio-capture

我在wp8中使用WASAPI。因为我每次返回不同大小的缓冲区时都在共享模式下使用Getbuffer方法。我在8000Hz / 16bit捕获,有时Getbuffer返回80个样本的缓冲区有时候有400个样本和。这是一个正常的行为,而向IAudioClient::Initialize发送不同的hnsBufferDuration对缓冲区大小没有任何影响吗?

2 个答案:

答案 0 :(得分:2)

是的,这是正常行为。我不是特别了解Windows手机,但至少在Windows桌面上这是共享模式捕获的方式,所以我怀疑它在wp8上并没有什么不同。在处理WASAPI捕获缓冲区时,您应该注意3件事情。

  • 在IAudioClient :: Initialize中指定为hnsBufferDuration的缓冲区的总大小。 WASAPI将创建一个请求大小或更大的缓冲区。调用IAudioClient :: GetBufferSize以获取实际的总缓冲区大小。

  • 周期性(也是IAudioClient :: Initialize的参数)。此参数指定WASAPI处理缓冲区的频率,例如,您可以设置30 ms缓冲区,WASAPI每3 ms处理一次缓冲区。周期性仅用于独占模式。

  • 数据包大小,这是您正在处理的内容。发生的事情是内部WASAPI缓冲区的大小实际上没有变化(这是GetBufferSize报告的那个),它只是处理不同大小的小部分。

如果您想事先知道下一个块的大小,请调用IAudioCaptureClient :: GetNextPacketSize(仅在共享模式下工作)。如果您只想预先分配自己的缓冲区,那么您不必在每次调用GetBuffer时重新分配,您只需设置自己的缓冲区,其大小与IAudioClient :: GetBufferSize相同。

答案 1 :(得分:2)

作为documented on MSDN

  

IAudioClient::Initialize方法分配缓冲区。客户端   指定hnsBufferDuration参数值中的缓冲区长度   它传递给Initialize方法。 [...]

     

对于捕获客户端,缓冲区长度确定   音频引擎可以从中读取的最大捕获数据量   单个处理过程中的端点缓冲区。客户应该   调用Initialize后,总是调用GetBufferSize 确定   已分配缓冲区的实际大小可能与不同   要求的尺寸。

API以对捕获层有意义的方式实现它,并以最小的API开销为目标。它没有任何理由在内部累积数据。如果您需要固定大小的缓冲区,则可以自由地将数据堆积在您管理的缓冲区中。