2016-01-29 2 views
7

Я пытаюсь записывать аудио на Android и сталкиваться с проблемами с качеством, соответственно выбранным форматом.Разница в качестве звука на Kitkat/Lollipop

Я использую следующие настройки

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

Этот код возвращает однако очень разные результаты на двух устройствах под управлением различных версий Android (4.4.4 и 5.1.1).

Когда я просматриваю заголовки файлов, он показывает разные форматы для обоих файлов там (3gp4 на 4.4.4 - mp42 на 5.1.1). VLC, однако, «настаивает» на использовании AAC, но показывает очень разные частоты дискретизации, 8k для файла 4.4.4 и 48k для 5.1.1.

У кого-нибудь есть идея, почему?

+0

Какое отношение это имеет к XML? –

ответ

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(); 

Или использовать внешнюю библиотеку: 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(); 

UPDATE

Проверьте также следующее:

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); 
} 

Похоже, что устройства с SDK ниже 10 не могут записывать хорошее качество.

+0

Я уже попытался установить частоту дискретизации, но, похоже, проигнорировал ее. Я также попробую установить скорость передачи битов. Что касается AMR_NB, это даст мне одинаково плохое качество звука на всех устройствах. Почему ты предпочитаешь это? – user5854159

+0

с большей вероятностью будет вести себя одинаково на всех устройствах, и это не так уж плохо. –

+0

Мне все же нужно попробовать ** конкретно ** установить скорость передачи битов, но в моих тестах пока казалось, что AMR_NB намного глубже, чем его более четкий аналог MP4. – user5854159