what is good setAudioEncodingBitRate on record voice

I am using bellow configurations and gives amazing clear recording output.

localFileName = getFileName()+".wav";
localFile = new File(localdir, localFileName);
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mRecorder.setOutputFormat(AudioFormat.ENCODING_PCM_16BIT);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setAudioChannels(1);
mRecorder.setAudioEncodingBitRate(128000);
mRecorder.setAudioSamplingRate(44100);
mRecorder.setOutputFile(localFile.getPath());

however if you are recording along with playing audio simultaneously it has some issues in samsung devices.

[but again only when you are playing audio and recording both together at the same time]


I find that the encoding bitrate should be calculated from the sample rate.

There is a good write-up of how these values relate on https://micropyramid.com/blog/understanding-audio-quality-bit-rate-sample-rate/

I use 8:1 compression for high-quality recordings. I prefer 48 KHz sampling, but the same logic works at an 8000 Hz sample rate requested for this post.

final int BITS_PER_SAMPLE = 16;       // 16-bit data
final int NUMBER_CHANNELS = 1;        // Mono
final int COMPRESSION_AMOUNT = 8;     // Compress the audio at 8:1


public MediaRecorder setupRecorder(String filename, int selectedAudioSource, int sampleRate) {
    final int uncompressedBitRate = sampleRate * BITS_PER_SAMPLE * NUMBER_CHANNELS;
    final int encodedBitRate = uncompressedBitRate  / COMPRESSION_AMOUNT;
    mediaRecorder = new MediaRecorder();
    try  {
        mediaRecorder.setAudioSource(selectedAudioSource);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        mediaRecorder.setAudioSamplingRate(sampleRate);
        mediaRecorder.setAudioEncodingBitRate(encodedBitRate);
        mediaRecorder.setOutputFile(filename);
    }catch (Exception e) {
        // TODO
    }
    return mediaRecorder;
}

MediaRecorder mediaRecorder = setupRecorder(this.file.getAbsolutePath(), 
                                   MediaRecorder.AudioSource.MIC, 
                                   8000);

You set the AudioEncodingBitRate too low. I made the same mistake :-)

This seems to work:

MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
if (Build.VERSION.SDK_INT >= 10) {
    recorder.setAudioSamplingRate(44100);
    recorder.setAudioEncodingBitRate(96000);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
} else {
    // older version of Android, use crappy sounding voice codec
    recorder.setAudioSamplingRate(8000);
    recorder.setAudioEncodingBitRate(12200);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
}
recorder.setOutputFile(file.getAbsolutePath());
try {
    recorder.prepare();
} catch (IOException e) {
    throw new RuntimeException(e);
}

The idea comes from here

plus: read the docs. The docs of setAudioSamplingRate say the following:

The sampling rate really depends on the format for the audio recording, as well as the capabilities of the platform. For instance, the sampling rate supported by AAC audio coding standard ranges from 8 to 96 kHz, the sampling rate supported by AMRNB is 8kHz, and the sampling rate supported by AMRWB is 16kHz.

Tags:

Android