不知不觉到第九篇了,感觉还有好多好多没有写,路漫漫其修远兮 ,吾将上下而求索,上篇主要介绍了Stagefright框架及AwesomePlayer的数据解析器,最后我们说道,涉及parse及decode部分,将在本篇中介绍,看下今天的Agenda:
两张图看数据走向
AwesomePlayer中prepare过程
AwesomePlayer初始化音视频过程
Stagefright的Decode过程
Stagefright处理数据过程
数据由源到最终解码后的流程
一切从MediaSource中来,一切又从MediaSource中去
Audio:

Video:

首先我们开始看下AwesomePlayer的prepare的执行过程:


以上代码总结为:prepare过程调用了prepareAsync_l函数,在prepareAsync_l中执行new AwesomeEvent,并将AwesomePlayer调用onPrepareAsyncEvent的结果返回AwesomeEvent的构造作为参数。
接着分析AwesomeEvent的过程: 启动mQueue,作为event handler

上面new AwesomeEvent会执行onPrepareAsyncEvent函数,我们看下该函数的做了什么?


以上代码总结为:会将(音视频)进行分处理,于是有了AwesomePlayer::initVideoDecoder及AwesomePlayer::initAudioDecoder()函数。
本文出自逆流的鱼:
我们先看下initVideoDecoder,即初始化视频:


接着看下初始化音频,看下几个变量的声明:

接着看代码如下:


对上面代码进行总结:
Stagefright调用AwesomePlayer的prepare后,AwesomePlayer调用自身的prepareAsync进行初始化化音视频,这两个方法里面都会OMXCodec::Create,接下来看下这个过程。
经过“数据流的封装”得到的两个MediaSource,其实是两个OMXCodec。AwesomePlayer和mAudioPlayer都是从MediaSource中得到数据进行播放。AwesomePlayer得到的是最终需要渲染的原始视频数据,而mAudioPlayer读取的是最终需要播放的原始音频数据。也就是说,从OMXCodec中读到的数据已经是原始数据了。
OMXCodec是怎么把数据源经过parse、decode两步以后转化成原始数据的。从OMXCodec::Create这个构造方法开始,下面看它的代码:



以上代码总结为:对应参数分析:
IOMX &omx指的是一个OMXNodeInstance对象的实例。
MetaData &meta这个参数由MediaSource.getFormat获取得到。这个对象的主要成员就是一个KeyedVector(uint32_t, typed_data) mItems,里面存放了一些代表MediaSource格式信息的名值对。
bool createEncoder指明这个OMXCodec是编码还是解码。
MediaSource &source是一个MediaExtractor(数据解析器)。
char *matchComponentName指定一种Codec用于生成这个OMXCodec。
先使用findMatchingCodecs寻找对应的Codec,找到以后为当前IOMX分配节点并注册事件器:omx->allocateNode(componentName, observer, &node)。stagefright框架最后,把IOMX封装进一个OMXCodec:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-50198-1.html
哈哈加油