我正在开发一个播放、暂停和停止音乐的系统。我正在使用 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文件图片
最佳答案
鉴于错误消息,您可以尝试的一件事是从资源打开 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/