1

.wav ファイルを再生するコードを書きました。それは正常に動作します。ここで、別のコードがオーディオ レシーバーから音楽データを取得し、その .wav ファイルに追加し続けます。

プレーヤーを実行したときにオーディオの長さが 5 秒であるとします。アップデータ コードを使用して wav ファイルを更新しても、プレーヤーは最初の 5 秒間だけを再生します。

再生コードは単純です:

try{
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("junk.wav"));
    Clip clip = AudioSystem.getClip();
    clip.open(audioInputStream);
    clip.start();
}catch(Exception ex){
    System.out.println("Error with playing sound.");
    ex.printStackTrace();
}

入力がマイク ジャックに入った直後にオーディオ ストリームを再生するにはどうすればよいですか (多少の遅延は許容されます)。

4

2 に答える 2

1

あなたは質問を投稿していないので、答えは一般的なものになります。

wav ファイルには、厳密に定義された形式があります。これには、ヘッダーとデータ (サウンド サンプル) が含まれます。ヘッダーは、wav ファイル内のデータ数を定義します。オーディオを再生するために、ヘッダーはサンプルレートなどの追加情報を提供します。AudioInputStream で wav ファイルを開くと、それらの情報が解析されます。ヘッダーで定義されたデータ長のため、wav ファイルにデータを追加することはできません。wav ファイルのデータ サンプルを変更することはできますが、交換されるデータが同じ形式であることを確認する必要があります。

Class AudioInputStream のドキュメントを開くと、最初のステートメントは次のとおりです。「オーディオ入力ストリームは、指定されたオーディオ形式と長さの入力ストリームです。」

OSの観点から。

リアルタイム プレーヤーでファイルをバッファとして使用すると、問題が発生する場合があります。ファイルシステムは、多くのレベルでバッファリング/キャッシュされ、メモリの大きなチャンクへの高速アクセスを提供します。その場でファイルを読み書きすると、ファイルが破損することさえあります。WAV ファイルに Circular バッファを作成したいということでしたら、同じサンプルを何度も上書きしてください。ファイルの新しいコンテンツ (ライターで提供) をループで再生するクリップと同期させるには、追加の問題があります。

あなたは何ができますか?

SourceDataLine / TargetDataLine を使用できます。次に、その場でサンプルを読み取り、これをファイルではなくバイト バッファー (たとえば、byte[] または ByteBuffer) 内に保持します。最初に受信データでバッファーを埋め、後でループ内で xxxDataLine との間で読み取り/書き込みを行う必要があります。特定の AudioFormat に対して行が開かれていることに注意する必要があります。入力と出力に同じ形式を使用します。すべての形式がサポートされているわけではありません (ハードウェアに依存するため、これは Java では「穏やかな」ものです)。データ サイズがバイト単位であっても、フレーム サイズに合わせて調整する必要がある場合があることに注意してください (1 サンプルあたり 16 ビット = 2 バイト)。

于 2013-06-28T16:00:20.303 に答える