Cómo evitar java.lang.IllegalStateException generado por MediaCodec.dequeueInputBuffer

El siguiente código genera java.lang.IllegalStateException de vez en cuando:

int iInputBufIndex = _mcDecoder.dequeueInputBuffer(TIMEOUT_USEC); 

Donde _mcDecoder es una instancia de MediaCodec. El flujo decodificado es el vídeo H.264. El código funciona bien la mayor parte del tiempo. ¿Existe una manera de comprobar el estado de MediaCodec de forma proactiva para evitar esta excepción?

El seguimiento de la pila:

 java.lang.IllegalStateException at android.media.MediaCodec.dequeueInputBuffer(Native Method) at net.mydomain.android.MYNAMESPACE.MYCLASS.MyMethod0(Unknown Source) at net.mydomain.android.MYNAMESPACE.MYCLASS.ProcessH264(Unknown Source) at net.mydomain.android.MYNAMESPACE.MYCLASS.MyMethod1(Unknown Source) at net.mydomain.android.MYNAMESPACE.MYCLASS.MyMethod2(Unknown Source) at net.mydomain.android.MYNAMESPACE.MYCLASS.MyMethod3(Unknown Source) at net.mydomain.android.MYNAMESPACE.MYCLASS.access$5(Unknown Source) at net.mydomain.android.MYNAMESPACE.MYCLASS$1.run(Unknown Source) at java.lang.Thread.run(Thread.java:841) 

Esta excepción se activa si el códec internamente ha devuelto un error. Esto puede, por ejemplo, ser causado por un flujo de bits erróneo (aunque los decodificadores en su mayoría debe manejar que creo) o tal vez por pasar los paquetes de forma incorrecta. (Tratar de decodificar vídeo H.264 entrelazado a través de MediaCodec en chipsets modernos Qualcomm también hace que el objeto entre en el estado de error, consulte, por ejemplo, https://code.google.com/p/android/issues/detail?id=72336 – Y éste es particularmente desagradable porque bloquea todo el proceso al intentar apagar el códec.)

No hay manera de saber que esto ha sucedido (aparte de tal vez leer el registro del sistema) aparte de darse cuenta de las excepciones. (Tal vez eso sería una buena adición como una nueva API?) No estoy muy seguro si alguna vez funciona para seguir tratando de alimentar el decodificador si se logran recuperar, o si es una causa perdida y el conjunto Descodificador debe estar cerrado.

  • Android cambia el tamaño de VirtualDisplay
  • No se puede mux tanto de audio como de vídeo
  • Múltiples instancias de MediaCodec
  • Descodificación del búfer de salida de MediaCodec
  • MediaCodec y PCM de 24 bits
  • Android MediaCodec: Reduce el tamaño del video mp4
  • MediaExtractor, MediaMetadataRetriever con archivo Raw / Asset
  • Adición de mapa de bits de marca de agua en video en android: MediaMuxer de 4.3 o ffmpeg
  • Cambiar el tamaño de la vista de la superficie para el cambio de la relación de aspecto en la visualización de vídeo en android
  • Cómo transmitir datos de MediaCodec a AudioTrack con Xamarin para Android
  • ¿Cómo pasar la vista previa de la cámara a la superficie creada por MediaCodec.createInputSurface ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.