2014-01-15 2 views
1

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

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(); 
} 

ответ

10

Мне удалось заставить его работать. Это код, который я использовал. Имейте в виду, что мне нужно было просто сыграть короткий звуковой сигнал 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(); 
     } 
    } 
+0

Когда вы передаете путь файла к воспроизведению функции («путь/в/файл»); убедитесь, что это правильный путь и причина, по которой я говорю, потому что он может стать очень сложным, когда вы упаковываете все в банку. Убедитесь, что вы создали папку ресурсов внутри корневой папки вашего проекта. – Aci89

+0

Хотелось бы узнать, почему это решение работает. – mic4ael

0

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

см также Javasound wiki tag для работы с неподдерживаемых типов аудио файлов

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(); 
      } 
     }); 
    } 
} 
+0

Привет, @peeskillet, благодарю вас за ответ. Но если путь к файлу был неправильным, разве это не исключало бы исключение «нет такого файла или каталога»? – Aci89

+0

Btw приведенный выше код дает мне то же исключение. Я начинаю думать, что что-то не так с самими файлами. Странно, потому что я пробовал .mp3, .aiff и .wav, все без везения. – Aci89

+0

@ Aci89 кажется, что вы правы. Я получил «FileNotFoundException». У меня нет большого опыта работы с аудио. Я просто тестировал ваш метод. Я не уверен, что выбрасывает «IllegalArgumentException». Единственное исключение, которое я смог создать, это исключение 'UnsupportedAudioFileType' –

0

Попробуйте проверить эту открытую программу источник деки: DBoard.

Вы заинтересованы в использовании класса MediaPlayer. Вы можете видеть, как он вызывается в классе DBoard.