我的项目要求我能够在Android设备上录制音频。我使用MediaRecorder()实现了解决方案,但录制的音频质量很差。我究竟做错了什么?我必须认为这不能记录音频的唯一方法:)也许我做错了什么,我在下面包括我的代码。请指出正确的方向。
谢谢!
MediaRecorder recorder = new MediaRecorder();
File outputFile = new File(Environment.getExternalStorageDirectory(), "audio.3gp");
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(outputFile.getAbsolutePath());
recorder.prepare();
recorder.start();
// stop
recorder.stop();
recorder.reset();
recorder.release();
答案 0 :(得分:9)
试试这段代码:
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();
你会得到一些改善,但不要期望太多。您始终可以尝试使用此OpenSource项目中的RehearsalAudioRecord类来保存未压缩的文件
将类实现到项目中的方法非常简单。您只需要通过以下方式替换MediaRecorder:
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();
您将能够记录相当大的WAVE文件,但如果您需要质量,则是唯一的方法。请注意,在较旧的设备中,此代码可以
答案 1 :(得分:8)
AMR_NB发臭。
将比特率设置为16,采样率设置为44100。
3gpp一般很臭,请尝试使用AAC / MPEG_4。
试试这个并更新我们。
答案 2 :(得分:7)
我在录音质量方面遇到的一个大问题是我将比特率设置得太低,为16. 16是一个通常与比特深度相对应的值,而不是比特率。比特率通常列为kbps,但MediaRecorder.setAudioEncodingBitRate()采用bps(注意没有“k”)。试试这个:
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();
你需要检查supported media formats以找出格式(音频编码器),容器(输出格式),采样率的正确匹配(通常以kHz为单位,但传递给MediaRecorder.setSamplingRate()只是Hz)和比特率(通常以kbps为单位)。请注意,并非文档中的所有格式都指定了比特率;在这种情况下,使用上面代码中的方法应该对正确的比特率进行合理的猜测。
感谢@StarPinkER,@ PrvN,@arlomedia在这个SO answer帮助我解决这个问题。
答案 3 :(得分:2)
我使用了以下设置,并获得了很好的音频效果。
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.setAudioEncodingBitRate(128000);
recorder.setAudioSamplingRate(96000);
答案 4 :(得分:0)
没有听到音频,我说不出多少。
您可以更改MediaRecord对象上的方法 - 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.
尝试更改这些内容,看看是否有任何更改有助于提高音频质量。