我正在读取16位和24位采样位深度的音频文件并解析它们以确定它们的长度而没有任何困难。但是,当读取32位文件时,我得到了
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1170)
...
32位测试文件以与其他测试文件相同的方式手动编码(线性PCM)。我想知道AudioSystem是否不支持32位Wav,或者是否有解决方法。作为参考,这是我的班级:
import java.io.*;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
public class soundUtility {
public static double getWavDuration(File filename)
{
AudioInputStream stream = null;
try
{
stream = AudioSystem.getAudioInputStream(filename);
AudioFormat format = stream.getFormat();
return filename.length() / format.getSampleRate() / (format.getSampleSizeInBits() / 8.0) / format.getChannels();
}
catch (Exception e)
{
e.printStackTrace();
return -1;
}
finally
{
try { stream.close(); } catch (Exception ex) { }
}
}
public static void main(String[] args) {
try {
// ===== TESTS: toggle these calls to test the included files =====
// File soundFile = new File("16bit.mono.441k.30secs.wav");
// File soundFile = new File("24bit.48k.11secs.stereo.wav");
File soundFile = new File("32bit.Floating.Stereo.48k.wav");
// ===========
System.out.println(getWavDuration(soundFile));
} catch (Exception e) {
e.printStackTrace();
}
}
}
感谢您的任何见解。
答案 0 :(得分:1)
老问题,但这是我自己只是在考虑的事情。我的测试可以确认16位48kHz PCM工作,32位不工作。
但是我的测试也暗示24位不起作用:
No line matching interface Clip supporting format PCM_SIGNED 48000.0 Hz, 24 bit, stereo, 6 bytes/frame, little-endian is supported.
这是一个以96Khz,32位创建的.wav文件,从Audacity导出,在那里渲染为24位48Khz wav。
这似乎反映在文档中:https://docs.oracle.com/javase/8/docs/technotes/guides/sound/
“声音格式:8位和16位音频数据,单声道和立体声,采样率从8 kHz到48 kHz”
所以,没有32位浮点可用,我担心,我无法重现24位浮点数的结果。