2014-01-24 4 views
0

Я пытаюсь записать наборы в 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 секунд и обрабатывать их? Или, если мои подходы в порядке, чем то, что я делаю неправильно?

спасибо.

ответ

0

Попробуйте ввести код ниже.

Timer myTimer = new Timer(); 
     myTimer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       startRecording(); 
      } 
     }, 4000); 

startRecording Метод

private void startRecording() { 
    myFilename = getFilename(); 
    recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(output_formats[currentFormat]); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    recorder.setOutputFile(getFilename()); 
    recorder.setOnErrorListener(errorListener); 
    recorder.setOnInfoListener(infoListener); 
    try { 
     recorder.prepare(); 
     recorder.start(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

GetFileName

private String getFilename() { 
    String filepath = Environment.getExternalStorageDirectory().getPath(); 
    File file = new File(filepath, AUDIO_RECORDER_FOLDER); 

    SimpleDateFormat sdfDate = new SimpleDateFormat("dd-MMM-yyyy hh-mm-ss"); 
    String currentDateandTime = sdfDate.format(new Date()); 

    if (!file.exists()) { 
     file.mkdirs(); 
    } 
    return (file.getAbsolutePath() + "/" + currentDateandTime + file_exts[currentFormat]); 
} 

Это запустит новую запись каждый через 4 секунды и GetFileName даст имя для записи как CurrentDate и времени.

Надеюсь, что вы смотрите то же, что я понял из вашего вопроса, если я пропущу вас, тогда, пожалуйста, исправьте меня.

+0

Спасибо за ответ, однако я не думаю, что использование MediaRecorder поможет мне. Я не вижу, где вы указываете частоту дискретизации, аудиозапись и т. Д. То, что я делаю после записи набора в 4 секунды, преобразует необработанные байтовые данные в двойной массив и применяет фильтр IIR и другую обработку. Я только пишу файлы для проверки каждого шага алгоритма, и это работает нормально. Моя проблема в том, что я не уверен, содержит ли буфер все записанные данные или только часть его. – Cristian