如何防止MediaCodec.dequeueInputBuffer产生的java.lang.IllegalStateException

Hon*_*ong 6 android android-mediacodec

以下代码偶尔会生成 java.lang.IllegalStateException:

 int iInputBufIndex = _mcDecoder.dequeueInputBuffer(TIMEOUT_USEC);
Run Code Online (Sandbox Code Playgroud)

其中 _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)
Run Code Online (Sandbox Code Playgroud)

mst*_*sjo 6

如果编解码器内部返回了错误,则会引发此异常。例如,这可能是由错误的比特流引起的(尽管我认为解码器主要应该处理)或者可能是由错误地传递数据包引起的。(尝试在现代高通芯片组上通过 MediaCodec 解码隔行 H.264 视频也会导致对象进入错误状态,例如参见https://code.google.com/p/android/issues/detail?id=72336 -这个特别讨厌,因为它在尝试关闭编解码器时会导致整个过程崩溃。)

除了注意到异常之外,没有办法知道这已经发生了(除了可能阅读系统日志)。(作为一个新的 API,这可能是一个很好的补充?)我不太确定它是否可以继续尝试为解码器提供数据,如果它能够设法恢复,或者它是否是一个失败的原因和整个解码器应该关闭。