Как играть разные звуки в Java? - PullRequest
4 голосов
/ 30 мая 2011

Я пытаюсь играть звуки в Java ...

private Clip clip;

public Sound(String filename)
{
    try{
        AudioInputStream ais;
        ais = AudioSystem.getAudioInputStream(this.getClass().getResource(filename));
        clip = AudioSystem.getClip();
        clip.open(ais);
    }catch(Exception e){e.printStackTrace();}

}
public void playSFX()
{
    clip.stop();
    clip.setFramePosition(0);
    clip.start();
}

Я использую приведенный выше код с WAV-файлами. Я могу успешно воспроизводить определенные клипы .wav; однако я не могу играть другие клипы .wav. Что я делаю неправильно? Также следует отметить: я хочу воспроизводить короткие (менее 3 секунд) звуковые эффекты. Я получаю UnsupportedAudioFileException для определенных клипов, которые не воспроизводятся (они также являются .wav). Пример неработающего клипа: ссылка Пример рабочего клипа: ссылка

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Как говорили предыдущие люди, некоторые форматы WAV не поддерживаются. Я просто добавлю немного больше деталей.

Я часто сталкиваюсь с WAV, которые кодируются в 24-битном или 32-битном формате, когда 16-битный максимум - это максимум, который поддерживает javax.sound.sampled.

Чтобы узнать о конкретном WAV-файле, если у вас Windows, вы можете щелкнуть правой кнопкой мыши по файлу и проверить свойства, а также вкладку «Сводка». Я не знаю, что такое эквивалент в системе MAC или Linux.

Как только вы знаете формат, вы можете проверить, поддерживается ли он с помощью кода в этом руководстве: http://download.oracle.com/javase/tutorial/sound/converters.html См. Обсуждение в разделе «Запись звуковых файлов», где они представляют метод AudioSystem, «isFileTypeSupported».

Вот список форматов, которые поддерживаются на моем ПК. Я получил этот список путем проверки объекта LineInfo через отладчик Eclipse. Я подозреваю, что это стандартные, но я не уверен:

BigEndian = false, PCM_UNSIGNED, channels = 1, bits = 8
BigEndian = false, PCM_SIGNED, channels = 1, bits = 8
BigEndian = false, PCM_SIGNED, channels = 1, bits = 16
BigEndian = true, PCM_SIGNED, channels = 1, bits = 16
BigEndian = false, PCM_UNSIGNED, channels = 2, bits = 8
BigEndian = false, PCM_SIGNED, channels = 2, bits = 8
BigEndian = false, PCM_SIGNED, channels = 2, bits = 16
BigEndian = true, PCM_SIGNED, channels = 2, bits = 16

Большинство WAV-файлов, с которыми я работаю, идут вторыми по последним в приведенном выше списке: младший, 16-битный, PCM_SIGNED, стерео, кодированный со скоростью 44100 кадров в секунду.

Следующий код также может помочь вам выяснить формат ваших файлов .wav.

InputStream inStream =  YourClass.class.getResourceAsStream("YourSound.wav");
AudioInputStream aiStream = AudioSystem.getAudioInputStream(inStream);
AudioFormat audioFmt = aiStream.getFormat();            
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFmt);
System.out.println(info);
0 голосов
/ 06 июня 2011

Насколько я знаю, некоторые форматы просто не поддерживаются. Пожалуйста, проверьте, какие форматы этих WAV работают, а какие нет.

Под форматом я имею в виду что-то вроде здесь: http://en.wikipedia.org/wiki/WAV#WAV_file_compression_codecs_compared

Тогда вы можете просто конвертировать в формат, который работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...