實時在線音頻延時的處理(借用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採樣率

<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;
	}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章