书中
第八章 传输控制优化,主要介绍了拥塞控制,弱网降级,抖动缓存与平滑发送,错误恢复等几个部分的内容。
其中抖动缓存与平滑发送是非常重要的一部分,在实践中是保证音视频实时不断流的传输是必须应用的,所以结合个人在UAC的开发中实践,结合书中介绍,分享下该部分内容。
个人从UAC实时音频传输开发来看,抖动缓存与均衡发送是最重要的部分,比必须实现的。
因为实时音视频传输,实际是一个生产者-消费者模型。生产者和消费者的长时间整体看速率是一样的,但是局部上看可能有波动。在某个小的时间点生产和消费者的速率可能不一样,所以必须要有一个缓存”水池”来缓解这种局部的不均衡。
这个水池设计的越大则越能缓解这种抖动的剧烈程度。
而在实践应用中知道,除了设计以上缓存外,还需要注意抖动,
即水池中一定要保证有一定的水量才开始消费,否则产生一个就消费一个,但是产生和消费的时间可能有差异导致断流。
如下,可以等水池中有了生产了两项之后再消费,这样,后面每次消费时都能保证有数据不会断流(只要生产消费的抖动不超过2项的时间),如果抖动更大可以延迟更长时间再消费,同时也要增大缓存大小。
以下是个人在UAC项目中使用状态机对这个延迟的处理
s_out_fifo_pool_state记录当前状态,0表示还未满足达到指定数量5的数据不开始取数,
达到5设置为1表示此时开始取数,取数后如果取不到数了则恢复0状态。
- /* 最开始时最少要有两份才读数据,避免抖动 */
- static int s_out_fifo_pool_state = 0; /* 0表示还没开始发送 1表示已经开始发送 */
- if(s_out_fifo_pool_state == 0)
- {
- if(poolnum < 5)
- {
- return 0; /* 刚开始最少要2份才开始获取 */
- }
- else
- {
- s_out_fifo_pool_state = 1;
- }
- }
- else
- {
- if(poolnum < 1)
- {
- s_out_fifo_pool_state = 0; /* 无数据回到初始状态等待积蓄到2份 */
- return 0;
- }
- else
- {
- /* 有至少1份数据,可以获取 */
- }
- }