webrtc windows api音频采集总结

来源:互联网 发布:golang chan 编辑:程序博客网 时间:2024/04/23 20:00

最近看了一下webrtc中音频采集部分代码,重点查看了采用windows api接口的实现方式。

代码文件名称:audio_device_wave_win.cc 和audio_device_wave_win.h

AudioDeviceWindowsWave类中创建了一个线程,线程调用函数为ThreadFunc,并在其中调用ThreadProcess函数,线程的调用通过_timeEvent事件进行控制,而_timeEvent中通过timer触发线程的周期性调用,周期为TIMER_PERIOD_MS = 2,说明为2ms调用1次。同时为了对声卡音量进行设置,创建2个线程分别设置音量和获取音量,线程函数为:GetCaptureVolumeThread()和 SetCaptureVolumeThread。也采用事件驱动方式实现。

异常处理:

 如果timer两次调用间隔超过7ms,且连续多次出现,则说明可能有异常发生,则对timer进行重置。

对播放的处理:

如果连续两次播放间隔超过某一门限(5ms), 则进入PlayProc()接口,获取播放buffer中当前没有播放的数据长度,即播放延时。根据此播放延时,自动调整播放缓冲区的延时值(_minPlayBufDelay,_playBufDelay和_waitCounter).

当播放buffer中数据少于某门限值时,从JBM中获取一帧数据,并将从JBM中获取的数据写入声卡buffer.

当播放buffer中数据超过某门限值时,则不从JBM中获取数据.

在20s后,buffer大小已经比较稳定时,则自适应降低播放缓冲区大小( _playBufDelay = _minPlayBufDelay;).当播放延时超过150ms时,则限制播放延时不超过150ms。以此避免播放延时过大.

可以看出,这种设计方法能够最大程度上缩小端到端音频通话的延时。假设帧长为20ms,JBM有40ms延时,声卡采集10ms延时,声卡播放10ms延时,那么端到端的延时则为:20+10+2+40+10 = 82ms,如果帧长为10ms,那么端到端的延时可以做到更小。

应该说webrtc的这种设计应该是保证端到端延时最小的一种很好的参考设计。

1 0
原创粉丝点击