Android MediaRecorder采样率和噪音

Jus*_*tin 9 android buffer-overflow audio-recording sampling mediarecorder

我有一个问题,使用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);
}
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏.

kar*_*ora 2

您可以设置 SamplingRate(如您所做的那样)和 EncodingBitRate(您已省略)。

我已经能够使用以下方法实现非常高质量的录音:

    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
    mRecorder.setAudioSamplingRate(48000);
    mRecorder.setAudioEncodingBitRate(384000);
Run Code Online (Sandbox Code Playgroud)

这将以每个样本 8 位进行编码,这可能超出了大多数设备上麦克风的可用质量。