2011-05-05 152 views
0

我有一個語音聊天接收rtp數據包(每個數據包包含20ms的語音afaik),將它們添加到緩衝區並播放出去。openAL - 播放緩衝區時發出波濤洶涌的聲音

如果我在緩衝一個數據包後直接調用alSourcePlay()(我有5個緩衝區,並且每個緩衝區都有一個數據包,這些數據包在播放數據包後會被重新使用),因爲它會在另一個數據包到達之前播放緩衝區。

我的問題是你如何處理這個問題,以便音頻不會發生波動?

回答

1

如果您平均每分鐘獲得小於50個20ms的數據包,那麼必須在某個地方暫停。如果您在播放數據包之前暫時存儲數據包,則可以查找自然暫停(靜音),並將間隙與自然暫停相結合,這樣聽起來更自然。你存儲得越多,播放效果越好,但做得太多,延遲會變得不愉快。

你需要的緩衝量是一個品味問題。這是更醜陋,聲音不穩定或響應延遲。我想你將不得不設計它,所以它是一個變量,然後嘗試找到'快樂媒體'

如果你是最短的,每秒10個數據包,然後一個更簡單的方案表明自己:在每個數據包之間放置一個4ms的延遲,這應該是不可檢測的。運行1秒。查看有多少數據包已累計(如果只​​有40個數據包,則該數據包將爲零)調整數據包間延遲以進行補償。繼續。

+0

哦對不起btw我的意思是我得到每秒40-50包LOL:P你需要多少緩衝區不要丟棄數據包,因爲緩衝區已滿? – KaiserJohaan 2011-05-05 14:55:28

+0

這就是我對你的理解。 40包/秒= 800ms。所以你錯過了200ms。除以50得到4ms。如果你是短包,你將永遠不需要扔掉它們。問題是要替換丟失的數據包。 – ravenspoint 2011-05-05 15:05:35

相關問題