我的 droidx 使用 MediaRecorder 录制的音频质量非常差,为什么?

问题描述 投票:0回答:6

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

谢谢!

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();
android audio recording
6个回答
12
投票

AMR_NB 很臭。

将比特率设置为 16,采样率设置为 44100。

3gpp 通常很糟糕,尝试使用 AAC/MPEG_4 代替。

尝试一下并更新我们的信息。


11
投票

我在音频录制质量方面遇到的大问题是我将比特率设置得太低,为 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();

您需要检查支持的媒体格式以找出格式(音频编码器)、容器(输出格式)、采样率(通常以 kHz 为单位给出,但传递给 MediaRecorder.setSamplingRate() 作为 Hz)的正确匹配和比特率(通常以 kbps 为单位)。请注意,并非文档中的所有格式都指定了比特率;在这种情况下,使用上面代码中的方法应该可以合理猜测适当的比特率。

感谢 @StarPinkER、@PrvN、@arlomedia 在这个SO回答中帮助我解决了这个问题。


9
投票

试试这个代码:

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 文件,但如果您需要质量,这是唯一的方法。请注意,在较旧的设备中,此代码可能


6
投票

我使用了以下设置并获得了非常好的音频效果。

recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
 recorder.setAudioEncodingBitRate(128000);
 recorder.setAudioSamplingRate(96000);


0
投票

如果没有听到音频,我无法透露太多。

MediaRecord 对象上有一些方法可以更改 - Android MediaRecorder 对象

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
投票

它对我有用:

val bitDepth = 16
val sampleRate = 44100
val bitRate = sampleRate * bitDepth

setAudioSource(MediaRecorder.AudioSource.MIC)
setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
setAudioEncodingBitRate(bitRate)
setAudioSamplingRate(sampleRate)
© www.soinside.com 2019 - 2024. All rights reserved.