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()>-1while ループで使用してもバイトを読み取るため、このコードは反復ごとに 3 バイトを読み取ります。

2) WAV ファイルは、WAV ブロックを含む RIFF コンテナである可能性があります (非常に頻繁にそうです)。また、値が整数でエンコードされることは保証されていません (WAV で float エンコードを見たことがあります)。バイトオーダーは問題ないようですが、コンテナのメタ情報も出力されます。

私は Java の専門家ではありませんが、式をバイト (-1, -1) で実行すると、0 に非常に近い値が得られます。

ファイルの終了を確認するには、バイトのいずれかが -1 であるかどうかを確認します。while ((b1 != -1) && (b2 != -1))

intまた、 からへの変換byte間違っているようです。バイトは署名されているため、-128 から 127 までの値が得られますが、これは必要なもの (0..255) ではありません。

于 2012-12-06T13:35:34.017 に答える