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

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

问题描述:

我有两个班在我的Java项目一个是的Java的Wav文件错误(javax.sound.sampled.UnsupportedAudioFileException:无法从输入文件音频输入流)

反弹

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 <= 0 || x1 >= WIDTH-IMAGE_SIZE) 
      moveX1 = moveX1 * -1; 

     if (y1 <= 0 || y1 >= HEIGHT-IMAGE_SIZE) 
      moveY1 = moveY1 * -1; 

     if (x2 <= 0 || x2 >= WIDTH-IMAGE_SIZE) 
      moveX2 = moveX2 * -1; 

     if (y2 <= 0 || y2 >= HEIGHT-IMAGE_SIZE) 
      moveY2 = moveY2 * -1; 

     if (Math.abs(y1-y2) <= IMAGE_SIZE-2 && Math.abs(x1-x2)<= IMAGE_SIZE-2) 
      { 
       moveY2 = moveY2 * -1; 
       moveX2 = moveX2 * -1; 
       moveY1 = moveY1 * -1; 
       moveX1 = moveX1 * -1; 
       x3=x2; 
       y3=y2-2*IMAGE_SIZE; 
       clip.loop(Clip.LOOP_CONTINUOUSLY); 

      } 
     if (Math.abs(y1-y2) >= 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.<init>(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) 

根据我的代码我的目标是让两个幸福的面孔在框架移动,当它们两者碰撞声与火的图像一起/爆炸应该出现和消失

请帮助我不得不显示此项目到我的教练......

+0

'explosion.wav'确实存在于您运行代码的目录中吗?它是一个有效的'wav'文件吗? – 2013-02-18 19:37:00

+0

一个简单的搜索让我这个链接:http://stackoverflow.com/questions/11104118/javax-sound-sampled-unsupportedaudiofileexception-could-not-get-audio-input-str – mostruash 2013-02-18 19:37:17

+0

是的,它确实存在于目录 – user1991965 2013-02-18 19:38:14

UnsupportedAudioFileException是指示操作失败,因为文件没有包含可识别文件类型和格式的有效数据的异常。

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

..你的问题是什么?

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

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

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

更确切地说,你可能想要创建一个16位深度的WAV文件(小尾数 - 这是默认的,所以如果你没有看到它不用担心),立体声或单声道应该工作。您可能还想考虑一些常见的采样率,例如44,100 Hz或48,000 Hz(目前大多数计算机应支持这两种速率,但前者更常见)。

+0

扩大答案有点:格式16位PCM,小端,44100 fps,立体声通常由javax.sound.sampled.Clip和SourceDataLine使用。 Audacity是免费的。如果.wav文件不是上述格式,则可以使用Audacity将其转换。 (相当容易做到。)一些转换也可以在Java中完成:http://docs.oracle.com/javase/tutorial/sound/converters.html但是这对于运行时间不利的方面来说可能是一个更困难的方法,如果你正在实施它。 – 2013-02-19 20:59:52

+0

答复已更新。但是,请注意,您不能使用Java进行转换,因为java无法首先读取文件,因此无法转换它们。 – 2013-02-20 00:49:49

+0

*“我无法找到JavaSound的兼容性表”*由于它工作于SPI,因此最好在运行时从J2SE获取信息。请参阅[Java声音信息。页面](http://stackoverflow.com/tags/javasound/info)了解更多关于SPI和Java Sound Capabilities的信息(通过'AudioSystem'获得)。 – 2013-02-20 04:12:53