MediaCodec 生命周期
另外,MediaCodec 也存在相应的 生命周期,如下图所示:
当创建了 MediaCodec 之后,是处于未初始化的 Uninitialized
状态,调用 configure 方法之后就处于 Configured
状态,调用了 start 方法之后,就处于 Executing
状态。
在 Executing
状态下开始处理数据,它又有三个子状态,分别是:
-
Flushed
-
Running
-
End of Stream
当一调用 start 方法之后,就进入了 Flushed
状态,从输入缓冲区队列中取出一个缓冲区就进入了 Running
状态,当入队的缓冲区带有 EOS
标志时, 就会切换到 End of Stream
状态, MediaCodec 不再接受入队的缓冲区,但是仍然会对已入队的且没有进行编解码操作的缓冲区进行操作、输出,直到输出的缓冲区带有 EOS
标志,表示编解码操作完成了。
在 Executing
状态下可以调用 flush 方法,使 MediaCodec 切换到 Flushed
状态。
在 Executing
状态下可以调用 stop 方法,使 MediaCodec 切换到 Uninitialized
状态,然后再次调用 configure 方法进入 Configured
状态。另外,当调用 reset 方法也会进入到 Uninitialized
状态。
当不再需要 MediaCodec 时,调用 release 方法将它释放掉,进入 Released
状态。
当 MediaCodec 工作发生异常时,会进入到 Error
状态,此时还是可以通过 reset 方法恢复过来,进入 Uninitialized
状态。
MediaCodec 调用流程
理解了 MediaCodec 的生命周期和工作流程之后,就可以上手来进行编码工作了。
以 MediaCodec 同步调用为例,使用过程如下:
// 创建 MediaCodec,此时是 Uninitialize