1引言
Android froyo版本多媒体引擎作了变更,新添加了stagefright框架,而且默认状况android选择stagefright,弃用以前的opencore,仅仅对opencore中的omx-component部分作了引用。
Stagefright自android2.0后才添加,其稳定性有待商榷,是否存在bug也未知,opencore自android诞生起便存在,稳定性有保障。不过,从目前android代码看,opencore有被stagefright取代的趋势,因此在opencore上所做工做也许会没法沿用。Opencore上的开发较stagefright上要复杂耗时些。html
2框架变更
以MediaPlayer为例,咱们先看一下多媒体的简单框架。
上图可知,stagefright是在MediaPlayerService这一层加入的,和opencore是并列的,在选用opencore仍是stagefright的代码切换上也很是容易。
具体stagefright的内部变更,可见下图概述。Stagefright并无彻底抛弃opencore,主要是作了一个OMX层,用来引用opencore的omx-component部分。而stagefright内部而言,与opencore是彻底不一样的设计。
node
3具体差别
3.1所支持的文件格式
Opencore所支持的格式。
Stagefright所支持的格式。
android
3.2 Parser和codec部分开发有差别
Opencore与stagefright两套机制,对于咱们的开发而言,主要体如今parser和codec部分。Opencore方面,必须按照其规范完成相应的parser-node,codec则要按照omx规范实现相应的component。Stagefright方面,则要按照其规范实现相应的extractor和decoder。
最基本的实现,两者是相同的,能够共用,差异在封装上,opencore难度和工做量要大。api
3.3 数据处理机制不一样
Opencore处理流程以下图示。
engine分别建立audio/video datapath,parser/dec/sink做为node节点由各自datapath链接起来,后续node节点由统一调度器调度。
Stagefright处理流程以下图示。
Audioplayer为AwesomePlayer的成员,audioplayer经过callback来驱动数据的获取,awesomeplayer则是经过videoevent来驱动。两者有个共性,就是数据的获取都抽象成mSource->Read()来完成,且read内部把parser和dec绑在一块儿。
Opencore和stagefright处理机制对比:
(1)Opencore的parser与dec是分离的,各行其职;stagefright则是绑在一块儿做为一个独立的原子操做。
(2)Stagefright经过callback和videoevent来驱动数据输出;opencore是经过sink-node节点控制输出。
(3)Opencore中parser/dec/sink是并行处理的;stagefright中为串行处理。架构
3.4 AV同步
Opencore有一个主clock,audio/video分别与该主clock同步,做为输出的断定依据,且audio会不断校准主clock。
Stagefright部分,audio彻底是callback驱动数据流,video部分在onVideoEvent里会获取audio的时间戳,是传统的AV时间戳作同步。框架
3.5 稳定性
客观来说,opencore存在时间长,相对稳定;stagefright刚推出,确定会有未预知的bug存在。ide
4 总结
1.Opencore相对成熟稳定,做为框架采用,风险小;parser/codec集成相对复杂,若是android后续版本弃用opencore转用stagefright,那多媒体引擎的选择是个问题。
2.Stagefright新推出,确定有未预知的bug,直接采用有潜在风险;parser/codec集成相对容易,架构较opencore作了极大简化,通俗易懂。
3.目前来看opencore支持的文件格式多些。
4.Opencore与stagefright在数据处理机制及AV同步上有很大差别,须要在实际板子上评估性能差别。
5.若是在android froyo版本开发多媒体相关产品,建议采用opencore框架,这样旧版本opencore上的成果能够沿用,且节省项目时间。
6.Opencore支持的文件格式较stagefright丰富。
7.若是项目研发中android出现新版本,或stagefright作了更新,仍然维持opencore不变,多媒体引擎变动问题待ipad后再议。一种选择是一直延续采用opencore,或者在适当时候(认为stagefright足够稳定)切换到stagefright。post
Stagefright阅读笔记附录
两套方案对比过程当中,基本上把stagefright的代码阅读过一遍,摘录以下,以图为主。
Stagefright总体框图。
Stagefrightplayer里awesomeplayer初始化流程
Awesomeplayer框图,其中涵盖主要节点元素。
Stagefrightrecorder部分
MediaPlayer框图。
MediaRecorder框图。
Libstagefright草图,涵盖了主要节点元素。
性能