Java-клип (звук) «эхом» и не играет эффективно - PullRequest
0 голосов
/ 18 августа 2011

решено

Возникла проблема с Runnable, поэтому одновременно работали ДВА игровых потока.(Равно проблема!) Итак, второй поток, попавший в аудиоплеер, допустил ошибку, и именно поэтому он звучал эхом - он воспроизводился из двух разных потоков!

Я также использую SourceDataLine, как было предложено, чтобы включитьболее длинные звуковые клипы.

Оригинальный пост-


Когда этот код срабатывает, появляется сообщение о том, что

IllegalStateException: Mixer is already open

в clip.open() строка.Я приложил все усилия, чтобы проверить, выполняется ли код дважды, это не так.Однако даже с ошибкой звук все равно играет.На более длинных клипах (30 секунд) звучит так, как будто звучит 2 звука, один за другим.На действительно длинных клипах (3 минуты) звук заикается.

(stringFile - это String, например, "example.wav")

File soundFile = new File(stringFile);
AudioInputStream inputStream = AudioSystem.getAudioInputStream(soundFile);
AudioFormat format = inputStream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
clip = (Clip) AudioSystem.getLine(info);
clip.open(inputStream);
clip.start();
playing = true;

Если этот вопрос уже был опубликован,Мне очень жаль.Я искал и не нашел ни одной темы, похожей на эту.

1 Ответ

0 голосов
/ 20 августа 2011

Я просто проверяю, но одним из аспектов использования клипа является то, что вы можете хранить клип в памяти и вызывать его несколько раз, не загружая его из файла.

Таким образом, для запуска и остановки вы должны использовать myClip.open (), myClip.start (), myClip.stop () и, чтобы воспроизвести его снова, myClip.setFramePosition (0) и myClip.start (), если Я правильно прочитал Учебник. (Обычно я просто работаю с SourceDataLines, поэтому прости меня, если я ошибаюсь.)

Если вы каждый раз перезагружаете его из файла, может ли это вызвать или способствовать возникновению проблемы? В любом случае, я бы подумал о переходе на SourceDataLine. Помимо прочего, это избавляет от необходимости загружать весь клип в память, прежде чем он сможет начать воспроизведение.

30 секунд - это много оперативной памяти, кстати. 30 * 44100 = 1,332 МБ (и это всего лишь 1 байт на кадр, более распространенный формат WAV в 4 раза больше этого размера). Таким образом, при использовании более длинных звуков вы можете нагружать ОЗУ до такой степени, что произойдет перестановка страниц, что приведет к заиканию.

...