多媒体,现代手机不可或缺的一部分,它包含了音视频播放器、照相机、录音机、摄像机、FM、移动电视、Gallery等等。在中国10年以前手机中的添加这些功能模块或许是想都不敢想的,但是10年之中各种专用功能的手机的出现,如带FM的手机、音乐手机、摄像手机、带移动电视的手机,让我们越来越觉得一部强大的手机理所当然应该包含这些功能。没错,我们可以细数一下,好像这些功能许多山寨机都已经支持,托山寨机的福,各种名牌手机在这方面也是下足了功夫,才使得我们觉得这些是理所当然!如果说哪天你想都不想地买了个手机,却突然发现,哇,居然不带MP3播放器……我想你绝对有拿刀砍卖家的冲动!
做为智能手机平台新秀的Android系统在多媒体这一模块也是不敢含糊。本人从事手机多媒体部分研发工作已一年半载,自从转到Android平台以来深入研究多媒体相关模块好多个月了。研究是辛苦的,但过程之中却充满了无数欣喜——主要是一种成长的欣喜,一种与大家(master)交流的欣喜。果然是强将手下无弱兵,Google的代码无论从架构到逻辑,从风格到效率都是一般人无法企及的。不多摆活了,下面写一些对MediaPlayer模块的研究认识吧。
注:我一直信奉一个人的认知能力是有限的,我的认识也不一定完全正确,大家发现有问题一定要给我回复哦,有问题我改行不?哈哈!
MediaPlayer自从1.0版本以来,已经过几次重大修改,可见Google对它的重视。它是代码中规模比较大、设计比较复杂、涉及范围比较广的一个模块。因此,对这一模块的研究也不是一页两页能表述清楚的,尽管如此,我还是尽量把它表述的有条理一些。
下面是我按照Android总体架构和该模块内部架构所拟出的大纲索引,熟悉它有助于我们对MediaPlayer有个整体的认知,后续文章的发布将按照下面大纲进行(如有特殊,将有可能修改大纲,毕竟只有细究内部之后才会有总体认识,我们才能看到先前的整体认识的不足):
Media Player
1 Java application layer
1.1 Overview
1.2 Activities
1.3 Common utilities
1.4 Aidl & interface
1.5 Service
1.6 Lifecycle
1.7 C/S model
2 Framework layer
2.1 Overview
2.2 Java
2.2.1 MediaPlayer
2.2.2 MediaScanner
2.2.3 MediaFile
2.2.4 Audio
2.3 JNI
2.3.1 Makefile
2.3.2 Android_media_MediaPlayer
2.3.3 Android_media_MediaScanner
2.4 Libmedia
2.4.1 Makefile
2.4.2 MediaPlayer
2.5 Libmediaplayerservice
2.5.1 Makefile
2.5.2 MediaPlayerService
2.5.3 MediaPlayerInterface
2.5.4 PVPlayer
2.5.5 MidiFile
2.5.6 VorbisPlayer
2.6 Mediaserver
2.6.1 Makefile
2.6.2 Main_mediaserver
2.6.3 Lifecycle
2.6.4 C/S model
3 OpenCore layer
3.1 Overview
3.2 Source code structures
3.2.1 Directory structures
3.2.2 Building structure
3.3 OSCL
3.4 File formats & codec
3.4.1 File formats
3.4.2 codec
3.5 How does android use it
3.5.1 How to use PVPlayer
3.5.2 How to use Mediascanner
3.5.3 How to use PVAuthor
主要分了三部分:
1 上层java应用,主要包括Music和Video两部分。这一层是上层应用程序员可以修改的,即我们可以按照自己的需求修改播放器的外观功能等。
2 Framework层。这一层一般来说最好不要修改,当然并不是说不能修改。为什么这么说呢?
因为Framework中包含了一个Java类MediaPlayer,这个类已经成为SDK的一部分了,它提供给上层Java应用所有必要的接口,如果我们改动了这一层的话,将会影响到调用这个类的相关模块,同时也会影响软件的可移植性,比方说,如果你在AppStore上看到一个很炫的播放器APK,但你的代码却改动了这一层的这个MediaPlayer,很可能这个APK不能在你的代码上跑起来,因为这个APK是基于SDK开发的,而你却改了SDK中的一个必要的类。
那如果我们要添加新功能怎么办呢?扩展它,而不是修改它——即我们可以写一个新的子类,在子类中添加新功能,然后上层应用调用我们自己的子类,这样自己的代码也能跑,别人的代码也能跑。对扩展开放,对修改关闭,这也是OO设计模式中的原则之一。
3 OpenCore层。这一部分是包含了一些常用的音视频解码。不需要修改。这部分代码是三方源码,作为C++代码来说很是优秀,虽然没有研究它的必要,但如果想要提高C++编程能力及软件架构设计能力,可以说它绝对是个好范本!