Воспроизведение звука Java и согласование сюжета предварительно записанного файла - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь написать программу, которая воспроизводит сохраненный аудиофайл .wav, одновременно показывая график амплитуды звука.Для этого я использую библиотеку графики (JChart2D) и пакет Java Sound.Проблема состоит в том, чтобы подать на диаграмму точку данных на той же частоте (44100 Гц) звука, чтобы они были скоординированы.Я пытался использовать метод Thread.sleep(), но он недостаточно точен.5-минутный аудиофайл имеет задержку более 10 секунд в конце.Я также видел ответ на похожую тему, в котором предлагалось «занятое ожидание» с использованием System.nanoTime(), но это вызывает чрезмерную нагрузку на процессор (100%).

Как этого достичь?(Может быть, с другими пакетами или библиотеками, хотя предложение с текущими было бы предпочтительным).

Данные сохраняются в байтовом массиве, который я передал Clip для воспроизведения и который я хочу подать на график с частотой 44100 Гц.

1 Ответ

0 голосов
/ 22 октября 2018

Графика часто отображается с частотой кадров около 60 кадров в секунду.Итак, можете ли вы наметить 735 (= 44100/60) звуковых значений в одном визуальном кадре, или есть особая необходимость попробовать с той же скоростью, что и звук?

Java не слишком хороша для реальноговремя гарантирует, насколько это происходит при выполнении потоков, поэтому попытка согласовать два потока будет непростой задачей.Но Java хорошо справляется с поддержанием стабильной подачи, которая позволяет воспроизводить звуковые данные правильно, благодаря методу writeDataLine, использующему блокировку.

Использование SourceDataLine позволит вам накопитьзвук, как он воспроизводится (следовательно, лучшее время).Ниже приведен пример кода для SourceDataLine, который может быть полезен по следующей ссылке:

https://docs.oracle.com/javase/tutorial/sound/converters.html

В первом примере в коде есть точка (в цикле while), где мыимейте этот комментарий:

  // Here, do something useful with the audio data that's 
  // now in the audioBytes array...

Это "полезное" что-то будет декодировать байты в значения PCM и накапливать их в массив из чего-то вроде 735 значений для передачи в графический поток.

...