Android MediaCodec 状态(States)转换分析

本文详细介绍了MediaCodec在同步及异步模式下的状态转换过程,包括Stopped、Executing和Released三种主要状态及其子状态,并分析了不同模式下状态转换的具体流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*转载请注明出处:http://www.cnblogs.com/roger-yu/

 

概述

  在MediaCodec的生命周期内存在三种状态:Stopped, Executing or Released,其中

  Stopped状态包含三种子状态:Uninitialized, Configured and Error

  Executing状态包含三种子状态:Flushed, Running and End-of-Stream

  由于MediaCodec在不同的数据处理模式下状态间的转换会有些许差别,故接下来我们分别对同步处理模式异步处理模式下的状态转换做详细分析

 

同步模式下的状态转换(Synchronous Processing using Buffers)

  首先我们先看一下状态转换的流程图,如下:

 

  1. 当通过 MediaCodec.createByCodecName(...) or MediaCodec.createDecoderByType(...) or MediaCodec.createEncoderByType(...)三种方法中的任一种创建一个MediaCodec对象实例后,Codec将会处于 Uninitialized 状态;

  2. 当你调用 MediaCodec.configure(...)方法对Codec进行配置后,Codec将进入 Configured 状态;

  3. 之后可以调用 MediaCodec.start() 方法启动Codec,Codec会转入 Executing 状态,start后Codec立即进入 Flushed 子状态,此时的Codec拥有所有的input and output buffers,Client无法操作这些buffers;

  4. 一旦第一个input buffer 出队列,也即Client通过调用 MediaCodec.dequeueInputBuffer(...)请求得到了一个有效的input buffer index, Codec立即进入到了 Running 子状态,在这个状态下Codec会进行实际的数据处理(解码、编码)工作,度过它生命周期的主要阶段;

  5. 当输入端入队列一个带有 end-of-stream 标记的input buffer时(queueInputBuffer(EOS)),Codec将转入 End of Stream 子状态。在此状态下,Codec不再接受新的input buffer数据,但仍会处理之前入队列而未处理完的input buffer并产生output buffer,直到end-of-stream 标记到达输出端,数据处理的过程也随即终止;

  6. 在 Executing状态下可以调用 MediaCodec.flush()方法使Codec进入 Flushed 子状态;

  7. 在 Executing状态下可以调用 MediaCodec.stop()方法使Codec进入 Uninitialized 子状态,可以对Codec进行重新配置;

  8. 极少数情况下Codec会遇到错误进入 Error 状态,可以调用 MediaCodec.reset() 方法使其再次可用;

  9. 当MediaCodec数据处理任务完成时或不再需要MediaCodec时,可使用 MediaCodec.release()方法释放其资源。

 

 

异步模式下的状态转换(ASynchronous Processing using Buffers)

  首先我们先看一下状态转换的流程图,如下:

  异步模式下状态转换与同步模式下大同小异,主要有两点区别:

  1. 调用 MediaCodec.start() 方法启动Codec,Codec会直接转入 Running 子状态;

  2. 当调用 MediaCodec.flash() 方法进入 Flushed 子状态后,必须调用 MediaCodec.start() 方法Codec才会进入 Running 子状态。

  其他情况下均与同步模式下相同,就不在此赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值