3
        File pcmFile = new File(mediaPath, TEMP_PCM_FILE_NAME);

        if (pcmFile.exists())
            pcmFile.delete();

        int total = 0;
        mAudioRecordInstance.startRecording();
        try {

            DataOutputStream pcmDataOutputStream = new DataOutputStream(
                    new BufferedOutputStream(new FileOutputStream(pcmFile)));

            while (isRecording) {
                mAudioRecordInstance.read(mBuffer, 0, mBufferSize);
                for (int i = 0; i < mBuffer.length; i++) {
                    Log.d("Capture", "PCM Write:["+i+"]:" + mBuffer[i]);
                    pcmDataOutputStream.writeShort(mBuffer[i]);
                    total++;
                }
            }
            pcmDataOutputStream.close();
        } catch (IOException e) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    DialogCodes e = DialogCodes.ERROR_CREATING_FILE;
                    showDialog(e.getValue());
                    actionButton.performClick();
                }
            });
            return;
        } catch (OutOfMemoryError om) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    DialogCodes e = DialogCodes.OUT_OF_MEMORY;
                    showDialog(e.getValue());
                    System.gc();
                    actionButton.performClick();
                }
            });
        }

        Log.d("Capture", "Stopping recording!!!");
        mAudioRecordInstance.stop();
        Log.d("Capture", "Processing starts");
        short[] shortBuffer = new short[total];

        try {
            DataInputStream pcmDataInputStream = new DataInputStream(
                    new BufferedInputStream(new FileInputStream(pcmFile)));


            for (int j = 0; pcmDataInputStream.available() > 0; j++) {
                shortBuffer[j] = pcmDataInputStream.readShort();
                Log.d("Capture", "PCM Read:[" + j + "]:" + shortBuffer[j] );
            }
            outStream.write(Utilities.shortToBytes(shortBuffer));
            pcmDataInputStream.close();

        } catch (IOException e) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    DialogCodes e = DialogCodes.ERROR_CREATING_FILE;
                    showDialog(e.getValue());
                    outFile = null;
                    actionButton.performClick();
                }
            });
            return;
        } catch (OutOfMemoryError om) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    DialogCodes e = DialogCodes.OUT_OF_MEMORY;
                    showDialog(e.getValue());
                    System.gc();
                    actionButton.performClick();
                }
            });
        }

記録可能なものを失うことなく後で処理できるように、PCM データを一時ファイルに書き込もうとしています。最初に同じ録音ループで処理を試みましたが、録音されたデュレーションが実際のデュレーションと一致しませんでした。今私が欲しいのは、PCMファイルから短いものを読み込んで、それをヘッダー付きのWAVファイルに書き込むことです(この問題が修正されたら、後で短いデータを処理したいです)。Audacity でファイルを開くと、空になります。一時 PCM ファイルの代わりに WAV ファイルに直接書き込むと、問題なく動作します。

その他の問題は、ハンドラーを使用してスレッドを実行し、記録の期間を更新して VU メーター ビューを更新していることです。VU メーター ビューに表示するために mBuffer データを使用していますが、1 秒ごとに無効化されます。データに同期は使用されませんが、それでも記録される期間に影響します。場合によっては、元のデュレーションの 3 倍になることもあります。

質問は (1) PCM データを一時ファイルに読み書きすると WAV ファイルが空になるのはなぜですか? ハンドラーによって管理されるスレッドで非同期ショート バッファー (メンバー変数) から読み取ると、WAV データに継続時間が追加されるのはなぜですか? これは、記録されたバッファーを WAV ファイルに直接書き込むときに発生します。

4

1 に答える 1

3

それはすべてヘッダーにありました

http://gitorious.org/android-eeepc/base/blobs/48276ab989a4d775961ce30a43635a317052672a/core/java/android/speech/srec/WaveHeader.java

すべてがうまくいったことを修正したら。

于 2013-07-12T10:34:13.673 に答える