Kitkat/Lollipop的音质差异

use*_*159 7 xml

我试图在Android上录制音频并遇到质量问题,分别是所选格式.

我使用以下设置

mr=new MediaRecorder();
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
mr.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mr.setOutputFile("somepath");
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
Run Code Online (Sandbox Code Playgroud)

然而,该代码在运行不同Android版本(4.4.4和5.1.1)的两台设备上返回截然不同的结果.

当我看一下文件头时,它会显示两个文件的不同格式(4.4.4上的3gp4 - 5.1.1上的mp42).然而,VLC"坚持"使用AAC,但显示了非常不同的采样率,4.4.4文件为8k,5.1.1为48k.

有谁知道为什么?

m.a*_*bin 1

尝试设置所有这些:

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //I would use MediaRecorder.AudioEncoder.AMR_NB
recorder.setAudioEncodingBitRate(16);
recorder.setAudioSamplingRate(44100);
recorder.setOutputFile(outputFile.getAbsolutePath());
recorder.prepare();
recorder.start();
Run Code Online (Sandbox Code Playgroud)

或使用外部库:http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/releases/RehearsalAssistant_0_8_2/src/urbanstew/RehearsalAssistant/

通过更换录音机:

 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();
Run Code Online (Sandbox Code Playgroud)

更新

还要检查一下:

MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
if (Build.VERSION.SDK_INT >= 10) {
    recorder.setAudioSamplingRate(44100);
    recorder.setAudioEncodingBitRate(96000);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
} else {
    // older version of Android, use crappy sounding voice codec
    recorder.setAudioSamplingRate(8000);
    recorder.setAudioEncodingBitRate(12200);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
}
recorder.setOutputFile(file.getAbsolutePath());
try {
    recorder.prepare();
} catch (IOException e) {
    throw new RuntimeException(e);
}
Run Code Online (Sandbox Code Playgroud)

SDK低于10的设备似乎无法录制良好的质量。