2011-05-27 17 views

Respuesta

2

aquí es el código de ejemplo para grabar audio.

private Runnable recordRunnable = new Runnable() { 

    @Override 
    public void run() { 

     byte[] audiodata = new byte[mBufferSizeInBytes]; 
     int readsize = 0; 

     Log.d(TAG, "start to record"); 
     // start the audio recording 
     try { 
      mAudioRecord.startRecording(); 
     } catch (IllegalStateException ex) { 
      ex.printStackTrace(); 
     } 

     // in the loop to read data from audio and save it to file. 
     while (mInRecording == true) { 
      readsize = mAudioRecord.read(audiodata, 0, mBufferSizeInBytes); 
      if (AudioRecord.ERROR_INVALID_OPERATION != readsize 
        && mFos != null) { 
       try { 
        mFos.write(audiodata); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     // stop recording 
     try { 
      mAudioRecord.stop(); 
     } catch (IllegalStateException ex) { 
      ex.printStackTrace(); 
     } 

     getActivity().runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       mRecordLogTextView.append("\n Audio finishes recording"); 
      } 
     }); 

     // close the file 
     try { 
      if (mFos != null) 
       mFos.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
}; 

luego necesita dos botones (o uno actúa como función diferente en el tiempo diferente) para iniciar y detener el hilo de grabación.

 mRecordStartButton = (Button) rootView 
      .findViewById(R.id.audio_record_start); 

    mRecordStartButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      // initialize the audio source 
      int recordChannel = getChoosedSampleChannelForRecord(); 
      int recordFrequency = getChoosedSampleFrequencyForRecord(); 
      int recordBits = getChoosedSampleBitsForRecord(); 

      Log.d(TAG, "recordBits = " + recordBits); 

      mRecordChannel = getChoosedSampleChannelForSave(); 
      mRecordBits = getChoosedSampleBitsForSave(); 
      mRecordFrequency = recordFrequency; 

      // set up the audio source : get the buffer size for audio 
      // record. 
      int minBufferSizeInBytes = AudioRecord.getMinBufferSize(
        recordFrequency, recordChannel, recordBits); 

      if(AudioRecord.ERROR_BAD_VALUE == minBufferSizeInBytes){ 

       mRecordLogTextView.setText("Configuration Error"); 
       return; 
      } 

      int bufferSizeInBytes = minBufferSizeInBytes * 4; 

      // create AudioRecord object 
      mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        recordFrequency, recordChannel, recordBits, 
        bufferSizeInBytes); 

      // calculate the buffer size used in the file operation. 
      mBufferSizeInBytes = minBufferSizeInBytes * 2; 

      // reset the save file setup 
      String rawFilePath = WaveFileWrapper 
        .getRawFilePath(RAW_PCM_FILE_NAME); 

      try { 
       File file = new File(rawFilePath); 
       if (file.exists()) { 
        file.delete(); 
       } 

       mFos = new FileOutputStream(file); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      if (mInRecording == false) { 

       mRecordThread = new Thread(recordRunnable); 
       mRecordThread.setName("Demo.AudioRecord"); 
       mRecordThread.start(); 

       mRecordLogTextView.setText(" Audio starts recording"); 

       mInRecording = true; 

       // enable the stop button 
       mRecordStopButton.setEnabled(true); 

       // disable the start button 
       mRecordStartButton.setEnabled(false); 
      } 

      // show the log info 
      String audioInfo = " Audio Information : \n" 
        + " sample rate = " + mRecordFrequency + "\n" 
        + " channel = " + mRecordChannel + "\n" 
        + " sample byte = " + mRecordBits; 
      mRecordLogTextView.setText(audioInfo); 

     } 
    }); 

    mRecordStopButton = (Button) rootView 
      .findViewById(R.id.audio_record_stop); 
    mRecordStopButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      if (mInRecording == false) { 

       Log.d(TAG, "current NOT in Record"); 

      } else { 

       // stop recording 
       if (mRecordThread != null) { 

        Log.d(TAG, "mRecordThread is not null"); 

        mInRecording = false; 

        Log.d(TAG, "set mInRecording to false"); 

        try { 
         mRecordThread.join(TIMEOUT_FOR_RECORD_THREAD_JOIN); 
         Log.d(TAG, "record thread joins here"); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 

        mRecordThread = null; 

        // re-enable the start button 
        mRecordStartButton.setEnabled(true); 

        // disable the start button 
        mRecordStopButton.setEnabled(false); 

       } else { 
        Log.d(TAG, "mRecordThread is null"); 
       } 
      } 
     } 
    }); 

luego puede guardar los datos pcm en un archivo WAV.

+0

¿Deseas compartir el código completo? –

Cuestiones relacionadas