无法播放音频文件

Posted

技术标签:

【中文标题】无法播放音频文件【英文标题】: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();
    






【问题讨论】:

Workaround for UnsupportedAudioFileException?的可能重复 您要播放什么文件?仅支持 Java .wav 它正在尝试播放 .wav 文件 告诉我们堆栈跟踪的内容。打印audioFormat 并告诉我们它在说什么(如果它走到这一步)。 【参考方案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 上的 *** 链接

还有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、..上编码?

以上是关于无法播放音频文件的主要内容,如果未能解决你的问题,请参考以下文章

音频文件无法从服务器播放

iOS - 无法播放音频文件

录制音频并保存到文档目录后无法使用 AVAudioPlayer 播放音频文件

AVAudioPlayer 无法播放使用 ExtAudioFileWriteAsync 编写的音频 (.wav) 文件

iphone 5 无法播放音频文件

无法播放网络音频文件