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

标签 java audio wav clip

我正在开发一个播放、暂停和停止音乐的系统。我正在使用 2 个不同的 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文件图片

enter image description here

最佳答案

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

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

这尝试将流从浮点格式转换为系统更可能支持的格式。 (另请参阅 JavaDoc 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。)

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

关于java - 特定 wav 文件无法加载,而其他文件加载没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49476981/

相关文章:

java - Android:如何写入某一行,Java

java - Struts2的prepare方法无法处理

android - MediaPlayer是否可以在所有API版本的android中使用?

android - 在 Android 中反转音频文件

python - numpy 数组的谱质心

c++ - .wav 文件编码的 C/C++ 库

java - 是否存在结构不同但做类似事情的方法的设计模式?

java - drawString() 不会绘制

android - SoundManager,如何停止声音播放

c - 用C语言读写32位wav文件