【问题标题】:Can't get audio file to play无法播放音频文件
【发布时间】:2015-02-17 20:48:58
【问题描述】:

我似乎无法弄清楚为什么我的音频文件无法播放。音频文件是一个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();
    }



}

}

【问题讨论】:

  • 您要播放什么文件?仅支持 Java .wav
  • 它正在尝试播放 .wav 文件
  • 告诉我们堆栈跟踪的内容。打印audioFormat 并告诉我们它在说什么(如果它走到这一步)。

标签: java audio audio-streaming


【解决方案1】:

Java 不支持所有 wav 格式。支持的最高质量是标准 CD 编码格式。有了这些文件,你应该没问题。该格式具有 16 位编码、44100 fps、小端、立体声。您应该能够检查 wav 文件的属性并了解它是否匹配。

DAW 制作具有 24 位或 32 位编码,或 48000fps 或 92000fps 的 wav 文件变得越来越普遍。

可以使用 Audacity 等工具将这些转换为“CD”编码规范。

【讨论】:

    【解决方案2】:

    我挖出了一些我的旧代码来播放音频文件。这可能有效:

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

    并播放音频剪辑:

    new SoundPlayer(filepath);
    

    路径应该是这样的:“/game/resources/sound/Explosion.wav” 正如你所说,它必须是一个 .wav 文件。

    【讨论】:

    • final File file = new File(fd.getDirectory() + fd.getFile()); AudioInputStream inputStream = AudioSystem.getAudioInputStream(MusicProgress.class.getResource(file.toString())); AudioFormat audioFormat = inputStream.getFormat(); 这给了我一个错误java.lang.NullPointerException
    • @Sujinthan 我完全复制了您的代码,并且成功了。
    • 你能告诉我你从哪里得到你的 wav 文件吗?我认为我的 wav 文件有问题。
    • @Sujinthan 很可能。我尝试了多个 .wav 文件。由于我不能在这里做产品代言,我不能给你一个链接。只需谷歌“免费声音”
    【解决方案3】:

    你必须使用外部库来播放像 .mp3 这样的文件

    仅支持 Java .wav

    但这已经足够了。您只需要一个外部算法来播放其他音乐格式。所有其他格式最初来自 .wav,它们传递给算法,然后迅速变成 .ogg、.mp3、.whatever

    1.一个非常令人印象深刻的库,支持.mp3 JLayer.jar 您可以将此 jar 作为外部库导入到您的项目中。

    2.如果您搜索更多,您会发现JAudiotagger 非常棒,但很难使用。

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

    4.JavaZoom还有其他库支持.ogg,.speex,.flac,.mp3

    How to play .wav files with java 上的 stackoverflow 链接

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

    }

    【讨论】:

    • 没有外部库。所以不能用那些。
    • 你的意思是没有外部库?您正在 eclipse、netbeans、..上编码?
    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多