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 в файл temp, чтобы впоследствии обработать его, не потеряв ничего, что можно записать. Первоначально я пробовал обрабатывать в том же цикле записи, но записанная продолжительность не соответствовала фактической продолжительности. Теперь я хочу прочитать краткое из PCM-файла и записать его в WAV-файл (хотите обработать короткие данные позже, если эта проблема исправлена) с заголовком. Если я открою файл в Audacity, он будет пустым. Если я пишу непосредственно в файл WAV вместо временного файла PCM, он отлично работает.AudioRecord записывает/считывает исходные данные PCM в файл
Другая проблема. Я использую обработчик для запуска потока, в котором я обновляю продолжительность записи и обновляю VU-метр. Я использую данные mBuffer для отображения в режиме VU Meter и недействителен каждую секунду. Синхронизация не используется для данных, но все же она влияет на записанную продолжительность. Иногда это бывает в три раза больше первоначальной продолжительности.
Вопросы (1) Почему чтение и запись данных PCM в файл temp приводит к тому, что WAV-файл пуст? Почему чтение из несинхронизированного короткого буфера (переменной-члена) в потоке, управляемом обработчиком, добавляет длительность к данным WAV, это происходит, когда я напрямую записываю записанный буфер в WAV-файл?
Что вы хотите сказать? – Axarydax
Только что понял, заголовок не обновлялся должным образом, так как размер файла составлял 44, когда был добавлен заголовок. Модифицировал его для обновления заголовка в конце обработки. –