Java 特定wav文件无法加载,而其他文件加载时没有错误

Java 特定wav文件无法加载,而其他文件加载时没有错误,java,audio,wav,clip,Java,Audio,Wav,Clip,我正在开发一个播放、暂停和停止音乐的系统。我正在用两个不同的wav文件进行测试,一个长度为45秒,另一个长度为3:35分钟。我遇到的问题是,45秒的wav文件播放没有任何问题。另一方面,3:35分钟的wav文件无法加载。java中的wav文件是否有最长时间限制,或者wav文件是否可能已损坏?它在windows应用程序groove music上播放时没有任何问题 我已经搜索过堆栈溢出,但似乎没有人遇到和我一样的问题,一个wav文件正在播放,另一个没有 我得到的错误代码是: javax.sound.

我正在开发一个播放、暂停和停止音乐的系统。我正在用两个不同的wav文件进行测试,一个长度为45秒,另一个长度为3:35分钟。我遇到的问题是,45秒的wav文件播放没有任何问题。另一方面,3:35分钟的wav文件无法加载。java中的wav文件是否有最长时间限制,或者wav文件是否可能已损坏?它在windows应用程序groove music上播放时没有任何问题

我已经搜索过堆栈溢出,但似乎没有人遇到和我一样的问题,一个wav文件正在播放,另一个没有

我得到的错误代码是:

javax.sound.sampled.LineUnavailableException: line with format PCM_FLOAT 44100.0 Hz, 32 bit, stereo, 8 bytes/frame,  not supported.
我用来播放wav文件的方法

public static void playAudio(String name) {
    try {
        System.out.println("NOTE: Playing audio");
        clip = AudioSystem.getClip();
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(
                Engine.class.getResourceAsStream("/Audio/" + name));
        clip.open(inputStream);
        clip.start();
    } catch(Exception e) {
        System.out.println("ERROR: Failed to load audio");
    }
}
调用方法

Engine.playAudio("easy2.wav");
src/Audio/文件夹中wav文件的图片


我面临的问题源于wav文件本身。因为wav文件可以有几种不同格式中的一种,所以它编码时使用的格式与java不兼容。解决方案是更改wav文件的比特率和Hz,以匹配java支持的编码


有关wav格式的更多信息:

如果出现错误消息,可以尝试的一件事是在从资源中打开AudioInputStream后,执行以下操作:

AudioFormat fmt = inputStream.getFormat();
fmt = new AudioFormat(fmt.getSampleRate(),
                      16,
                      fmt.getChannels(),
                      true,
                      true);
inputStream = AudioSystem.getAudioInputStream(fmt, inputStream);
这试图将流从浮点格式转换为系统更可能支持的格式。有关详细信息,请参见JavaDoc

您可以运行以下代码,以了解哪些格式可能可用于播放:

Arrays.stream(AudioSystem.getSourceLineInfo(new Line.Info(SourceDataLine.class)))
      .filter(info -> info instanceof DataLine.Info)
      .map(info -> (DataLine.Info) info)
      .flatMap(info -> Arrays.stream(info.getFormats()))
      .forEach(System.out::println);
如果上述转换音频流的方法不起作用,那么您最好的选择可能是使用一些编辑器(如Audacity)来转换文件。不幸的是,Java声音在默认支持的格式方面仍然非常有限。最可靠的格式可能是44100Hz,16位有符号LPCM


也可能有支持浮点PCM转换的第三方SPI。

使用e.printStackTrace打印异常堆栈跟踪,并找出wav文件的实际格式。然后请在您的问题中编辑该信息。Wav只是一种容器格式,几乎可以使用任何编码,甚至是mp3。我如何找到Wav文件的编码?当你看到一个位深度为32位的音频文件时,它应该会发出一个红旗,因为人类听力的极限在16到24位之间。。。32位提供的粒度级别很可能被BAT或其他一些深奥的用途所使用