2014-01-22 3 views
5

Я получаю строку IllegalStateException в MediaCodec.configure(), я пытаюсь записать аудио с помощью MediaCodec. Это происходит только на некоторых телефонах, на вкладках все в порядке. Этот конкретный пример сбоя - от Samsung Galaxy S4. Исключение следов:Illegal State Exception при вызове MediaCodec.configure()

01-22 17:33:38.379: V/ACodec(16541): [OMX.google.aac.decoder] Now Loaded 
01-22 17:33:38.379: V/ACodec(16541): onConfigureComponent 
01-22 17:33:38.379: W/ACodec(16541): [OMX.google.aac.decoder] Failed to set standard component role 'audio_encoder.aac'. 
01-22 17:33:38.379: E/ACodec(16541): [OMX.google.aac.decoder] configureCodec returning error -2147483648 
01-22 17:33:38.379: E/MediaCodec(16541): Codec reported an error. (omx error 0x80001001, internalError -2147483648) 
01-22 17:33:38.384: D/AndroidRuntime(16541): Shutting down VM 
01-22 17:33:38.384: W/dalvikvm(16541): threadid=1: thread exiting with uncaught exception (group=0x418d0700) 
01-22 17:33:38.414: W/BugSenseHandler(16541): Transmitting crash Exception Unable to resolve host "bugsense.appspot.com": No address associated with hostname 
01-22 17:33:41.404: E/AndroidRuntime(16541): FATAL EXCEPTION: main 
01-22 17:33:41.404: E/AndroidRuntime(16541): java.lang.IllegalStateException 
01-22 17:33:41.404: E/AndroidRuntime(16541): at android.media.MediaCodec.native_configure(Native Method) 
01-22 17:33:41.404: E/AndroidRuntime(16541): at android.media.MediaCodec.configure(MediaCodec.java:259) 
01-22 17:33:41.404: E/AndroidRuntime(16541): at com.example.poc.MyRenderer.startRecordPressed(MyRenderer.java:344) 

Аудио формат декларации:

MediaFormat format = new MediaFormat(); 
    format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm"); 
    format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC); 
    format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100); 
    format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1); 
    format.setInteger(MediaFormat.KEY_BIT_RATE, 64000); 

Аудио инициализация датчика:

 mAudioEncoder = MediaCodec.createEncoderByType("audio/mp4a-latm"); 
     mAudioEncoder.configure(mAudioFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); //<-This line fails 
     mAudioEncoder.start(); 

Кто-нибудь есть идеи, что это может быть? Странно, что это происходит только на некоторых устройствах. Любые предложения приветствуются!

+0

Настройка выглядит нормально. Еще одна особенность вашего кода заключается в том, что вы объявляете локальный формат MediaFormat, но позже вы, как представляется, используете переменную-член «mAudioEncoder». Можете ли вы подтвердить, что правильный формат используется? Возможно, запишите значение 'mAudioFormat' прямо перед вызовом' configure() '. – fadden

+0

Это просто экстракт, mAudioFormat инициализирован, я дважды проверял. Вы не знаете, что может быть проблемой? И как отладить это дальше? – Alexey

+0

CTS EncoderTest делает то, что делает ваш код, поэтому он должен абсолютно работать на всех устройствах. Можете ли вы добавить выход из журнала «MediaFormat» к вашему вопросу? Любопытно, что неудачи выходят из «OMX.google.aac.decoder» для кодировщика, но, возможно, это нормально. (Я не очень много работал со звуком.) – fadden

ответ

8

Я вижу эту же ошибку при попытке настроить видеокодек на некоторых устройствах Samsung, работающих под управлением Jellybean (4.1.2). Во многих случаях установка KEY_MAX_INPUT_SIZE 0 (перед вызовом конфигурирования) в параметрах формата будет исправить:

mVideoFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0); 

Я нашел это решение, исследуя подобную ошибку (https://stackoverflow.com/questions/15105843/mediacodec-jelly-bean#=), и были удивлены тем, как много конфигурации кодека Исправлены ошибки. Тем не менее, я не пробовал это на аудио кодеках, поэтому не гарантирую, что он будет работать в вашем случае:/

+4

Что происходит, когда 'KEY_MAX_INPUT_SIZE' установлен в 0? Мне не удалось найти какие-либо документы. –

+0

. Такая же проблема с декодерами видеороликов на растровых изображениях, задавая их 0, решает. – Arpan

+0

Это также фиксировало проблемы с Galaxy Nexus с Android 4.3 (воспроизведение некоторых видео с демонстрационным приложением ExoPlayer привело к сбою). Знаете ли вы, какое программное обеспечение/аппаратное обеспечение этой ошибки ограничено? – Stan

Смежные вопросы