Android:读取wav文件并显示其值

时间:2012-12-06 13:14:28

标签: java android

您好我正在尝试读取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它似乎是一个无限循环并且有一个强制关闭。根据我的说法,循环应该在文件结束时终止。任何人都可以建议循环的一些终止条件。请帮助....谢谢你提前......

1 个答案:

答案 0 :(得分:1)

此代码段存在以下问题:

1)在while循环中使用file.read()>-1仍然会读取字节,因此每次迭代时此代码读取3个字节。

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

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

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

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