我在wp8中使用WASAPI。因为我每次返回不同大小的缓冲区时都在共享模式下使用Getbuffer
方法。我在8000Hz / 16bit捕获,有时Getbuffer
返回80个样本的缓冲区有时候有400个样本和。这是一个正常的行为,而向IAudioClient::Initialize
发送不同的hnsBufferDuration对缓冲区大小没有任何影响吗?
答案 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)
IAudioClient::Initialize
方法分配缓冲区。客户端 指定hnsBufferDuration参数值中的缓冲区长度 它传递给Initialize方法。 [...]对于捕获客户端,缓冲区长度确定 音频引擎可以从中读取的最大捕获数据量 单个处理过程中的端点缓冲区。客户应该 调用Initialize后,总是调用
GetBufferSize
确定 已分配缓冲区的实际大小,可能与不同 要求的尺寸。
API以对捕获层有意义的方式实现它,并以最小的API开销为目标。它没有任何理由在内部累积数据。如果您需要固定大小的缓冲区,则可以自由地将数据堆积在您管理的缓冲区中。