您的位置:首页 > 其它

实时在线音频延时的处理(借用speex)

2016-01-19 21:01 323 查看
实际项目中出现实时在线音频播放会有累加延时的问题,越久延时越长。

经过各方面检查发现是设备发送音频数据频率不稳定产生的:

比如本来应该是每秒5包音频包的数据过来的,但是某一秒设备没把数据及时发过来,造成这一秒内没数据播放,但是下秒又多了数据,但是播放速度是固定的,所以相当于延时了一秒,这种情况出现多了延时就会变长。

后来分析了下网络出现这种情况比较常见,特别这个项目是用3G网络可能性还是蛮大的。

解决方法是利用speex判断静音及噪音帧,在延时的情况下丢弃静音及噪音帧,不播放赶上本来的进度

m_pSt = speex_preprocess_state_init(L_FRAME, 8000);

iParam = 1;
speex_preprocess_ctl(m_pSt, SPEEX_PREPROCESS_SET_VAD, &iParam); //静音检测

L_FRAME是帧的长度,单位为short,所以是L_FRAME*2字节
8000采样率

<span style="white-space:pre"> </span>vad = speex_preprocess_run(m_pSt, pcmFrame);

if (0 == vad)
{
//静音或噪声
dif = m_decodingBuf.endPos - startPos;
if (480 < dif || (0 > dif && 480 < m_decodingBuf.maxLen + dif) )
{
continue;
}
else if (5 > m_block.freeblock)
{
continue;
}
}碰到静音或噪声帧时判断下缓存数据长度是否比较长,及已经播放完可用的帧是否很少(即等待播放的帧比较多,这里总共有30快,小于5表示还有25快在等待播放)。

用完记得释放speex

<span style="white-space:pre"> </span>if (NULL != m_pSt)
{
speex_preprocess_state_destroy(m_pSt);
m_pSt = NULL;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: