Android AudioRecord vs. MediaRecorder do nagrywania dźwięku

93

Chcę nagrać ludzki głos na moim telefonie z Androidem. Zauważyłem, że Android ma do tego dwie klasy: AudioRecord i MediaRecorder . Czy ktoś może mi powiedzieć, jaka jest różnica między nimi i jakie są odpowiednie przypadki użycia dla każdego z nich?

Chcę móc analizować ludzką mowę w czasie rzeczywistym w celu pomiaru amplitudy itp. Czy mam rację, rozumiejąc, że AudioRecord lepiej nadaje się do tego zadania?

Zauważyłem na oficjalnej stronie przewodnika Androida do nagrywania dźwięku , używają MediaRecorder bez wzmianki o AudioRecord.

stackoverflowuser2010
źródło

Odpowiedzi:

84

Jeśli chcesz przeprowadzić analizę, gdy nagrywanie jest nadal w toku, musisz użyć programu AudioRecord, ponieważ MediaRecorderautomatycznie zapisuje do pliku. AudioRecordma tę wadę, że po wywołaniu startRecording()trzeba samemu odpytać dane z AudioRecordinstancji. Ponadto musisz odczytywać i przetwarzać dane na tyle szybko, aby wewnętrzny bufor nie był przepełniony (spójrz na wyjście logcat, AudioRecordpowie ci, kiedy to się stanie).

Stephan
źródło
Czy masz przykładowy kod AudioRecord? Większość z tych, które znalazłem, to MediaRecorder ...
Rommel Paras
@RommelParas wygląda w tej klasie w „telegramie” dla źródła Androida. github.com/DrKLO/Telegram/blob/master/TMessagesProj/src/main/…
David
@David Czy znasz bardziej podstawową próbkę? Taki, który działa samodzielnie?
programista Androida,
@androiddeveloper niestety nie.
David
34

Jak rozumiem, MediaRecorderjest to czarna skrzynka, która daje skompresowany plik audio na wyjściu i AudioRecorderdaje tylko surowy strumień dźwięku i musisz go skompresować samodzielnie.

MediaRecorderpodaje maksymalną amplitudę od ostatniego wywołania getMaxAmplitude()metody, dzięki czemu można na przykład zaimplementować wizualizator dźwięku.

Dlatego w większości przypadków MediaRecorderjest to najlepszy wybór, z wyjątkiem tych, w których należy wykonać skomplikowane przetwarzanie dźwięku i potrzebujesz dostępu do surowego strumienia audio.

Lampapos
źródło
1
Dziękujemy za wspomnienie o metodzie getMaxAmplitude (). To prawdopodobnie wszystko, czego potrzebuję.
Dheeraj Bhaskar
Jak mogę zaimplementować wizualizator za pomocą MediaRecorder?
OnePunchMan
1
Co dokładnie w tym miejscu pomaga getMaxAmplitude? Czy nie musisz w każdej chwili pobierać aktualnego dla wizualizatora?
programista Androida,
18

AudioRecorderer najpierw zapisuje dane w minBuffer, a następnie są kopiowane stamtąd do bufora tymczasowego, w MediaRecorder kopiowane są do plików. W AudioRecorder potrzebujemy api setRecordPosition (), aby skopiować zapisane dane na wymaganą pozycję, podczas gdy w MediaRecorder to zadanie wykonuje wskaźnik pliku, aby ustawić pozycję znacznika. AudioRecorder może być używany do tych aplikacji, które działają na emulatorze, można to zrobić, zapewniając niską częstotliwość próbkowania, taką jak 8000, podczas gdy za pomocą MediaRecorder nie można nagrywać dźwięku za pomocą emulatora. W AudioRecord ekran zasypia po pewnym czasie, podczas gdy w MediaRecorder ekran nie śpi.

sanjeev51
źródło