0

NAudio のネットワーク チャット デモに似たアプリケーションを作成しようとしています。

ただし、受信/リスニング側では、WaveProvider.addSamples() を呼び出す前に、受信したオーディオ パケットを 2 つ取得するまでバッファリングしています。まったくバッファリングしない、大量のバッファリングなどを試しましたが、問題は残っているため、これが明確な原因ではないと思います。

私が抱えている問題は、addSamples をどれだけ速くしようとしても、オーディオの再生中に WaveProvider が繰り返し使い果たされる (BufferedBytes == 0) ことです。いくつかのテストを実行したところ、デバッグ出力は次のようになります。

  1. 0.690 秒 WaveProvider 空
  2. 0.695s サンプルが WaveProvider に追加されます
  3. 0.871 秒 WaveProvider が空
  4. WaveProvider に追加された 0.875 秒のサンプル
  5. 1.013 秒 WaveProvider が空

...など

WaveProvider は約 150 ミリ秒ごとに「空」を表示しません。これは addSamples 呼び出しが 100 ミリ秒のオーディオ データに対応するデータを追加するため意味があります。

興味深いのは、WaveProvider が空になってから次の addSamples が試行されるまでの 4 ミリ秒から 5 ミリ秒の時間です。バッファ サイズを変更したり、Samples を追加する作業を高速化したりしなくても、このギャップが減少するように思われるため、再生されるオーディオには、ポップ/ブレイクのように聞こえる無音の小さなギャップが常に存在します。

このわずかな時間の遅延は、waveOut デバイスの再生中に WaveProvider がロックされていることが原因ではないかと考えていました。これを修正する方法はありますか?

私の初期化コードは次のとおりです:(それらは正常であるはずです)

WaveProvider = new BufferedWaveProvider(new WaveFormat(16000, 1));

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

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

AudioPlayer.Init(WaveProvider);

この問題について何か助けていただければ幸いです。ありがとうございました

4

1 に答える 1

0

再生しているのと同じ速度でデータを受信して​​いない場合、再生にギャップが生じ、それについてできることはあまりありません。ただし、オーディオのバッファリング (最大 1 秒) 中に自動的に一時停止することで、エクスペリエンスを向上させることができます。その後、バッファがなくなると、再び一時停止します。そうすれば、オーディオの途切れが大幅に少なくなります。

于 2012-06-22T14:18:22.230 に答える