Java Sound APIのパフォーマンス(レイテンシ)問題があると思います。Java Sound API:ライブマイクの入力監視が遅い
オーディオモニター
次のコードは、実際に私のために働くありません。マイクを正しく開き、スピーカーからリアルタイムで音声入力を出力します(モニタリング)。しかし、私の懸念は、再生が起こるスピードです...スピーカーから再生するまでにマイクに向かって話すときから0.5秒遅れです。
パフォーマンスを向上させるにはどうすればよいですか?どのようにレイテンシを下げるのですか?このコードで
private void initForLiveMonitor() {
AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, false);
try {
//Speaker
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
SourceDataLine sourceLine = (SourceDataLine) AudioSystem.getLine(info);
sourceLine.open();
//Microphone
info = new DataLine.Info(TargetDataLine.class, format);
TargetDataLine targetLine = (TargetDataLine) AudioSystem.getLine(info);
targetLine.open();
Thread monitorThread = new Thread() {
@Override
public void run() {
targetLine.start();
sourceLine.start();
byte[] data = new byte[targetLine.getBufferSize()/5];
int readBytes;
while (true) {
readBytes = targetLine.read(data, 0, data.length);
sourceLine.write(data, 0, readBytes);
}
}
};
System.out.println("Start LIVE Monitor for 15 seconds");
monitorThread.start();
Thread.sleep(15000);
targetLine.stop();
targetLine.close();
System.out.println("End LIVE Monitor");
}
catch(LineUnavailableException lue) { lue.printStackTrace(); }
catch(InterruptedException ie) { ie.printStackTrace(); }
}
追記
- 、再生は、遅延ちょうど半分秒(NOポップやジッタ)滑らかです。
- Logic Pro Xとのサイドバイサイド比較で遅延が最小限に抑えられているため、コンピュータとUSBオーディオインターフェイスでコンピュータのリアルタイムモニタリングを処理できることも知っていますまったく。
- byte []のサイズを小さくしたり大きくしたりする試みは、この問題には役立ちませんでした。
私の結論は、これは私が持っているJavaコードの問題です。前もって感謝します。
'targetLine.getBufferSize()'がどのくらいの大きさになっているかは分かります。それは何バイトですか? –
@AndrewThompson 'targetLine.getBufferSize()'メソッドは、88200バイトを返します。私はすでにほとんど変化のないバイト[]の除数で演奏してきました。 'byte []'を明示的に4バイトにすると、本当に助けになりましたが、私はまだ0.5秒以上の遅延から1/4秒の遅延を感じています。 –
設定したbyte []のサイズは、DataLineのバッファには関係しません。 DataLineのバッファサイズを設定するには、open()メソッドにサイズを含める必要があります。 .open(サイズ)。 1フレームあたり4バイトで88200バイト、1秒間に44100フレームは、0.5秒の遅延を説明します。あまりにも短くするとドロップアウトが発生する可能性がありますが、待ち時間の少ない安全な値を設定できます。下の私の答えを見てください。 –