首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WASAPI GetNextPacketSize何时返回0

WASAPI GetNextPacketSize何时返回0
EN

Stack Overflow用户
提问于 2016-11-14 10:46:51
回答 1查看 497关注 0票数 1

MSDN上WASAPI捕获的示例代码循环,直到GetNextPacketSize返回0。我只想知道这会在什么时候发生:

  1. 如果麦克风上有静音会发生吗?(在这种情况下,如果我一直在麦克风上制造噪音,它会无限循环吗?)
  2. 这取决于一些音频捕获的基本概念,这是我所缺少的(我对音频API非常陌生:)。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-17 07:14:18

API帮助确定要捕获的数据缓冲区的大小,这样API客户端就不需要猜测或分配多馀的缓冲区等等。当还没有要捕获的数据时,API将返回零(不是单个帧)。这可能发生在正在进行的音频捕获会话中,当/如果您过早调用API时,并且由于仍然可以生成新的数据,调用方基本上希望稍后再试一次。

在某些情况下,零返回可能表示流的结束。具体来说,如果您从回送设备捕获,并且没有活动的回放会话可以生成用于回送的数据,捕获API可能会一直不传递数据,直到新的回放会话出现。

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

外部循环一直运行,直到接收器通过bDone变量通过捕获结束事件.这里有一个陷阱,根据示例代码,内循环可能会滚动而不进入外部循环,并且捕获没有正确停止。该示例假设接收器处理数据的速度足够快,以便内部循环可以处理所有当前可用的数据,并释放出来以到达Sleep调用。也就是说,WASAPI调用都是非阻塞的,假设这些循环运行得相当快,其思想是音频数据的处理速度比捕获的要快,并且循环将大部分线程时间用于Sleep调用。也许不是初学者最好的示例代码。您也可以通过检查内部循环中的bDone来改进这一点,以使其更可靠。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40586895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档