深入理解Android MediaCodec初始化流程
Posted zhanghui_cuc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解Android MediaCodec初始化流程相关的知识,希望对你有一定的参考价值。
MediaCodec的使用没什么好说的,开发者官网的介绍颇为详尽,今天我们进入源码,从初始化流程说起,深入探寻一下MediaCodec的秘密。
获取MediaCodecList的流程
想要初始化一个MediaCodec实例,总要先拿到当前系统所支持的codec列表,也就是MediaCodecList,再从其中得到我们需要的具体codec。
codec列表可以在系统的vendor/etc目录下找到,位于media_codec.xml等几个xml文件中,在出厂时就已经配好了。所以如果只是想要快速查看,可以不用写代码,直接找个手机adb进去看看。
MediaCodecList的本质是一个MediaCodecInfo数组,其构建流程如下图所示
有人说了,假如我已经知道自己要什么类型的MediaCodec,那直接创建对应的实例,然后调用MediaCodec.getCodecInfo不行吗,何必要通过MediaCodecList呢,岂不啰嗦?我劝你最好不要这么干,在某些机型上,MediaCodec.getCodecInfo会引发crash,相比之下,MediaCodecList是更靠谱的选择。
根据媒体格式创建对应的MediaCodec
我们先岔开话题,假设现在的场景是使用MediaExtractor来解析输入文件,看看它是怎么读取出文件对应的媒体格式的。从MediaExtractor的setDataSource说起,假设此时输入的是一个mp4流,则流程如下图所示
此时我们拿到了输入流的媒体格式,接下来就是创建对应的MediaCodec,流程如下
拿到name之后,就可以很轻松的初始化MediaCodec了。android给我们提供的接口很简单,但是背后的逻辑却颇为复杂,我们来深入看看,如下面几张图所示
在这里开启了MediaCodec对应的looper线程,此时的ACodec常处于Uninitialized状态。在native mediacodec中完成AHandler的注册以及ALooper的启动后,就会调用ACodec的initiateAllocateComponent方法,开始进入INITIALIZING状态。下面以高通平台为例,跟踪一下从ACodec再到omx底层的流程
经过这一步骤之后,native mediacodec就进入了INITIALIZED状态,ACodec也进入了Loaded状态。
MediaCodec的Configure过程
初始化MediaCodec之后,需要以MediaFormat来对MediaCodec进行配置,其实就是把sps、pps等信息传给MediaCodec
我们还是以高通平台为例,看看一个264解码器是怎么configure的
可以看到,就是一层层往下setParameter,而在qc_omx_create_component_wrapper中给component的各个函数指针赋值,是关键的一步。
至此,我们就跟踪完了MediaCodec的初始化流程。
欢迎关注我的公众号灰度五十,分享各类音视频、移动开发知识,以及名企内推信息~
文章帮到你了?可以扫描如下二维码进行打赏,打赏多少您随意~
以上是关于深入理解Android MediaCodec初始化流程的主要内容,如果未能解决你的问题,请参考以下文章