2015-02-17 110 views
0

我似乎無法弄清楚爲什麼我的音頻文件無法播放。音頻文件是一個wav文件,並且是正確的。我得到的錯誤是javax.sound.sampled.UnsupportedAudioFileException無法播放音頻文件

public class MusicProgress { 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    JFrame b = new JFrame(); 
    FileDialog fd = new FileDialog(b, "Pick a file: ", FileDialog.LOAD); 
    fd.setVisible(true); 
    final File file = new File(fd.getDirectory() + fd.getFile()); 
    //URI directory = new URI (fd.getDirectory() + fd.getFile()); 
    try { 
     AudioInputStream inputStream = AudioSystem.getAudioInputStream(file); 
     AudioFormat audioFormat = inputStream.getFormat(); 
     Clip clip = AudioSystem.getClip(); 
     clip.open(inputStream); 
     clip.start(); 
    } catch (LineUnavailableException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (UnsupportedAudioFileException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 



} 

} 
+0

可能重複的[解決方法爲UnsupportedAudioFileException?](http://stackoverflow.com/questions/2843847/workaround-for-unsupportedaudiofileexception) – 2015-02-17 20:58:34

+0

你想玩什麼文件? Java只支持.wav – crAlexander 2015-02-17 21:12:34

+0

它試圖播放一個。wav文件 – Suji 2015-02-17 21:16:39

回答

0

Java不支持所有的wav格式。支持的最高質量是標準的CD編碼格式。有了這些文件,你應該沒問題。該格式具有16位編碼,44100 fps,小端,立體聲。你應該能夠檢查你的wav文件的屬性,並瞭解它是否匹配。

DAW越來越普遍地產生具有24位或32位編碼或48000fps或92000fps的wav文件。

可以使用Audacity等工具將它們轉換爲「CD」編碼規範。

0

我挖了一些舊的代碼來播放音頻文件。這可能會實現:

import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Clip; 
import javax.swing.JOptionPane; 

public class SoundPlayer { 

Clip clip; 

public SoundPlayer(String file){ 

    //if(clip.isRunning()){clip.stop();} 
    try{ 
     AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(SoundPlayer.class.getResource(file)); 
     clip = AudioSystem.getClip(); 
     clip.open(audioInputStream); 
     clip.start(); 
    }catch(Exception err){err.printStackTrace(); JOptionPane.showMessageDialog(null, "SoundPlayer: "+err,null,0);} 
} 

} 

和播放音頻剪輯:你說「/game/resources/sound/Explosion.wav」 和:

new SoundPlayer(filepath); 

路徑應財產以後這樣的它必須是一個.wav文件。

+0

'final File file = new File(fd.getDirectory()+ fd.getFile());音頻輸入流InputStream = AudioSystem.getAudioInputStream(MusicProgress.class.getResource(file.toString())); \t \t \t AudioFormat audioFormat = inputStream.getFormat();' 這給了我一個錯誤'java.lang.NullPointerException' – Suji 2015-02-17 21:01:55

+0

@Sujinthan我完全複製了你的代碼,它工作。 – ThatGuy 2015-02-17 21:04:41

+0

你能告訴我你在哪裏得到你的wav文件。我認爲我的wav文件有問題。 – Suji 2015-02-17 21:25:37

0

你必須使用外部庫播放文件,如MP3播放

Java支持的唯一的.wav

但是這enough.All你需要的是一個外部算法播放多種音樂格式。所有其他格式來自.wav他們傳入算法,然後繁榮他們成爲.ogg,.mp3,.whatever

1.一個非常令人印象深刻的庫使用哪些支持.mp3 JLayer.jar 您可以將此jar作爲外部庫導入到您的項目中。

2.如果你搜索更多,你會發現JAudiotagger這只是驚人的,但很難使用。

3.您也可以使用Java Media FrameWork,但無論它支持多種格式。

4.JavaZoom也已經和其他庫來支持.OGG,.speex,.FLAC,MP3播放

鏈接的StackOverflow上How to play .wav files with java

而且http://alvinalexander.com/java/java-audio-example-java-au-play-sound 不知道這仍然工作java的8

此:

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.DataLine; 
    import javax.sound.sampled.LineEvent; 
    import javax.sound.sampled.LineListener; 
    import javax.sound.sampled.LineUnavailableException; 
    import javax.sound.sampled.UnsupportedAudioFileException; 


public class AudioPlayerExample1 implements LineListener { 

/** 
* this flag indicates whether the playback completes or not. 
*/ 
boolean playCompleted; 

/** 
* Play a given audio file. 
* @param audioFilePath Path of the audio file. 
*/ 
void play() { 
    File audioFile = new File("C:/Users/Alex.hp/Desktop/Musc/audio.wav"); 

    try { 
     AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile); 

     AudioFormat format = audioStream.getFormat(); 

     DataLine.Info info = new DataLine.Info(Clip.class, format); 

     Clip audioClip = (Clip) AudioSystem.getLine(info); 

     audioClip.addLineListener(this); 

     audioClip.open(audioStream); 

     audioClip.start(); 

     while (!playCompleted) { 
      // wait for the playback completes 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
       ex.printStackTrace(); 
      } 
     } 

     audioClip.close(); 

    } catch (UnsupportedAudioFileException ex) { 
     System.out.println("The specified audio file is not supported."); 
     ex.printStackTrace(); 
    } catch (LineUnavailableException ex) { 
     System.out.println("Audio line for playing back is unavailable."); 
     ex.printStackTrace(); 
    } catch (IOException ex) { 
     System.out.println("Error playing the audio file."); 
     ex.printStackTrace(); 
    } 
} 

/** 
* Listens to the START and STOP events of the audio line. 
*/ 
@Override 
public void update(LineEvent event) { 
    LineEvent.Type type = event.getType(); 

    if (type == LineEvent.Type.START) { 
     System.out.println("Playback started."); 

    } else if (type == LineEvent.Type.STOP) { 
     playCompleted = true; 
     System.out.println("Playback completed."); 
    } 
} 

public static void main(String[] args) { 
    AudioPlayerExample1 player = new AudioPlayerExample1(); 
    player.play(); 
} 

}

+0

沒有外部庫。所以不能使用這些。 – Suji 2015-02-17 21:27:24

+0

你的意思是沒有外部圖書館?你在eclipse上編碼,netbeans,..? – crAlexander 2015-02-17 21:28:36

+0

我的意思是,老師告訴我們沒有外部圖書館 – Suji 2015-02-17 21:29:24