为什么 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 错误,从而导致编解码器未被重新初始化并最终非法状态异常。
我希望这能澄清你的问题
此致
克里斯
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 错误,从而导致编解码器未被重新初始化并最终非法状态异常。
我希望这能澄清你的问题
此致
克里斯