2010-02-03 18 views
5

Obecnie używam klas AudioTrack i AudioRecord w systemie Android.Android AudioRecord i AudioTrack opcje kodeków?

Używam czystych danych PCM, ale zastanawiałem się, jakie są moje opcje dla innych kodeków?

Od this page wydaje się, że mogę tylko kodować i dekodować za pomocą wąskopasmowego AMR?

Obecnie skonfigurować klasy audio następująco:

arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        buffersize); 

atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        buffersize, 
        AudioTrack.MODE_STREAM); 

Więc moje pytanie brzmi jak mogę zmienić kodowanie PCM z jednego z innych obsługiwanych kodeków?

Kiedy próbuję zmienić ENCODING_PCM_16BIT na AudioFormat, otrzymuję tylko opcje domyślnego lub nieprawidłowego kodowania wraz z opcjami PCM.

Wszelkie linki do samouczków dotyczących kodowania i dekodowania dźwięku na urządzeniach z Androidem byłyby wspaniałe, gdyby ktoś znał jakąkolwiek pomoc w tym zakresie.

Dzięki

EDIT: ja zmieniłem kod do następujących:

arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        **MediaRecorder.AudioEncoder.AMR_NB**, 
        buffersize); 

atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        **MediaRecorder.AudioEncoder.AMR_NB**, 
        buffersize, 
        AudioTrack.MODE_STREAM); 

Kod działa poprawnie, ale zastanawiam się, czy to rzeczywiście kodowania audio, jak AMR_NB i, jeśli jest to nie jest to właściwy sposób?

byłem coraz przepełnienie bufora przy użyciu surowego PCM ale żaden z nich nie pojawił się od korzystania z nowego kodu z MediaRecorder.AudioEncoder.AMR_NB używany zamiast AudioFormat.PCM

+4

Minęło dużo czasu, odkąd opublikowałeś swoje pytanie, ale może nadal jest interesujące dla kogoś ... Nie kodujesz do AMR_NB. Flagi są po prostu int-polami. MediaRecorder.AudioEncoder.AMR_NB to 0x01 ... tak samo jak AudioFormat.ENCODING_DEFAULT. Więc używasz domyślnego kodowania. – hacksteak25

Odpowiedz

2

Jak stwierdza dokumentacji dla AudioRecord i AudioTrack:

audioFormat  the format in which the audio data is represented. See ENCODING_PCM_16BIT and ENCODING_PCM_8BIT 

można pracować tylko z 8-bitowym i 16-bitowym PCM. Jeśli chcesz audio w innych formatach, albo nie używaj AudioRecord i AudioTrack (spróbuj MediaRecorder i MediaPlayer) lub będziesz musiał transkodować go za pomocą własnego kodu, prawdopodobnie wykorzystując NDK.

AudioRecord i AudioTrack są zaprojektowane specjalnie dla przypadków, gdy dźwięk ten nie jest obsługiwany przez silnik multimedialnych OpenCORE, albo dlatego, że nie jest to obsługiwane kodek lub nie obsługiwany protokół strumieniowych (np SIP).