2013-04-07 3 views
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 в файл temp, чтобы впоследствии обработать его, не потеряв ничего, что можно записать. Первоначально я пробовал обрабатывать в том же цикле записи, но записанная продолжительность не соответствовала фактической продолжительности. Теперь я хочу прочитать краткое из PCM-файла и записать его в WAV-файл (хотите обработать короткие данные позже, если эта проблема исправлена) с заголовком. Если я открою файл в Audacity, он будет пустым. Если я пишу непосредственно в файл WAV вместо временного файла PCM, он отлично работает.AudioRecord записывает/считывает исходные данные PCM в файл

Другая проблема. Я использую обработчик для запуска потока, в котором я обновляю продолжительность записи и обновляю VU-метр. Я использую данные mBuffer для отображения в режиме VU Meter и недействителен каждую секунду. Синхронизация не используется для данных, но все же она влияет на записанную продолжительность. Иногда это бывает в три раза больше первоначальной продолжительности.

Вопросы (1) Почему чтение и запись данных PCM в файл temp приводит к тому, что WAV-файл пуст? Почему чтение из несинхронизированного короткого буфера (переменной-члена) в потоке, управляемом обработчиком, добавляет длительность к данным WAV, это происходит, когда я напрямую записываю записанный буфер в WAV-файл?

+0

Что вы хотите сказать? – Axarydax

+0

Только что понял, заголовок не обновлялся должным образом, так как размер файла составлял 44, когда был добавлен заголовок. Модифицировал его для обновления заголовка в конце обработки. –

ответ

Смежные вопросы