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 ファイルに直接書き込むときに発生します。