android - 如何防止由 MediaCodec.dequeueInputBuffer 生成的 java.lang.IllegalStateException

标签 android android-mediacodec

以下代码偶尔会产生 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/

相关文章:

android - 安全回放 : Crash observed in MediaCodec

android - 从 GLSurfaceView 录制视频和音频并将其导出到 .mp4

android - 为什么在偏远的地方无法获取 GPS 坐标?

Android MediaCodec eglSwapBuffer 在异步模式下阻塞 GPU

android - 如何检测Android设备中的芯片组信息?

android - 如何在android中设计类似布局

android - 有没有办法检索 MediaCodec 实例的限制?

java - 是否可以在 Gradle 中声明一个可在 Java 中使用的变量?

android - 如何知道用户是否订阅了 FCM 中的主题?

java - 如何对 recyclerView 进行分组,在组之间添加分隔线并为每个组添加一个图标