Java的声音API不适用于所有.WAV文件?

时间:2015-04-18 05:35:32

标签: java exception audio

我目前在使用javax.sound.sampled库时遇到问题。这是我用来播放音频文件的MCV代码:

import javax.sound.sampled.*;
import java.io.File;

public class Foo
{
    public static void main(String[] args)
    {
        try
        {
            File f = new File("alarm.wav");
            AudioInputStream ais = AudioSystem.getAudioInputStream(f);
            Clip clip = AudioSystem.getClip();

            clip.open(ais);
            clip.start();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

此代码有时会抛出UnsupportedAudioFileException

基本上,我有5个.WAV文件,我知道这些文件没有损坏,因为当我在我的音乐播放软件中打开它们时,它们的播放效果非常好。但是,Java程序仅适用于其中的3个。

Oracle mentions support for this file format here.如何确保所有.WAV文件都与Java的音频API兼容?是否有一种万无一失的播放.WAV文件的方式,如果由于某种原因他们没有适当的编码?

2 个答案:

答案 0 :(得分:5)

您可以使用以下代码获取支持的播放格式列表:

public static List<AudioFormat> getSupportedAudioFormats() {
    List<AudioFormat> result = new ArrayList<>();
    for (Line.Info info : AudioSystem.getSourceLineInfo(
                new Line.Info(SourceDataLine.class))) {
        if (info instanceof SourceDataLine.Info) {
            Collections.addAll(result, ((SourceDataLine.Info) info).getFormats());
        }
    }
    return result;
}

AudioFormat.Encoding列出了javax.sound.sampled支持的编码。

安全的WAV音频格式是44位的16位PCM。

您可以通过以下方式发现特定文件的格式:

File file = new File("path_to_file.wav");
AudioFormat fmt = AudioSystem.getAudioFileFormat(file).getFormat();

这比尝试获取一行更宽松,但如果WAV文件有例如,它仍会抛出。 mp3数据。 WAV文件是一个容器,可以存储PCM以外的编码,其中一些javax.sound.sampled通常不支持。

答案 1 :(得分:1)

如果查找UnsupportedAudioFileException,当文件属于不受支持的类型或不受支持的格式时,您会注意到它被抛出。格式是给你的。

Java Sound能够使用各种不同的格式,但具体哪些格式通常取决于系统。您可以找到支持的格式:

DataLine.Info.getFormats();

此方法返回一个AudioFormat对象数组,每个对象描述一个Java实现可以说的音频语言。

鉴于您可以在其他播放器上播放文件,系统的某些部分很可能完全能够理解每种wav格式;但您可能会考虑检查它所通过的数据线,因为这几乎不意味着它们受到普遍支持。