very poor quality of audio recorded on my droidx using MediaRecorder, why?

自作多情 提交于 2019-11-28 00:11:08

AMR_NB stinks.

Set the bitrate to 16 and sampling rate to 44100.

3gpp generally stinks, try using AAC/MPEG_4 instead.

Try this and update us.

Try this code:

MediaRecorder recorder = new MediaRecorder();
File outputFile = new File(Environment.getExternalStorageDirectory(), "audio.3gp");
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setAudioEncodingBitRate(16);
recorder.setAudioSamplingRate(44100);
recorder.setOutputFile(outputFile.getAbsolutePath());
recorder.prepare();
recorder.start();

You are going to get some improvement but don't expect too much. You can always try to save uncompressed by using the RehearsalAudioRecord class from this OpenSource project

http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/releases/RehearsalAssistant_0_8_2/src/urbanstew/RehearsalAssistant/

The way to implement the class into your project is very simple. You just need to replace your MediaRecorder by:

RehearsalAudioRecorder recorder = new RehearsalAudioRecorder(RehearsalAudioRecorder.RECORDING_UNCOMPRESSED, MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT);
recorder.setOutputFile(outputFile.getAbsolutePath());
recorder.prepare();
recorder.start();

You will be able to record WAVE files which are quite large but if you require quality is the only way to go. Please note that in older devices this code could

Grant

The big problem I had in my audio recording quality was that I set the bit rate way too low at 16. 16 is a value that generally corresponds to bit depth, not bit rate. Bit rate is usually listed as kbps, but MediaRecorder.setAudioEncodingBitRate() take bps (note no "k"). Try this:

MediaRecorder recorder = new MediaRecorder();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(...);
recorder.setAudioEncoder(...);

final int bitDepth = 16;
final int sampleRate = 44100;
final int bitRate = sampleRate * bitDepth;

recorder.setAudioEncodingBitRate(bitRate);
recorder.setAudioSamplingRate(sampleRate);

recorder.setOutputFile(...);

recorder.prepare();
recorder.start();
// stop
recorder.stop();
recorder.reset(); 
recorder.release();

You'll need to check supported media formats to figure out the correct matchings of format (audio encoder), container (output format), sampling rate (usually given in kHz but passed to MediaRecorder.setSamplingRate() as just Hz), and bit rate (usually given in kbps). Note that not all formats in the documentation have specified bit rates; using the method in the code above should give a fair guess at the proper bit rate in that case.

Thanks to @StarPinkER, @PrvN, @arlomedia in this SO answer for helping me clear this up.

I've used the following settings and got very good audio results.

recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); recorder.setAudioEncodingBitRate(128000); recorder.setAudioSamplingRate(96000);

Without hearing the audio, I can't tell much.

There are methods on the MediaRecord object you can alter - Android MediaRecorder object

void     setAudioEncoder(int audio_encoder)
    Sets the audio encoder to be used for recording.
void     setAudioEncodingBitRate(int bitRate)
    Sets the audio encoding bit rate for recording.
void     setAudioSamplingRate(int samplingRate)
    Sets the audio sampling rate for recording.

Try changing those and see if any of the changes helps with the audio quality.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!