Варианты кодеков Android AudioRecord и AudioTrack?

В настоящее время я использую классы AudioTrack и AudioRecord в Android.

Я использую чистые данные PCM, но мне было интересно, какие у меня варианты для других кодеков?

С этой страницы кажется, я могу кодировать и декодировать только с помощью узкополосного AMR?

В настоящее время я настроил классы Audio следующим образом:

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

Итак, мой вопрос: как мне изменить кодировку с PCM на один из других поддерживаемых кодеков?

Когда я пытаюсь изменить ENCODING_PCM_16BIT в AudioFormat, я получаю только параметры кодировки по умолчанию или недопустимую кодировку вместе с параметрами PCM.

Любые ссылки на учебные пособия по кодированию и декодированию звука на Android были бы замечательными, если бы кто-нибудь знал о какой-либо или любой помощи здесь с большой благодарностью.

Спасибо

РЕДАКТИРОВАТЬ: я изменил свой код на следующий:

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

Код работает правильно, но мне интересно, действительно ли он кодирует звук как AMR_NB, и если это неправильный способ сделать это?

При использовании необработанного PCM у меня происходило переполнение буфера, но с тех пор, как я использовал новый код с MediaRecorder.AudioEncoder.AMR_NB вместо AudioFormat.PCM, этого не произошло.


person Donal Rafferty    schedule 03.02.2010    source источник
comment
Вы давно не публиковали свой вопрос, но, возможно, он все еще кому-то интересен ... Вы не кодируете в AMR_NB. Флаги - это просто внутренние поля. MediaRecorder.AudioEncoder.AMR_NB - это 0x01 ... то же самое, что и AudioFormat.ENCODING_DEFAULT. Итак, вы просто используете кодировку по умолчанию.   -  person hacksteak25    schedule 23.04.2011


Ответы (1)


Как указано в документации для AudioRecord и AudioTrack:

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

вы можете работать только с 8-битным и 16-битным PCM. Если вам нужен звук в других форматах, либо не используйте AudioRecord и AudioTrack (попробуйте MediaRecorder и MediaPlayer), либо вам придется перекодировать его, используя свой собственный код, возможно, используя NDK.

AudioRecord и AudioTrack разработаны специально для случаев, когда рассматриваемый звук не поддерживается мультимедийным движком OpenCORE либо потому, что это не поддерживаемый кодек, либо не поддерживаемый протокол потоковой передачи (например, SIP).

person CommonsWare    schedule 03.02.2010