Я думаю, что у меня проблема с производительностью (латентностью) с Java Sound API.API Java Sound: попытка мониторинга входного микрофона в реальном времени Slow
аудиомонитора
Следующий код действительно работает для меня. Он правильно открывает микрофон и выводит аудиосигнал через мои динамики в реальном времени (т. Е. Мониторинг). Но мое беспокойство - это скорость, с которой происходит воспроизведение ... это на полсекунды сзади, когда я говорю в своем микрофоне до воспроизведения через мои динамики.
Как увеличить производительность? Как снизить задержку?
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(); }
}
Дополнительные примечания
- С помощью этого кода, воспроизведение не является гладкой (не выскакивает ни испуг), только половина второго замедленные.
- Я также знаю, что мой компьютер и интерфейс USB Audio способны обрабатывать мониторинг в реальном времени через компьютер, потому что, когда я сравниваю бок о бок с Logic Pro X, есть минимальные задержки - я не вижу задержки вообще.
- Мои попытки уменьшить размер/размер байта [] не помогли.
Мое заключение заключается в том, что это проблема Java-кода, которая у меня есть. Заранее спасибо.
Казалось бы, дело доходит до того, насколько велика 'targetLine.getBufferSize()'. Сколько байтов это? –
@AndrewThompson Метод 'targetLine.getBufferSize()' возвращает 88200 байт. Я уже играл с делителем 'byte []' с небольшими изменениями. Когда я вывел 'byte []' явно до 4 байтов, это действительно помогло, но я все еще ощущаю задержку в четверть секунды (с более чем половины второй задержки). –
Размер байта [], который вы установили, не относится к буфере в DataLine. Вы должны указать размер в методах open() для установки размеров буфера DataLine, например. .Open (размер). 88200 байт с 4 байтами на кадр и 44100 кадров в секунду учитывает задержку в полсекунды. Сокращение слишком сильно может привести к выпадениям, но я уверен, что есть безопасные значения, которые вы можете установить с меньшей задержкой. См. Мой ответ ниже. –