實時線上音訊延時的處理(借用speex)
阿新 • • 發佈:2019-01-03
實際專案中出現實時線上音訊播放會有累加延時的問題,越久延時越長。
經過各方面檢查發現是裝置傳送音訊資料頻率不穩定產生的:
比如本來應該是每秒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取樣率
碰到靜音或噪聲幀時判斷下快取資料長度是否比較長,及已經播放完可用的幀是否很少(即等待播放的幀比較多,這裡總共有30快,小於5表示還有25快在等待播放)。<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; } }
用完記得釋放speex
<span style="white-space:pre"> </span>if (NULL != m_pSt)
{
speex_preprocess_state_destroy(m_pSt);
m_pSt = NULL;
}