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

时间:2018-03-25 14:32:35

标签: java audio wav clip

我正在制作一个播放,暂停和停止音乐的系统。我用2个不同的wav文件测试了这个,一个长度为45秒,另一个长度为3:35分钟。我遇到的问题是45秒的wav文件没有任何问题。另一方面,3:35分钟的wav文件无法加载。在java中wav文件是否有最大时间限制,或者wav文件是否可能被破坏?它在Windows应用程序“凹槽音乐”中播放没有任何问题。

我已经搜索了堆栈溢出,但似乎没有人遇到与我相同的问题,一个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文件图片

enter image description here

2 个答案:

答案 0 :(得分:1)

鉴于错误消息,您可以尝试的一件事是在从资源打开AudioInputStream之后,执行以下操作:

AudioFormat fmt = inputStream.getFormat();
fmt = new AudioFormat(fmt.getSampleRate(),
                      16,
                      fmt.getChannels(),
                      true,
                      true);
inputStream = AudioSystem.getAudioInputStream(fmt, inputStream);

这会尝试将流转换为浮点格式,希望转换为系统更可能支持的内容。 (另请参阅JavaDoc for AudioSystem.getAudioInputStream(AudioFormat, AudioInputStream)。)

您可以运行以下代码以找出可能的播放格式:

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声音在默认情况下支持的格式仍然非常有限。 (最可靠的格式可能是CDDA,即44100Hz,16位带符号LPCM。)

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

答案 1 :(得分:0)

我面临的问题源于wav文件本身。由于wav文件可以具有多种不同格式之一,因此编码的格式与java不兼容。解决方案是更改wav文件的比特率和Hz以匹配java支持的编码。

有关wav格式的更多信息:https://en.wikipedia.org/wiki/WAV