Android 如何防止MediaCodec.dequeueInputBuffer生成java.lang.IllegalStateException

Android 如何防止MediaCodec.dequeueInputBuffer生成java.lang.IllegalStateException,android,android-mediacodec,Android,Android Mediacodec,以下代码偶尔会生成java.lang.IllegalStateException: int iInputBufIndex = _mcDecoder.dequeueInputBuffer(TIMEOUT_USEC); 其中\u mcDecoder是MediaCodec的一个实例。解码的流是H.264视频。该代码在大多数情况下运行良好。 有没有办法主动检查MediaCodec的状态以避免此异常 堆栈跟踪: java.lang.IllegalStateException at androi

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

 int iInputBufIndex = _mcDecoder.dequeueInputBuffer(TIMEOUT_USEC);
其中\u 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视频进行解码也会导致对象进入错误状态,请参见示例。-这一次尤其令人讨厌,因为它在尝试关闭编解码器时会使整个过程崩溃。)


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

发布完整的堆栈跟踪,否则我们不知道非法状态是什么。这是一个非常普通的异常。根据您的请求添加了堆栈跟踪。谢谢。我将继续捕捉异常。