以下代码偶尔会生成 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)
最佳答案
如果编解码器内部返回错误,则会引发此异常。这可以例如是由错误的比特流引起的(尽管我认为解码器主要应该处理)或者可能是由错误地传递数据包引起的。 (尝试在现代高通芯片组上通过 MediaCodec 解码隔行 H.264 视频也会导致对象进入错误状态,例如 https://code.google.com/p/android/issues/detail?id=72336 - 这个尤其令人讨厌,因为它在尝试关闭编解码器时使整个过程崩溃。 )
除了注意到异常之外,没有办法知道这已经发生了(除了可能阅读系统日志)。 (作为一个新的 API,这可能是一个很好的补充?)我不太确定它是否可以继续尝试为解码器提供数据,如果它能够设法恢复,或者它是否是一个失败的原因和整个解码器应该关闭。
关于android - 如何防止MediaCodec.dequeueInputBuffer产生的java.lang.IllegalStateException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25352419/