7

Mam problem z korzystaniem z MediaRecorder Android do nagrywania dźwięku z mikrofonu do plików .m4a (AAC-LC, MPEG-4). Począwszy od poziomu 18 interfejsu API, domyślna częstotliwość próbkowania spada z 44,1 lub 48 kHz (w zależności od urządzenia) do zaledwie 8 Hz. Jeśli określę częstotliwość próbkowania za pomocą MediaRecorder.setAudioSamplingRate, użyje ona określonej szybkości, ale w nagraniu jest dużo dziwnego szumu.Android MediaRecorder Częstotliwość próbkowania i szum

W LogCat następujące ostrzeżenie dzieją się od czasu do czasu:

(1) Tag: AudioSource Tekst: AudioRecord poinformowało opanowane

(2) Tag: AudioFlinger Tekst: RecordThread: przepełnienia bufora

Oto kod:

MediaRecorder recorder = new MediaRecorder(); 
recorder.setAudioChannels(2); 
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
recorder.setAudioSamplingRate(48000); // if not specified, defaults to 8kHz, if specified 44.1 or 48 kHz, lots of noise 
recorder.setOutputFile("test.m4a"); 

try { 
    recorder.prepare(); 
    recorder.start(); 

} catch (IOException ioe) { 
    Log.e(TAG, "IOException", ioe); 
} catch (IllegalStateException ise) { 
    Log.e(TAG, "IllegalStateException", ise); 
} catch (Exception e) { 
    Log.e(TAG, "Exception", e); 
} 

Każda pomoc jest bardzo doceniana.

+0

Czemu ustawiania liczby kanałów audio do 2 podczas nagrywania z mikrofonu? – Squonk

+0

Dobra rada Squonk, dzięki, ale to nie ma znaczenia. Nawet jeśli używam 1 kanału audio, problem nadal istnieje. Jeszcze jedno odkrycie, jednak w LogCat widzę od czasu do czasu następujące 2 ostrzeżenie: (1) AudioSource - AudioRecord zgłoszone przekroczenie (2) AudioFlinger - RecordThread: przepełnienie bufora – Justin

+0

Eksperyment z koderami diff i szybkościami (22050, 16000). Kodeki wymienione w dokumentach androida "formaty mediów" –

Odpowiedz

2

Możesz ustawić zarówno SamplingRate (tak, jak to zrobiłeś), jak i EncodingBitRate, które pominąłeś.

udało mi się osiągnąć bardzo wysoką jakość nagrania przy użyciu następujących:

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC); 
    mRecorder.setAudioSamplingRate(48000); 
    mRecorder.setAudioEncodingBitRate(384000); 

to zakoduje z 8 bitów na próbkę, która jest prawdopodobnie poza dostępnej jakości mikrofon na większości urządzeń.

+0

Ale to wydaje bardzo hałaśliwy dźwięk, to jest jak OVER high sound –

+0

Nie miałem tego doświadczenia w ogóle, a ja użyłem tego kodu na rozsądnym zakresie urządzeń. Być może niektóre urządzenia mają z tym problem? Czy próbowałeś dostosować (a) od 48000 do 44100 i/lub (b) od 384000 do 160000 – karora

+0

Cóż, prawdopodobnie .. ale sprawdź moją odpowiedź w dół, działa ona w 100%! –

0

Po długich badaniach i próbach, to najlepszym rozwiązaniem roboczego zrobiłem:

mRecorder = new MediaRecorder(); 
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
mRecorder.setAudioEncodingBitRate(384000); 
mRecorder.setAudioSamplingRate(44100); 
+0

Gdyby tylko było jakiś sposób zapytać o urządzenie, jaka jest prawdziwa częstotliwość próbkowania sprzętu, więc możesz spokojnie wybrać 44100 vs 48000 bez konieczności sprawdzania listy na http: // audiobuffersize. appspot.com/, który jest skompilowany z aplikacji https://play.google.com/store/apps/details?id=com.levien.audiobuffersize – karora

+0

Woah, to duża lista! i tak, chciałbym, żeby ktoś mógł znaleźć kod do tego! ALBO, ktoś może zrobić bibliotekę, która zawiera tablicę urządzeń modelowych z każdą częstością próbkowania i na podstawie telefonu, który uruchamia aplikację, może ją ustawić z prawej tablicy? –

Powiązane problemy