实际项目中出现实时在线音频播放会有累加延时的问题,越久延时越长。
经过各方面检查发现是设备发送音频数据频率不稳定产生的:
比如本来应该是每秒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) )