Java Wav文件错误(javax.sound.sampled.UnsupportedAudioFileException:无法从输入文件中获取音频输入流)

我的Java项目中有两个类

篮板球

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Rebound { public static void main (String[] args) { JFrame frame = new JFrame ("Rebound"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new ReboundPanel()); frame.pack(); frame.setVisible(true); } } 

第二个是ReboundPanel

 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.sound.sampled.*; import java.io.File; import java.io.IOException; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; public class ReboundPanel extends JPanel { private final int WIDTH = 600, HEIGHT = 300; private final int DELAY = 20, IMAGE_SIZE = 35; private ImageIcon image1, image2, image3; private Timer timer; private int x1, y1, moveX1, moveY1, x2, y2, moveX2, moveY2, x3, y3; Clip clip; DataLine.Info info; public ReboundPanel() throws Exception { timer = new Timer(DELAY, new ReboundListener()); image1 = new ImageIcon ("happyFace1.gif"); image2 = new ImageIcon ("happyFace2.gif"); x1 = 0; y1 = 100; x2 = 40; y2 = 0; moveX1 = moveY1 = 3; moveX2 = moveY2 = 5; setPreferredSize (new Dimension(WIDTH, HEIGHT)); setBackground (Color.black); timer.start(); image3 = new ImageIcon ("fire.gif"); File soundFile = new File("explosion.wav"); AudioInputStream sound = AudioSystem.getAudioInputStream(soundFile); DataLine.Info info = new DataLine.Info (Clip.class, sound.getFormat()); clip = (Clip) AudioSystem.getLine(info); clip.open(sound); clip.start(); } public void paintComponent (Graphics page) { super.paintComponent (page); image1.paintIcon (this, page, x1, y1); image2.paintIcon (this, page, x2, y2); image3.paintIcon (this, page, x2, y2); } private class ReboundListener implements ActionListener { public void actionPerformed (ActionEvent event) { x1 += moveX1; y1 += moveY1; x2 += moveX2; y2 += moveY2; if (x1 = WIDTH-IMAGE_SIZE) moveX1 = moveX1 * -1; if (y1 = HEIGHT-IMAGE_SIZE) moveY1 = moveY1 * -1; if (x2 = WIDTH-IMAGE_SIZE) moveX2 = moveX2 * -1; if (y2 = HEIGHT-IMAGE_SIZE) moveY2 = moveY2 * -1; if (Math.abs(y1-y2) <= IMAGE_SIZE-2 && Math.abs(x1-x2)= 4*IMAGE_SIZE && Math.abs(x1-x2) >= 4*IMAGE_SIZE) { x3=-200; y3=-200; if (clip.isRunning()) clip.stop(); } repaint(); } } } 

当我尝试运行该程序时,我收到以下错误

 javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1187) at ReboundPanel.(ReboundPanel.java:47) at Rebound.main(Rebound.java:21) Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at ReboundPanel$ReboundListener.actionPerformed(ReboundPanel.java:99) at javax.swing.Timer.fireActionPerformed(Timer.java:312) at javax.swing.Timer$DoPostEvent.run(Timer.java:244) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721) at java.awt.EventQueue.access$200(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:682) at java.awt.EventQueue$3.run(EventQueue.java:680) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:691) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) at java.awt.EventDispatchThread.run(EventDispatchThread.java:97) 

根据我的规范,我的目标是让两个幸福的脸在框架中移动,当它们碰撞时,声音和火灾/爆炸的图像应该显示并消失

请帮助我向我的导师展示这个项目……

仅仅因为文件是WAV并不意味着JavaSound支持它。 WAV文件是容器格式,并且实际原始数据(样本)可以是不同格式,包括各种位深度的有符号/无符号PCM,或者它可以是压缩格式。 我找不到JavaSound的兼容性表,但是JMF的兼容性表(这会给你一个好主意)在这里:

http://www.oracle.com/technetwork/java/javase/formats-138492.html

解决方案是将WAV文件转换为更通用的格式,如16位PCM,使用可以读取当前文件的转换程序(SoX,Adacity,QuickTime,ProTools等)。

更准确地说,您可能想要创建一个位深度为16位的WAV文件(小端 – 这是默认值,所以如果您不觉得它不用担心),立体声或单声道应该工作。 您可能还需要考虑常见的采样率,例如44,100 Hz或48,000 Hz(现在大多数计算机应支持这两种速率,但前者更常见)。

UnsupportedAudioFileException是一个exception,表示操作失败,因为文件不包含已识别文件类型和格式的有效数据。

如果问题是“为什么不播放样品?” 答案就在上面。 另一种说法是“声音使用Java Sound API无法理解的格式或编码”。

..你的问题是什么?