我正在开发VoIP应用程序,需要播放服务器每20毫秒发送一次的RTP数据包数据.
我有一个缓冲区,可以累积来自RTP数据包的样本.音频单元渲染回调从此缓冲区读取数据.
问题是我无法将音频单元与RTP流同步.首选IO缓冲区持续时间不能精确设置为20 ms.并且渲染回调请求的帧数也不能设置为数据包的样本数.
因此,有两种可能的情况(取决于采样率和IO缓冲持续时间):
a)音频单元从我的缓冲区读取的速度比从RTP数据包填充的速度快;在这种情况下,缓冲区周期性地不包含所请求的样本数量,并且我得到失真的声音;
b)缓冲区的填充速度比音频单元的读取速度快;在这种情况下,缓冲区周期性地溢出,并且来自新RTP分组的样本丢失.
我该怎么做才能避免这个问题?
最佳答案 如果您可以控制数据包速率,则通常通过“漏桶”算法来完成.循环FIFO /缓冲区可以保存输入数据的“桶”,并且需要在FIFO /缓冲区中保留一定量的填充以覆盖网络速率和延迟的变化.如果存储桶太满,则要求数据包发送方减速等.
在音频回放端,如果超过足够的缓冲器填充阈值,则可以使用各种音频隐藏方法(PSOLA时间间距修改等)来略微拉伸或收缩数据以适应.