我使用Android的MediaRecorder来记录麦克风到.m4a文件(AAC-LC,MPEG-4容器)的声音。从API级别18开始,默认采样率从44.1或48 kHz(取决于设备)降至仅8 Hz。如果我使用MediaRecorder.setAudioSamplingRate指定采样率,它会使用指定的速率,但录制中会有很多奇怪的噪音。
在LogCat中,会不时发出以下警告:
(1) 标签:AudioSource 文字:AudioRecord报告超限
(2) 标签:AudioFlinger 文本:RecordThread:缓冲区溢出
以下是代码:
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioChannels(2);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.setAudioSamplingRate(48000); // if not specified, defaults to 8kHz, if specified 44.1 or 48 kHz, lots of noise
recorder.setOutputFile("test.m4a");
try {
recorder.prepare();
recorder.start();
} catch (IOException ioe) {
Log.e(TAG, "IOException", ioe);
} catch (IllegalStateException ise) {
Log.e(TAG, "IllegalStateException", ise);
} catch (Exception e) {
Log.e(TAG, "Exception", e);
}
非常感谢任何帮助。
答案 0 :(得分:2)
您可以设置SamplingRate(就像您所做的那样)和您省略的EncodingBitRate。
我已经能够使用以下内容实现非常高质量的录制:
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
mRecorder.setAudioSamplingRate(48000);
mRecorder.setAudioEncodingBitRate(384000);
这将编码每个样本8位,这可能超出了大多数设备上麦克风的可用质量。
答案 1 :(得分:1)
经过长时间的研究和尝试,这是我做出的最佳解决方案:
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setAudioEncodingBitRate(384000);
mRecorder.setAudioSamplingRate(44100);