社区活动专版
直播中

jf_1137202360

8年用户 1359经验值
擅长:嵌入式技术
私信 关注

【RTC程序设计:实时音视频权威指南】传输控制优化阅读 及其实践分享

书中
第八章 传输控制优化,主要介绍了拥塞控制,弱网降级,抖动缓存与平滑发送,错误恢复等几个部分的内容。
其中抖动缓存与平滑发送是非常重要的一部分,在实践中是保证音视频实时不断流的传输是必须应用的,所以结合个人在UAC的开发中实践,结合书中介绍,分享下该部分内容。

个人从UAC实时音频传输开发来看,抖动缓存与均衡发送是最重要的部分,比必须实现的。
因为实时音视频传输,实际是一个生产者-消费者模型。生产者和消费者的长时间整体看速率是一样的,但是局部上看可能有波动。在某个小的时间点生产和消费者的速率可能不一样,所以必须要有一个缓存水池来缓解这种局部的不均衡。


这个水池设计的越大则越能缓解这种抖动的剧烈程度。

而在实践应用中知道,除了设计以上缓存外,还需要注意抖动,
即水池中一定要保证有一定的水量才开始消费,否则产生一个就消费一个,但是产生和消费的时间可能有差异导致断流。



如下,可以等水池中有了生产了两项之后再消费,这样,后面每次消费时都能保证有数据不会断流(只要生产消费的抖动不超过2项的时间),如果抖动更大可以延迟更长时间再消费,同时也要增大缓存大小。
以下是个人在UAC项目中使用状态机对这个延迟的处理
s_out_fifo_pool_state记录当前状态,0表示还未满足达到指定数量5的数据不开始取数,

达到5设置为1表示此时开始取数,取数后如果取不到数了则恢复0状态。

  1. /* 最开始时最少要有两份才读数据,避免抖动 */
  2. static int s_out_fifo_pool_state = 0;  /* 0表示还没开始发送 1表示已经开始发送 */
  3.     if(s_out_fifo_pool_state == 0)
  4.     {
  5.         if(poolnum < 5)
  6.         {
  7.             return 0;  /* 刚开始最少要2份才开始获取 */
  8.         }
  9.         else
  10.         {
  11.             s_out_fifo_pool_state = 1;
  12.         }
  13.     }
  14.     else
  15.     {
  16.         if(poolnum < 1)
  17.         {
  18.             s_out_fifo_pool_state = 0;  /* 无数据回到初始状态等待积蓄到2份 */
  19.             return 0;
  20.         }
  21.         else
  22.         {
  23.             /* 有至少1份数据,可以获取 */
  24.         }
  25.     }

更多回帖

发帖
×
20
完善资料,
赚取积分