【发布时间】:2015-03-15 07:36:33
【问题描述】:
我在使用 Android 的 MediaRecorder 将声音从麦克风录制到 .m4a 文件(AAC-LC、MPEG-4 容器)时遇到问题。从 API 级别 18 开始,默认采样率从 44.1 或 48 kHz(取决于设备)降至仅 8 Hz。如果我使用 MediaRecorder.setAudioSamplingRate 指定采样率,它会使用指定的采样率,但录音中有很多奇怪的噪音。
在 LogCat 中,不时会出现以下警告:
(1) 标签:音频源 文本: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);
}
非常感谢任何帮助。
【问题讨论】:
-
为什么在从麦克风录音时将音频通道数设置为 2?
-
好点 Squonk,谢谢,但没关系。即使我使用 1 个音频通道,问题仍然存在。还有一个发现,在 LogCat 中,我不时看到以下 2 个警告:(1)AudioSource - AudioRecord 报告溢出(2)AudioFlinger - RecordThread:缓冲区溢出
-
用差异编码器和速率(22050、16000)进行实验。 android docs“媒体格式”中列出的编解码器
-
@Justin:是的,缓冲区溢出/溢出可能会导致样本被丢弃,从而导致奇怪的结果。有时使用 MP3 并不算太糟糕,但 MP4 音频确实会变得一团糟。
-
@Robert - 谢谢。尝试尝试不同的采样率,有类似的噪音问题。看起来每当我指定除默认值 (8kHz) 以外的采样率时,缓冲区就会溢出,因此会出现噪音。
标签: android audio-recording buffer-overflow mediarecorder sampling