我正在尝试为android平台构建一个音乐分析应用程序。
该应用程序是使用MediaRecorder.AudioSource.MIC
录制的音乐从麦克风和他们编码它PCM16位与11025频率,但录制的音频样本是非常低的质量有没有办法让它更好,降低噪音?
mRecordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC,FREQUENCY, CHANNEL,ENCODING, minBufferSize);
mRecordInstance.startRecording();
do
{
samplesIn += mRecordInstance.read(audioData, samplesIn, bufferSize - samplesIn);
if(mRecordInstance.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED)
break;
}
while (samplesIn < bufferSize);
提前感谢
发布于 2015-06-19 06:14:09
上面的解决方案对我不起作用。
于是,我四处寻找,找到了this article。
长话短说,我用MediaRecorder.AudioSource.VOICE_RECOGNITION代替了AudioSource.MIC,这给了我非常好的效果,背景中的噪音也减少了很多。
这个解决方案的伟大之处在于,它可以与AudioRecord和MediaRecorder类一起使用。
发布于 2014-03-09 13:14:00
SR和缓冲区大小的最佳组合非常依赖于设备,因此您的结果将因硬件而异。我使用这个实用程序来找出运行Android4.2或更高版本的设备的最佳组合;
public static DeviceValues getDeviceValues(Context context) {
try {
AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
try {
Method getProperty = AudioManager.class.getMethod("getProperty", String.class);
Field bufferSizeField = AudioManager.class.getField("PROPERTY_OUTPUT_FRAMES_PER_BUFFER");
Field sampleRateField = AudioManager.class.getField("PROPERTY_OUTPUT_SAMPLE_RATE");
int bufferSize = Integer.valueOf((String)getProperty.invoke(am, (String)bufferSizeField.get(am)));
int sampleRate = Integer.valueOf((String)getProperty.invoke(am, (String)sampleRateField.get(am)));
return new DeviceValues(sampleRate, bufferSize);
} catch(NoSuchMethodException e) {
return selectBestValue(getValidSampleRates(context));
}
} catch(Exception e) {
return new DeviceValues(DEFAULT_SAMPLE_RATE, DEFAULT_BUFFER_SIZE);
}
}
这将使用反射来检查getProperty方法是否可用,因为此方法是在API17级中引入的。如果您针对特定设备类型进行开发,则可能需要尝试不同的缓冲区大小和采样率。我用作后备的默认值是;
`private static final int DEFAULT_SAMPLE_RATE = 22050; private static final int DEFAULT_BUFFER_SIZE = 1024;`
此外,我通过查看getMinBufferSize是否返回合理的值来检查各种SR;
private static List<DeviceValues> getValidSampleRates(Context context) {
List<DeviceValues> available = new ArrayList<DeviceValues>();
for (int rate : new int[] {8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000}) { // add the rates you wish to check against
int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
if (bufferSize > 0 && bufferSize < 2048) {
available.add(new DeviceValues(rate, bufferSize * 2));
}
}
return available;
}
这取决于这样的逻辑:如果getMinBufferSize返回0,则该采样率在器件中不可用。您应该针对您的特定用例来试验这些值。
发布于 2020-09-08 09:28:03
虽然这是一个古老的问题,但以下的解决方案将是有帮助的。我们可以使用MediaRecorder轻松地录制音频。
private void startRecording() {
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.setAudioEncodingBitRate(96000)
recorder.setAudioSamplingRate(44100)
recorder.setOutputFile(".../audioName.m4a");
try {
recorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
recorder.start();
}
注意:
使用
MediaRecorder.AudioEncoder.AAC
是因为在iOS中不再支持MediaRecorder.AudioEncoder.AMR_NB
编码。为保证声音清晰度,应根据需要使用96000或128000的Referencehttps://stackoverflow.com/questions/22282353
复制相似问题