WASAPI GetNextPacketSize何时返回0

时间:2016-11-14 10:46:51

标签: audio audio-recording wasapi

sample code of WASAPI capture on MSDN,循环直到GetNextPacketSize返回0。 我只想了解这种情况何时会发生:

  1. 如果麦克风上注册了静音,是否会发生? (在这种情况下,如果我继续在麦克风上发出声音,它会无限循环吗?)
  2. 这取决于我缺少的一些音频捕获基本概念(我对音频API很新:))。

1 个答案:

答案 0 :(得分:1)

API有助于确定要捕获的数据缓冲区的大小,以便API客户端不需要猜测或分配具有多余的缓冲区等。当没有要捕获的数据时,API将返回零(不是单帧)。如果您过早地调用API,可能会在正在进行的音频捕获会话中发生这种情况,并且由于仍然可以生成新数据,因此基本上可以在稍后再次尝试调用者。

在某些情况下,零返回可能表示流的结束。具体来说,如果从环回设备捕获并且没有可以为环回传递生成数据的活动回放会话,则捕获API可能会在新回放会话出现之前不会提供任何数据。

示例代码循环与Sleep调用一起检查零数据包大小。这种方式循环期望在休眠时间期间产生至少一些数据,并且在连续产生音频数据的正常条件下,在外环内每次第一次调用都不返回零长度。内部循环尝试尽可能多地读取非空缓冲区,直到零表示已准备好交付的所有数据已经​​返回给客户端。

外部循环继续运行,直到接收器通过bDone变量传递捕获结束事件。这里有一个问题,根据示例代码,内部循环可能在某种程度上滚动而不会破坏外部循环 - 并且捕获未正确停止。该示例假设接收器处理数据的速度足够快,以便内部循环可以处理所有当前可用的数据并突破以达到Sleep调用。也就是说,WASAPI调用都是非阻塞的,并且假设这些循环运行得非常快,我们认为音频数据的处理速度比捕获的快,并且循环花费的大部分时间都在{{1}打电话。也许不是初学者的最佳示例代码。您也可以通过检查内循环中的Sleep来改善这一点,以使其更可靠。