2011-02-15 59 views
5

我的项目需要我能够在Android设备上录制音频。我使用MediaRecorder()实现了解决方案,但录制的音频质量很差。我究竟做错了什么?我必须认为,这不能是录制音频的唯一方法:)也许我做错了什么,我在下面包括我的代码。请指点我正确的方向。使用MediaRecorder录制在我的droidx上的音频质量很差,为什么?

谢谢!

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

回答

7

AMR_NB太臭。

将比特率16和采样率,以44100

3GPP一般太臭,请尝试使用AAC/MPEG_4代替。

试试这个,我们更新。

+0

感谢,这工作:)我还使用了如下typo.pl的答案,但我不能他们两人标记为答案,谁能帮助? – 2011-02-16 04:25:00

+0

不确定如何帮助,但我可以告诉你,某些设备,你将无法获得更高质量的声音 - 这显然是一个芯片的限制。似乎只有一些设备,主要是1.5/1.6有限的设备。 – keltor 2011-02-16 06:09:47

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. 

尝试改变这些,并看看是否有任何变化与音频质量的帮助。

+0

您是否尝试过其中的任何人来吗? – CopsOnRoad 2018-03-06 17:07:26

8

试试这个代码:

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

你会得到一些改善,但不要抱太大的期望。你总是可以尝试保存未压缩的使用RehearsalAudioRecord类从这个开源项目

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

的方式来实现类到你的项目是非常简单的。你只需要通过更换您的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文件,这是相当大的,但如果你需要的品质是唯一的出路。请注意,在旧设备该代码可

+0

你在写东西。 `请注意,在较旧的设备中,此代码可以......' – CopsOnRoad 2018-03-06 17:06:24

4

最大的问题,我在我的录音质量是我设置的比特率在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弄清楚格式(音频编码器),集装箱(输出格式)的正确匹配数,采样率(一般在千赫给出,但传递给MediaRecorder.setSamplingRate( )就像Hz)和比特率(通常以kbps给出)。请注意,并非文档中的所有格式都指定了比特率;在这种情况下,使用上面代码中的方法应该适当地估计正确的比特率。

感谢@StarPinkER,@PrvN,在此SO answer @arlomedia帮助我清楚这件事。