android媒体开发--OpenCore和Stagefright(一)

来源:互联网 发布:今知三四来求亲打一肖 编辑:程序博客网 时间:2024/05/16 18:25

我2013年进入安卓车载行业,到现在将近4年时间。
  车载行业涉及到“行车记录仪DVR”(Camera、MediaRecorder),本地资源SD卡、U盘“媒体播放器”(MediaPlayer、MediaScanner、AudioManager),所谓近朱者赤,几年下来不能说是安卓媒体开发的砖家,但大部分流程和要点也都是了然于胸的,算是大半个媒体开发者吧。

  从android4.2版本之后,媒体的相关源码都放到framework/av/的目录中,所以媒体开发又俗称”AV工作者”,呵呵,大家想想是不是内心有点小激动了?公司6.0源码源码结构我直接上frameworks/av/media的结构截图:
这里写图片描述

  那么“安卓媒体开发”会不会像Toky-hot里面的开发人员一样愉悦和兴奋了?No~No~No~,鄙人的亲身经历告诉大家“安卓媒体开发”入门异常痛苦,如果有《安卓媒体开发》这本书,那么这本书你大胆的翻开扉页,扉页肯定写着血淋淋的八个大字:欲练此功,必先自宫。

 当年我初进入车载行业,一进去经理就丢一个“行车记录仪DVR”(Camera、MediaRecorder)过来,喏~看懂这个,以后这个就是你来维护扩展……以后的三个月偶尔在夜深人静或者雷雨交加深夜,好几次我真的是差点挥刀自宫了……

  多年后当我学会看底层代码,看了OpenCore和Stagefright后,才恍然大悟,扉页的八个字很熟悉啊,嗯,《葵花宝典》,宝典的扉页确实写着:欲练此功,必先自宫,但重点是宝典的末页写着:不宮也可~~~

Stagefright翻译为:怯场、演讲恐惧者

  所以说如果安卓入门的开发者想学习“安卓媒体开发”我建议先从看底层代码,看了底层代码再来学习上层API,可以免去自宫的危险。今天开始我就从底层往上层分享这几年我对“安卓媒体开发”的理解。

  在Android上,预设的多媒体框架(multimedia framework)是OpenCORE。OpenCORE的优点是兼顾了跨平台的移植性,而且已经过多方验证,所以相对来说较为稳定;但是其缺点是过於庞大复杂,需要耗费相当多的时间去维护。从Android 2.3开始,Google引进了架构稍为简洁的Stagefright,目前来看Stagefright几乎取代了OpenCORE 。Stagefright的编解码功能是利用OpenMAX框架,而且用的还是OpenCORE之OMX的操作,上一张结构图:
这里写图片描述
再上一张Stagefright在Android多媒体架构中的位置:
这里写图片描述
OpenCore:
OpenCore的另外一个常用的称呼是PacketVideo,它是Android的多媒体核心。在防站的过程中,PacketVideo是一家公司的名称,而OpenCore是这套多媒体框架的软件层的名称。在Android的开发者中间,二者的含义基本相同。对比Android的其它程序库,OpenCore的代码非常庞大,它是一个基于C++的实现,定义了全功能的操作系统移植层,各种基本的功能均被封装成类的形式,各层次之间的接口多使用继承等方式。

OpenCore是一个多媒体的框架,从宏观上来看,它主要包含了两大方面的内容:
  PVPlayer :提供媒体播放器的功能,完成各种音频(Audio)、视频(Video)流的回放(Playback)功能
  PVAuthor:提供媒体流记录的功能,完成各种音频(Audio)、视频(Video)流的以及静态图像捕获功能
PVPlayer和PVAuthor以SDK的形式提供给开发者,可以在这个SDK之上构建多种应用程序和服务。在移动终端中常常使用的多媒体应用程序,例如媒体播放器、照相机、录像机、录音机等等。

Stagefright:
  Stagefright架构作为OpenCore架构升级版,整体架构显得稍为简洁,但功能还是不变的,也是两大部分PVAuthor和PVPlayer。
  PVAuthor(编码过程):提供媒体流记录的功能,完成各种音频(Audio)、视频(Video)流的以及静态图像捕获功能 。我们日常生活中看的音视频都需要从生活中的静态图像捕获,然后把这些静态照片连接起来就是会动的视频。举个例子:胶片电影可能很多90后的朋友并没有见过,小时候有专门到乡下巡回放电影的人,找一个晴朗的夜晚放映人支上银幕、放映机,拿出几卷胶片,胶片就是一张张静态的图像,卷到放映机放大投射续传到银幕上就成了儿时最美好电影。Android上层的视频拍摄、静态图像捕获用的API是Camera、MediaRecorder。当然也可以自己写个中间件外挂一个USB的摄像头来捕获图像,这就涉及到MediaCodec硬编码,本文不做详述。
  PVPlayer(解码过程):提供媒体播放器的功能,完成各种音频(Audio)、视频(Video)流的回放(Playback)功能 。PVAuthor将捕获的静态图片编码压缩成我们日常见到的.mp4格式或其他格式,那么我们播放这个视频的时候就需要解码播放,大家不要一听见编解码就觉得很复杂,编解码都是安卓底层来完成的,我只需要调用,Android上层的解码播放用API是MediaPlayer。这里要重点说的是现在的各主流播放器大部分都是用Ffmpeg框架来写的播放器,如暴风影音、QQ影音、KMP、GOM Player、PotPlayer等等。这个框架是开源的,我有段时间看了下也没看明白,据说功能十分强大,有兴趣研究可以去看看雷霄华的系列Ffmpeg博客,写的很赞,可惜了雷神斯人已逝,但好多生者如斯,在追求技术的道路的上孜孜不倦。

这是我整理的第一篇媒体先关的博客,如有手误的地方还望大家轻拍

画图的真是个麻烦的东西就上面两幅图我自己用StarUML折腾了大半天搞出来还很难看,最后热心网友“特大辉”推荐一个比较好用的画图网站:https://www.processon.com/,功能满分,苹果的体验。

2 0
原创粉丝点击