AudioInputStream не работает
Я пытаюсь воспроизвести звук.wav каждый раз, когда пользователь нажимает кнопку, но возникает исключение:
Исключение в потоке "Thread-0" java.lang.IllegalArgumentException: неверный формат в org.classpath.icedtea.pulseaudio.PulseAudioDataLine.createStream(PulseAudioDataLine.java:142) в org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:99) в org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:283) в org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:402) в org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:453) на Uber.play(Uber.java:534) на Uber$5.run(Uber.java:340) на 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();
}
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();
}
}
Что-то не так с путем файла, который вы передаете. Когда я использую ваш код, получая файл из 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();
}
});
}
}