2012-06-21 193 views
0

我正在嘗試創建類似於NAudio中的網絡聊天演示的應用程序。無法在NAudio waveOut上順利播放,WaveProvider被快速清空

但是,在接收/偵聽端,我正在緩衝接收到的音頻數據包,直到我在調用WaveProvider.addSamples()之前得到其中的2個音頻數據包。我嘗試過不緩衝,緩衝大量等等,但問題仍然存在,所以我不認爲這是明確的原因。

我遇到的問題是,無論我嘗試添加示例的速度有多快,在播放音頻時,WaveProvider都會反覆耗盡(BufferedBytes == 0)。我跑了一些測試,我的調試輸出是這樣的:

  1. 0.690s WaveProvider空
  2. 0.695s樣品加入到WaveProvider
  3. 0.871s WaveProvider空
  4. 0.875s樣品添加到WaveProvider
  5. 1.013s WaveProvider空

...等

WaveProvider不會顯示「空」,直到每150毫秒左右,這是有道理的,因爲addSamples調用會添加對應於100毫秒音頻數據的數據。

有趣的部分是WaveProvider爲空和嘗試下一個addSamples之間4ms到5ms的時間。緩衝區大小沒有變化,或者加快採樣速度的努力似乎可以減小這種差距,因此回放的音頻總是具有這些微小的寂靜間隙,聽起來像是爆裂/爆裂。

我在想,如果這個微小的時間延遲可能是由waveProvider在waveOut設備正在播放時被鎖定引起的,並且因此我被鎖定在WaveProvider的AddingSamples中,直到它完成播放?有什麼方法可以糾正這個問題嗎?

我的初始化代碼如下:(他們應該是正常的,我希望)

WaveProvider =新BufferedWaveProvider(新WAVEFORMAT(16000,1));

WaveProvider.BufferDuration = new TimeSpan(0,0,10);

AudioPlayer = new WaveOut(WaveCallbackInfo.FunctionCallback());

AudioPlayer.Init(WaveProvider);

我將不勝感激任何幫助。 謝謝

回答

0

如果您沒有收到數據一樣快,你在玩它,你將不得不在播放的差距並沒有什麼太多可以做的。但是,您可以在緩衝(例如達到一秒)音頻時自動進入暫停狀態,從而改善體驗。那麼如果緩衝區用完了,你又會暫停。這樣音頻聽起來會少得多。

+0

感謝Mark的建議。如果我確實收到的數據太慢,那麼如果我收到的數據量較大,這應該可以緩解一些問題。我已經嘗試過,但我會繼續嘗試和測試所有選項。 – user1473324