多媒体,现代手机不可或缺的一部分,它包含了音视频播放器、照相机、录音机、摄像机、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层。这一层一般来说最好不要修改,当然并不是说不能修改。为什么这么说呢?

MediaPlayer,这个类已经成为SDK的一部分了,它提供给上层Java应用所有必要的接口,如果我们改动了这一层的话,将会影响到调用这个类的相关模块,同时也会影响软件的可移植性,比方说,如果你在AppStore上看到一个很炫的播放器APK,但你的代码却改动了这一层的这个MediaPlayer,很可能这个APK不能在你的代码上跑起来,因为这个APK是基于SDK开发的,而你却改了SDK中的一个必要的类。

对扩展开放,对修改关闭,这也是OO设计模式中的原则之一。

   3 OpenCore层。这一部分是包含了一些常用的音视频解码。不需要修改。这部分代码是三方源码,作为C++代码来说很是优秀,虽然没有研究它的必要,但如果想要提高C++编程能力及软件架构设计能力,可以说它绝对是个好范本!

  上述三个部分里面又按照各自结构划分相应的层次和模块来讨论,具体划分请见上面。以后的文章将会详细地讨论各个小节。