使用Java从U-LAW音频文件中提取持续时间

时间:2009-11-24 12:38:18

标签: java audio

我正在尝试从音频文件中提取持续时间。

此音频文件是 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();
    }
}

并且在尝试的第一行总是失败!

2 个答案:

答案 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提供的设置是否正确?

我不熟悉μ律编码,但frameSizeframeRate的值是否正确?

您也可以尝试

AudioSystem.getAudioInputStream(AudioFormat.Encoding.ULAW, inputFileStream);

如果它也不起作用,则文件包含无效的音频数据或java有一些解析错误。