3

嗨,我正在尝试读取 wav 文件中的数据,以便将其绘制为波形。以下是我尝试过的代码:

    try {
        RandomAccessFile file = new RandomAccessFile(myFile,"r");
        while(file.read()>-1){
         byte b1 = (byte) file.read();
         byte b2 = (byte) file.read();
         Log.d(TAG,"DATA:"+ (double) (b2 << 8 | b1 & 0xFF) / 32767.0);
        }
        file.close();

    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

我的输出最初是一个介于 -1 和 +1 之间的值,但后来它只给出 DATA:0 它似乎是一个无限循环并且有一个力关闭。据我说,当到达文件末尾时,循环应该终止。任何人都可以为循环提出一些终止条件。请帮助....谢谢是提前...

4

1 回答 1

1

此代码段存在以下问题:

1)file.read()>-1在while循环中使用你仍然读取字节,所以这段代码在每次迭代中读取3个字节。

2) WAV 文件可能(并且经常是)带有 WAV 块的 RIFF 容器。此外,不能保证值以整数编码(我在 WAV 中看到过浮点编码)。字节顺序似乎没问题,但容器的元信息也会被打印出来。

我不是 Java 专家,但使用字节 (-1, -1) 运行表达式会得到非常接近 0 的值。

要检查文件终止,请检查是否有任何字节为 -1:while ((b1 != -1) && (b2 != -1))

此外,从intto的转换byte似乎是错误的:字节已签名,因此您将获得从 -128 到 127 的值,这不是您想要的 (0..255)。

于 2012-12-06T13:35:34.017 回答