2016-01-29 15 views
7

Próbuję nagrać dźwięk na Androida i napotkać problemy z jakością lub wybranym formatem.Różnica w jakości dźwięku na Kitkat/Lollipop

użyć następujących ustawień

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

jednak, że kod zwraca bardzo różne wyniki na dwóch urządzeniach z systemem różnych wersji Androida (4.4.4 i 5.1.1).

Kiedy przyjrzeć się nagłówkom pliku, pokazuje on różne formaty dla obu plików (3gp4 na 4.4.4 - mp42 na 5.1.1). VLC jednak "nalega" na oba używające AAC, ale pokazuje bardzo różne szybkości próbkowania, 8k dla pliku 4.4.4 i 48k dla 5.1.1.

Ktoś pomysł, dlaczego?

+0

Co, na litość, ma to związek z XML? –

Odpowiedz

1

spróbuj ustawić to wszystko:

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

Albo użyć zewnętrznej biblioteki: http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/releases/RehearsalAssistant_0_8_2/src/urbanstew/RehearsalAssistant/

Zmieniając rejestrator

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

Sprawdź również to:

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

Wygląda na to, że urządzenia z SDK niższym niż 10 nie mogą nagrywać dobrej jakości.

+0

Próbowałem już ustawić częstotliwość próbkowania, ale zdawało się to ignorować. Dodatkowo spróbuję ustawić szybkość transmisji bitów. Co do AMR_NB, to dałoby mi równie zła jakość dźwięku na wszystkich urządzeniach. Dlaczego wolisz to? – user5854159

+0

jest bardziej prawdopodobne, że zachowa się w taki sam sposób na wszystkich urządzeniach i nie jest tak źle. –

+0

Nadal muszę spróbować ** specjalnie ** ustawić szybkość bitów, ale w moich testach do tej pory wydawało się, że AMR_NB jest dużo bardziej stłumiony niż jego wyraźniejszy odpowiednik MP4. – user5854159