android_ics_stagefright框架数据流向分析-xww810319的专栏.docxVIP

  • 10
  • 0
  • 约3.52万字
  • 约 35页
  • 2021-02-02 发布于天津
  • 举报

android_ics_stagefright框架数据流向分析-xww810319的专栏.docx

An droid」cs_stagefright 框架数据流向分析 2014-01-03 10:15 78 人阅读 评论(0)收藏举报 原文: An droid_ics_stagefright 框架数据流向分析 1,待解码的原始数据从何而 来 链接:/mci2004/article/details/7629146 先明确一点,stagefright 框架是典型的事件驱动型,数据的流向也受到事件 驱动(driven by eve nt )的影响,在awesomePlayer中主要的驱动事件有: on PrepareAs yn cEve nt,onV ideoEve nt,onStreamDone 这些 eve nt 会在 awesomeplayer中维护的TimedEventQueue mQueu中按照时间的顺序被放入这 个队列中。然后TimedEventQueue根据时间顺序来调度事件。这样做的目的是: 因为,按照mQueu曲事件的是按事件排序的,所以,在视频数据到来时,可以 根据视频的时间戳来进行音视频同步的调节。 AwesomePlayer中音视频的同步处理就是在 onVideoEvent()回调中来做的。 当应用层调用mediaplayer.prepare() 的时候,在框架内最终对应的 是 AwesomePlayer::prepareAsync_l() , 这个函数的实现很简单,看下主要的实现部分: status」AwesomePlayer::prepareAs yn c_l() { J mAsyn cPrepareEve nt = new AwesomeEve nt(this, AwesomePlayer::o nPrepareAs yn cEve nt); mQueue.postEvent(mAsyncPrepareEvent); // 向 mQueue^投递一个事件 } 那么当mQueu(在进行事件调度的时候,会执行到事件对应的回调函数, 例如上面mAsyncPrepareEvent对应的回调 函数就是onPrepareAsyncEvent。回调函数的实现大致如下,有些部分直接略 掉了 void AwesomePlayer:: on PrepareAs yn cEve nt() { status_t err = finishSetDataSource_l(); --a status_t err = initVideoDecoder(); ---b status_t err = ini tAudioDecoder(); finishAsyncPrepare_l(); c } 对回调实现中的部分函数做简单分析: a,finishSetDataSource_l() 中主要做了三件事: 一,根据不同的数据来源,来确定 dataSource的来源,如果数据来源于网络 (Http/widevine )贝9 dataSource 来自与 cacheSource (流媒体播放的缓冲), 如果数据来源于文件,则dataSource会被绑定到FileSource(uri)。 二,根据前面确定的dataSource的类型来: extractor = MediaExtractor::Create(dataSource, sni ffedMIME.empty() ? NULL : sni ffedMIME ?c_str()); 产生一个具体的文件解析器,在这个 Create函数中,会根据DataSource基类 中所注册的Sniff函数(有很多个Sniff函数,例 如 Sn iffMPEG4, SniffOgg 等)来“嗅探”这个 dataSource。根据 con fide nee 值来确定这个 dataSource 的 mimetype,然 后再根据确定的mimetype来创建具体的XXXExtractor。本文中所讨论的对象 是 MPEG4Extractor。 三,最后一步也是最复杂的一部分,这一步决定了原始数据的来源,在 fin ishSetDataSource_l() 函数中最后一步调用的是 status_t err = setDataSource_l(extractor); 这里的 extractor 就是前面所 创建的XXXExtractor,假定是 MPEG4Extractor。下面简单的分析如下,setDataSource_l(extractor); 实现如 下 _ status_t AwesomePlayer::setDataSource_l(c onst spvMediaExtractor extractor) { for (size_t i = 0; i extractor-co un tTracks()

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档