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

Java's sound API doesn't work with all .WAV files?

我目前在使用 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 文件由于某种原因没有适当的编码,是否有一种万无一失的播放方式?

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

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 音频格式是 44100Hz 的 16 位 PCM。

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

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

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

如果您查找 UnsupportedAudioFileException,您会注意到当文件属于不受支持的类型或 格式 时会抛出该异常。格式决定了你。

Java 声音可以有多种不同的格式,但具体是哪种格式通常取决于系统。您可以找出支持哪些格式:

DataLine.Info.getFormats();

此方法 returns 一组 AudioFormat 对象,每个对象都描述了您的 Java 实现可以使用的一种音频语言。

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