*因为工做须要,须要利用MediaCodec实现Playback及Transcode等功能,故在学习过程当中翻译了Google官方的MediaCodec API文档,因为做者水平限制,文中不免有错误和不恰当之处,望批评指正。微信
*转载请注明出处:http://www.cnblogs.com/roger-yu/异步
在MediaCodec的生命周期内存在三种状态:Stopped, Executing or Released,其中学习
Stopped状态包含三种子状态:Uninitialized, Configured and Error编码
Executing状态包含三种子状态:Flushed, Running and End-of-Streamspa
因为MediaCodec在不一样的数据处理模式下状态间的转换会有些许差异,故接下来咱们分别对同步处理模式及异步处理模式下的状态转换作详细分析翻译
首先咱们先看一下状态转换的流程图,以下:3d
1. 当经过 MediaCodec.createByCodecName(...) or MediaCodec.
codecreateDecoderByType(...) 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;
blog
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进入
子状态,能够对Codec进行从新配置;Uninitialized
8. 极少数状况下Codec会遇到错误进入 Error 状态,能够调用 MediaCodec.reset() 方法使其再次可用;
9. 当MediaCodec数据处理任务完成时或再也不须要MediaCodec时,可以使用 MediaCodec.release()方法释放其资源。
首先咱们先看一下状态转换的流程图,以下:
异步模式下状态转换与同步模式下大同小异,主要有两点区别:
1. 调用 MediaCodec.start() 方法启动Codec,Codec会直接转入 Running 子状态;
2. 当调用 MediaCodec.flash() 方法进入 Flushed 子状态后,必须调用 MediaCodec.start() 方法Codec才会进入 Running 子状态。
其余状况下均与同步模式下相同,就不在此赘述。
微信扫一扫,关注玖零日记,获取更多相关资讯及源码 -- 虽无面朝大海,依旧春暖花开