4

これが私がやりたいことです:

ユーザーが自分のプログラムに (マイク入力を介して) サウンド データを与え、それを 250 ミリ秒保持してから、スピーカーから出力できるようにしたいと考えています。

私はすでに Java Sound API を使用してこれを行っています。問題は、それがちょっと遅いことです。音を鳴らしてからスピーカーから音が出るまで最低でも1~2秒ほどかかりますし、遅延ロジックもまだ実装していません。理論的には遅延はないはずですが、遅延があります。サウンド カードのバッファがいっぱいになるまで待つ必要があることは理解していますが、これにはサンプル サイズとサンプリング レートが関係しています。

私の質問は次のとおりです。これを行うには、Java パスを続行する必要がありますか? 可能であれば、遅延を 100ms 程度に抑えたいと考えています。Java で ASIO ドライバーを使用した経験のある人はいますか? 多分それはより速いです..

また、私は .NET 派です。これは、代わりに .NET を使用する意味がありますか? C++はどうですか?ここで使用する適切なテクノロジを探しています。提案されたテクノロジ プラットフォームを使用してオーディオ入力/出力ストリームを読み書きする方法の良い例かもしれません。ご協力いただきありがとうございます!

4

5 に答える 5

3

低遅延のサウンド処理用に設計されたオーディオ API であるJACKを調べることをお勧めします。さらに、Google は、Java での JACK の使用に関するこの気の利いたプレゼンテーション[PDF] を公開しています。

理論的には遅延はないはずですが、遅延があります。

まあ、遅延をゼロにすることは不可能です。あなたが望むことができる最善のことは、(人間の知覚の観点から)目立たない遅延です。サウンドデータを読み書きするための基本的なアルゴリズムを説明すると、人々が考えられる問題を特定できるようになります。

Java のようなガベージ コレクション言語を使用する場合の潜在的な問題は、GC が定期的に実行され、任意の時間処理が中断されることです。ただし、通常の使用で 100ms を超える場合は驚くでしょう。GC が問題である場合、ほとんどの JVM には代替の収集アルゴリズムが用意されており、試すことができます。

于 2009-05-13T00:04:50.343 に答える
3

C/C++ パスを選択する場合は、PortAudio ( http://portaudio.com/ ) を使用することを強くお勧めします。複数のプラットフォーム上のほぼすべてのもので動作し、周囲のさまざまなサウンド ドライバー テクノロジに実際に対処する必要なく、サウンド ドライバーを低レベルで制御できます。

私は複数のプロジェクトで PortAudio を使用してきましたが、使用するのは本当に楽しいものです。そして、ライセンスは寛大です。

于 2009-05-13T20:41:32.863 に答える
3

私は過去に JavaSound を使用したことがありますが、非常に不安定であることがわかりました (そして、VM のリリース間で変化し続けています)。C# が好きなら、それを使用してください。DirectX API を使用してください。DirectSound と C# を使用して、やりたいことを実行する例を次に示します。エフェクト プラグインを使用して、250 ミリ秒のエコーを実行できます。

http://blogs.microsoft.co.il/blogs/tamir/archive/2008/12/25/capturing-and-streaming-sound-by-using-directsound-with-c.aspx

于 2009-05-11T03:19:36.223 に答える
1

低レイテンシが目標なら、C に勝るものはありません。

libsoundioは、リアルタイムのオーディオ入出力用の低レベル C ライブラリです。マイク入力をスピーカー出力にパイプするという、まさにあなたが望むことを行うサンプルプログラムも付属しています。

于 2015-10-24T19:34:29.713 に答える
0

JavaSoundを使用すれば、100 ~ 150 ミリ秒程度のエンド ツー エンドのレイテンシを確実に達成できます。

  1. レイテンシの主な原因は、キャプチャ ラインと再生ラインのバッファ サイズです。行を開くときにサイズが設定されます。

    • 捕獲:TargetDataLine#open(AudioFormat format, int bufferSize)
    • 再生:SourceDataLine#open(AudioFormat format, int bufferSize)

バッファが大きすぎると余分な遅延が発生しますが、小さすぎると再生が途切れます。そのため、アプリケーションのニーズとコンピューティング能力のバランスを見つける必要があります。

DataLine#getBufferSizeデフォルトのバッファ サイズは、呼び出し時に確認できます#open(AudioFormat format)。デフォルトのサイズは によって異なりAudioFormat、遅延が大きく、途切れのない再生アプリケーション (インターネット ストリーミングなど) に適しているようです。低レイテンシ アプリケーションを開発している場合、デフォルトのバッファ サイズは大きすぎるため、変更する必要があります。

16 ビットの PCM を使用した私のテストではAudioFormat、1024 バイトのバッファー サイズは、低レイテンシーにとって理想にかなり近いものでした。

  1. オーディオ レイテンシの 2 番目の見過ごされがちな原因は、キャプチャまたは再生スレッドで実行されている他のアクティビティです。たとえば、メッセージをコンソールに記録すると、数十ミリ秒の遅延が発生する可能性があります。消して。
于 2016-02-22T04:12:29.923 に答える