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)
答案 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。
我希望这可以澄清您的问题
最诚挚的问候
克里斯