为什么 MediaCodec.reset() 生成 java.lang.IllegalStateException

Why does MediaCodec.reset() generate java.lang.IllegalStateException

The official document 说:"Call reset() to make the codec usable again. You can call it from any state to move the codec back to the Uninitialized state."

但是,下面的代码偶尔会抛出java.lang.IllegalStateException:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    //do nothing
} else {
    try {
        mediaCodec.reset();
    } catch (Exception ex) {
          //occasionally throws java.lang.IllegalStateException
    }
}

异常:

Class: java.lang.IllegalStateException
 Stack trace: java.lang.IllegalStateException
    at android.media.MediaCodec.native_reset(Native Method)
    at android.media.MediaCodec.reset(MediaCodec.java:1794)

你是对的,文档在这里有点误导,因为 MediaCodec 实例可能处于两种不可重置的状态。

如果 MediaCodec 实例被释放,释放状态,它显然不可重置从而导致 IllegalStateException。

如果 MediaCodec 实例由于无法创建而处于错误状态,它也不可重置,但这次会导致 MediaCodec.CodecException。例如,如果您创建许多实例。

A comment 在 libstagefright 源代码中描述了重置调用的基本作用。

    /* When external-facing MediaCodec object is created,
       it is already initialized.  Thus, reset is essentially
       release() followed by init(), plus clearing the state */

如果您查看代码,您会发现当在已发布的 MediaCodec 实例上调用 release 时,它​​会导致 INVALID_OPERATION 错误,从而导致编解码器未被重新初始化并最终非法状态异常。

我希望这能澄清你的问题

此致

克里斯