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

Posted

技术标签:

【中文标题】特定的 wav 文件无法加载,而其他文件加载时没有错误【英文标题】:Specific wav file failing to load while others load without errors 【发布时间】:2018-03-25 14:32:35 【问题描述】:

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

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

【问题讨论】:

使用e.printStackTrace() 打印异常堆栈跟踪,并找出 wav 文件的实际格式。然后请将该信息编辑到您的问题中。 (Wav 只是一种容器格式,几乎可以使用任何编码,甚至是 mp3。) 如何找出 wav 文件的编码? 当你看到一个位深为 32 位的音频文件时,它应该抛出一个危险信号,因为人类听觉的极限在 16 到 24 位之间……32 位提供的粒度级别蝙蝠很可能会使用比特或其他一些深奥的目的 【参考方案1】:

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

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

这会尝试将流从浮点格式转换为系统更可能支持的格式。 (另请参阅AudioSystem.getAudioInputStream(AudioFormat, AudioInputStream) 的 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 声音在默认情况下支持的格式仍然非常有限。 (最可靠的格式大概是CDDA,也就是44100Hz,16位有符号LPCM。)

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于特定的 wav 文件无法加载,而其他文件加载时没有错误的主要内容,如果未能解决你的问题,请参考以下文章

加载和保存 WAV 文件

.wav 与 .mp3 文件的加载时间

使用 ajax 加载 wav 文件

使用 AudioKit 加载 .wav 文件时出现问题

将 .wav 加载到内存中,然后在 C++ 中播放

如何导入其他 Python 文件?