深入理解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的初始化流程。


欢迎关注我的公众号灰度五十,分享各类音视频、移动开发知识,以及名企内推信息~
在这里插入图片描述

文章帮到你了?可以扫描如下二维码进行打赏,打赏多少您随意~

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/nonmarking/article/details/72492107