AudioInputStream не работает

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

Exception in thread "Thread-0" java.lang.IllegalArgumentException: Invalid format
    at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.createStream(PulseAudioDataLine.java:142)
    at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:99)
    at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:283)
    at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:402)
    at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:453)
    at Uber.play(Uber.java:534)
    at Uber$5.run(Uber.java:340)
    at java.lang.Thread.run(Thread.java:724)

Вот код:

//Play Audio File
public void play(String file) throws LineUnavailableException, UnsupportedAudioFileException, IOException
{
    AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File(file));
    Clip clip = AudioSystem.getClip();
    clip.open(inputStream);
    clip.start();
}

person Aci89    schedule 15.01.2014    source источник


Ответы (2)


Мне удалось заставить его работать. Это код, который я использовал. Имейте в виду, что мне это нужно было только для воспроизведения короткого звука beep.wav. Кажется, у него проблемы с более длинными звуковыми файлами. Дайте мне знать, если это работает для вас, ребята, и если вам удастся воспроизвести более длинные звуки с помощью этого кода.

public void play(String file) throws LineUnavailableException, UnsupportedAudioFileException, IOException
    {

    try 
        {   
            AudioInputStream inputStream = AudioSystem.getAudioInputStream(this.getClass().getResource(file));
            AudioFormat format = inputStream.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, format);
            Clip clip = (Clip)AudioSystem.getLine(info);
            clip.open(inputStream);
            clip.start();
        }

    catch (IOException | LineUnavailableException | UnsupportedAudioFileException e1)
        {
            e1.printStackTrace();
        }
    }
person Aci89    schedule 23.01.2014
comment
Когда вы передаете путь к файлу функции play(path/to/file); убедитесь, что это правильный путь, и причина, по которой я говорю это, заключается в том, что это может стать очень сложным, когда вы упаковываете все в банку. Убедитесь, что вы создали папку ресурсов внутри корневой папки вашего проекта. - person Aci89; 23.01.2014

Что-то не так с путем к файлу, который вы передаете. Когда я использую тот же код, получая файл из JFileChooser, он работает нормально. Проверьте это.

Также см. вики-тег Javasound для работы с неподдерживаемыми типами аудиофайлов.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.SwingUtilities;

public class TestAudio {

    public TestAudio() {

        JButton button = new JButton("Choose file");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JFileChooser chooser = new JFileChooser();

                File file = null;
                int returnVal = chooser.showOpenDialog(null);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    file = chooser.getSelectedFile();
                }

                String fileName = file.getAbsolutePath();
                try {
                    play(fileName);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });

        JFrame frame = new JFrame();
        frame.add(button);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }

    public void play(String file) throws LineUnavailableException, UnsupportedAudioFileException, IOException {
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File(file));
        Clip clip = AudioSystem.getClip();
        clip.open(inputStream);
        clip.start();
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestAudio();
            }
        });
    }
}
person Paul Samsotha    schedule 15.01.2014
comment
Привет, @peeskillet, спасибо за ответ. Но если путь к файлу был неправильным, разве это не вызовет исключения такого файла или каталога? - person Aci89; 15.01.2014
comment
Кстати, приведенный выше код дает мне то же исключение. Я начинаю думать, что что-то не так с самими файлами. Странно, так как я безуспешно пробовал .mp3, .aiff и .wav. - person Aci89; 15.01.2014
comment
@ Aci89 похоже, ты прав. Я получил FileNotFoundException. У меня нет большого опыта работы со звуком. Я просто тестировал твой метод. Я не уверен, что выдает IllegalArgumentException. Единственное другое исключение, которое я смог создать, было UnsupportedAudioFileType исключением. - person Paul Samsotha; 15.01.2014
comment
@ Aci89 Aci89 да, я не знаю, как получить эти поддерживаемые типы файлов. Единственные, с кем мне удалось поиграть, это mid au. Я не мог заставить его пойти с mp3 - person Paul Samsotha; 15.01.2014
comment
@Aci89, возможно, надежная пробная версия может дать вам некоторые ответы. Также взгляните на ссылку, которую я выше в моем ответе. - person Paul Samsotha; 15.01.2014