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

实际项目中出现实时在线音频播放会有累加延时的问题,越久延时越长。

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

比如本来应该是每秒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采样率

				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

	if (NULL != m_pSt)
	{
		speex_preprocess_state_destroy(m_pSt);
		m_pSt = NULL;
	}



你可能感兴趣的:(音频编程)