以下代码偶尔会产生 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)
最佳答案
如果编解码器内部返回错误,则会抛出此异常。这可以例如由错误的比特流引起(尽管我认为解码器大多应该处理这个问题)或者可能是由错误地传递数据包引起的。 (尝试在现代 Qualcomm 芯片组上通过 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/