以下代码偶尔会生成java.lang.IllegalStateException:
int iInputBufIndex = _mcDecoder.dequeueInputBuffer(TIMEOUT_USEC);
其中_mcDecoder是MediaCodec的一个实例。解码流是H.264视频。代码在大多数情况下运行良好。 有没有办法主动检查MediaCodec的状态以避免这种异常?
堆栈跟踪:
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)
答案 0 :(得分:3)
如果编解码器内部返回错误,则抛出此异常。这可以是例如由错误的比特流引起(虽然解码器大多应该处理我认为)或者可能是错误地传递数据包。 (尝试通过现代Qualcomm芯片组上的MediaCodec解码隔行扫描的H.264视频也会导致对象进入错误状态,例如https://code.google.com/p/android/issues/detail?id=72336 - 这个问题特别令人讨厌,因为它在尝试关闭时会崩溃整个过程编解码器。)
除了注意异常之外,没有办法知道发生这种情况(除了阅读系统日志之外)。 (或许这是一个很好的补充作为一个新的API?)我不太确定它是否能继续尝试提供解码器,如果它能设法恢复,或者如果它&#39失败的原因,整个解码器应该关闭。