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

时间:2018-10-16 12:56:48

标签: mediacodec android-mediacodec

The official document说:“调用reset()使编解码器再次可用。您可以从任何状态调用它将编解码器移回未初始化状态。”

但是,以下代码偶尔会引发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)

1 个答案:

答案 0 :(得分:1)

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

如果MediaCodec实例处于释放状态,即“已释放”状态,则显然无法重置,从而导致IllegalStateException。

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

libstagefright源代码中的

A comment描述了重置调用的基本作用。

    /* 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错误,从而导致编解码器未重新初始化,并最终导致IllegalStateException。

我希望这可以澄清您的问题

最诚挚的问候

克里斯