我正在尝试从音频文件中提取持续时间。
此音频文件是 U-LAW(G.711 / MONO 8.000Hz)。
static AudioFormat ULAW_FORMAT = new AudioFormat(AudioFormat.Encoding.ULAW, 8000, 8, 1, 1, 8000, false);
我一直收到例外情况:
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
我的来源的一小部分,我收到了例外:
AudioInputStream inputFileStream = AudioSystem.getAudioInputStream(file);
或
AudioInputStream inputFileStream = AudioSystem.getAudioInputStream(ULAW_FORMAT, inputFileStream);
问题
我做错了什么?
Java无法读取此类音频文件?
来源失败?
感谢您的任何提示!
带有抖动评论的 更新
我试过这个虚拟来源:
public static void main(String[] args) {
String selectFile = "\\audio\\543288";
AudioInputStream source;
try {
source = AudioSystem.getAudioInputStream(new File(selectFile));
AudioSystem.getAudioInputStream(AudioFormat.Encoding.ULAW, source);
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
并且在尝试的第一行总是失败!
答案 0 :(得分:1)
μ-law是一个样本值编码而不是文件格式,因此使用AudioSystem为“μ-law文件”(无论是什么)找到合适的AudioReader将会失败。如果我没弄错的话,Sun的VM内置了对AIFF,AU和WAV文件的支持。
我现在只是在猜测,但如果您的文件包含没有任何文件格式标头的原始μ律数据,您可以直接创建一个AudioInputStream,而无需通过AudioSystem中的实用程序方法:
int length = ... // file length in number of samples
FileInputStream fis = new FileInputStream("...");
AudioInputStream ais = new AudioInputStream(
fis, new AudioFormat(AudioFormat.Encoding.ULAW, 8000, 8, 1, 1, 8000, false), length);
最后:如果您的第一个问题确实正确(您只是想获取文件的持续时间),则无需与AudioInputStream对抗。如果文件真的包含8000个样本/秒的原始μ律数据,并且每个样本都是一个字节,那么它就是eeh,你得到它吗?
答案 1 :(得分:0)
您确定音频文件格式有效吗?异常通常意味着java无法将从文件读取的数据解释为有效的音频数据。
您确定使用ULAW_FORMAT
提供的设置是否正确?
我不熟悉μ律编码,但frameSize
和frameRate
的值是否正确?
您也可以尝试
AudioSystem.getAudioInputStream(AudioFormat.Encoding.ULAW, inputFileStream);
如果它也不起作用,则文件包含无效的音频数据或java有一些解析错误。