1

WaveOut API には、現在再生中のバッファのサイズに関する内部制限がありますか? つまり、非常に小さなバッファーを提供すると、スピーカーに再生されるサウンドに何らかの影響がありますか。小さなバッファで正弦波を生成して再生すると、非常に奇妙なノイズが発生します。ピークのようなもの、または「BUMP」。

完全なストーリー:

洞音信号をリアルタイムで生成できるプログラムを作りました。可変パラメータは、Frequency と Volume です。プロジェクトの要件は、最大レイテンシを 50 ミリ秒にすることでした。したがって、プログラムは、オーディオ信号の周波数を手動で調整できる正弦波信号をリアルタイムで生成できなければなりません。

Windows WaveOut API、C#、および P/invoke を使用して API にアクセスしました。

サウンド バッファが 1000 ミリ秒の場合、すべて正常に動作します。遅延要件に従ってバッファを 50 ミリ秒に最小化すると、特定の周波数ですべてのバッファの最後にノイズまたは「バンプ」が発生します。生成されたサウンドの形式が正しくない (チェックしたところ、そうではない) のか、オーディオ チップで何かが発生したのか、初期化と再生に遅延が発生したのか、私にはわかりません。

制作したオーディオを .wav ファイルに保存すると、すべてが完璧になります。

これは、私のコードに何らかのバグがあるか、オーディオ サブシステムに送信されるバッファ チャンクに制限があることを意味します。

WaveOut を最初に初期化する必要があることを知らない人のために、再生する必要があるバイト数と、再生する必要があるオーディオを含むメモリへのポインターを含む各バッファーのオーディオ ヘッダーを準備する必要があります。プレーヤーになります。

アップデート

ノイズは次の組み合わせで発生します 44100 SamplingRate、16 ビット、2 チャネル、50 ms バッファ、および生成された 201Hz、202Hz、203Hz、204Hz、205Hz ... 219Hz、220Hz、240 Hz の Sinus オーディオ信号は問題ありません

なぜこの 20 の差なのか、私にはわかりません。

4

2 に答える 2

3

オーディオをスムーズに出力する必要がある場合は、次の点に注意してください。

  • waveOutXxxxAPI は、下位レベルの API の上にあるレガシー/互換性レイヤーであるため、オーバーヘッドが大きくなり、最小限の待機時間に到達する場合はお勧めできません。これが主な問題になる可能性は低いことに注意してください。ただし、これは理解に役立つ一般的な知識です。
  • Windows はリアルタイム OS ではなく、そのオーディオ サブシステムもリアルタイムではないため、出力用のオーディオ データをキューに入れ、データが実際に再生されるまでのランダムな遅延を制御できないため、重要なのは、一定レベルのバッファの充足度を維持することです。再生のアンダーフローからあなたを守り、スムーズな再生を実現します
  • 単一のバッファに制限されwaveOutXxxxていないため、複数の再利用可能なバッファを割り当ててリサイクルできます

全体として、waveOutXxxx、DirectSound、DirectShow API は 50 ミリ秒以上のレイテンシで適切に動作します。WASAPI 排他モード ストリームを使用すると、5 ミリ秒以下のレイテンシを実現できます

編集: 約 20 ミリ秒の遅延については早すぎると言ったようです。これを補うために、達成できるレイテンシを見積もるための簡単なツールLowLatencyWaveOutPlay ( Win32x64 ) があります。十分なバッファリングを使用すると、再生はスムーズになりますが、そうしないと途切れが聞こえます。

私の理解では、バッファが遅く返される可能性があり、最小のレイテンシに関する最適な設計は、できるだけ早く返されるように、より小さなバッファを持つことにあります。たとえば、10 ミリ秒のバッファーを 3 つではなく、10 バッファーを 3 ミリ秒/バッファーにします。

D:\>LowLatencyWaveOutPlay.exe 48000 10 3
Format: 48000 Hz, 1 channels, 16 bits per sample
Buffer Count: 10
Buffer Length: 3 ms (288 bytes)
Signal Frequency: 1000 Hz
^C
于 2013-01-12T13:42:01.960 に答える