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

zxg*_*ear 1 java audio exception

我目前在使用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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码有时会抛出一个UnsupportedAudioFileException.

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

Oracle在此提及对此文件格式的支持.如何确保所有.WAV文件都与Java的音频API兼容?是否有一种万无一失的播放.WAV文件的方式,如果由于某种原因他们没有适当的编码?

Rad*_*def 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

您可以使用以下方法发现特定文件的格式:

File file = new File("path_to_file.wav");
AudioFormat fmt = AudioSystem.getAudioFileFormat(file).getFormat();
Run Code Online (Sandbox Code Playgroud)

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