Я пытаюсь записать наборы в 4 секунды из AudioRecord, обрабатывать их, а затем записывать снова и так далее. Я записываю 4400 выборок в секунду, вы можете увидеть в коде ниже. Я должен упомянуть, что я записываю, или, по крайней мере, должен записывать наборы импульсов 19ХГц.Как непрерывно записывать наборы из 4 секунд с помощью AudioRecord
int frequency = 44100;
int blockSize = 44100;
int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
final int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration,
audioEncoding, blockSize * 8); // if I multiply blockSize by 4 it will only give 88200 buffer size
// start recording until explicitly stopped
while (<stopCondition>) {
recData = new ByteArrayOutputStream();
dos = new DataOutputStream(recData);
short[] buffer = new short[blockSize * 4]; // Save the raw PCM
// timePassed = false;
// timer.cancel();
// timer.start();
audioRecord.startRecording();
// while (!timePassed) {
int bufferReadResult = audioRecord.read(buffer, 0, blockSize * 4);
for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
try {
dos.writeShort(buffer[i]);
// buffer[i] = 0;
} catch (IOException e) {
e.printStackTrace();
}
}
// }
audioRecord.stop();
try {
dos.flush();
dos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
... process the recorded data
Как видно из кода (комментировал) Я попытался с помощью countDownTimer, который останавливает запись после 4 секунд прошло. Это было только чтение из audioRecord по 1 секунде за один раз (blockSize не умножался на 4), но я не знал точно, если буфер будет переопределен, так как смещение 0 - я предполагаю, что это так, но я все еще не уверен :) Используя этот подход, он не записывал количество импульсов, которые были воспроизведены за 4 секунды - сыграно 16 импульсов, всего 2-3 записи.
Чем я пробовал без таймера и читал из аудиозаписей blockSize * 4 = 44100 (= 1s) * 4 = 4s, но в Audacity я вижу только одну секунду, записанную - где-то в коде, не показанном здесь, я пишу записанные данные в файл для проверки вывода. Снова количество записанных импульсов не в порядке, но это очевидно, так как у меня есть только 1 секунда записанных данных.
Есть ли лучший способ непрерывно записывать наборы X секунд и обрабатывать их? Или, если мои подходы в порядке, чем то, что я делаю неправильно?
спасибо.
Спасибо за ответ, однако я не думаю, что использование MediaRecorder поможет мне. Я не вижу, где вы указываете частоту дискретизации, аудиозапись и т. Д. То, что я делаю после записи набора в 4 секунды, преобразует необработанные байтовые данные в двойной массив и применяет фильтр IIR и другую обработку. Я только пишу файлы для проверки каждого шага алгоритма, и это работает нормально. Моя проблема в том, что я не уверен, содержит ли буфер все записанные данные или только часть его. – Cristian