Need a simple example for audio recording

后端 未结 2 621
名媛妹妹
名媛妹妹 2020-12-14 12:38

I am in need of simple audio recording and playing example using AudioRecorder in android. I tried with MediaRecorder, it works fine.

相关标签:
2条回答
  • 2020-12-14 12:55

    You mean AudioRecord? Search e.g. "AudioRecord.OnRecordPositionUpdateListener" using Google Code Search. Btw, AudioRecord does recording, not playing.

    See also:

    • Improve Android Audio Recording quality?
    • Android AudioRecord class - process live mic audio quickly, set up callback function
    0 讨论(0)
  • 2020-12-14 12:57

    here is the sample code for audio record.

        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();
            }
    
        }
    };
    

    then you need two buttons (or one acts as different function in the different time) to start and stop the record thread.

            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");
                    }
                }
            }
        });
    

    then you can save the pcm data into a WAV file.

    0 讨论(0)
提交回复
热议问题