Android MediaPlayer源码分析总结

Android MediaPlayer源码分析总结


本文言简意赅的介绍如下内容,深入学习需要开发者自行阅读源码:

  • App层如何使用MediaPlayer
  • client端(app )调用流程
  • server端如何添加自己的player
  • 播放器构成组件
  • OpenMax
  • MediaCodec

注:阅读本文之前建议先了解 MediaPlayer之基本类


1,App层如何使用MediaPlayer,大致如下:(网上资料有很多,读者自行查阅)

MediaPlayer mp = new MediaPlayer();
mp.setDataSource("/sdcard/test.mp3");
mp.prepare();//异步为prepareAsync()
mp.start();
mp.stop();
mp.release();

不管应用层开发,还是底层开发维护人员都需要对MediaPlayer的状态机了然于胸,如下:

 

Android MediaPlayer源码分析总结_第1张图片

2,client端调用流程如下(以prepare为例,其它API调用类似):

Android MediaPlayer源码分析总结_第2张图片

3,如何在server端添加自己的player

一般来说,各个方案商都有自己的player,不可避免的需要在android设备上添加自己的player,方法如下图所示。

Android MediaPlayer源码分析总结_第3张图片

 

说明:

  • MediaPlayerFactory为各个播放器工厂类的基类,相应的MediaPlayerInterface为各个播放器的基类。MediaPlayerFactory和MediaPlayerInterface的派生类为一一对应关系。
  • 上述两图中,以XXPlayer为例添加了两个类XXPlayerFactory和XXPlayer,具体需实现的接口参见android源码。
  • 应用层传入的url或fd在播放时,会遍历各个播放器工厂类的scoreFactory()方法(匹配度大小,即计分大小,谁的计分大就用谁播放)。

4,播放器构成组件

android默认U盘播放使用的是statefright player,下面以statefright player为例简述播放器各个组件,如下图所示:

Android MediaPlayer源码分析总结_第4张图片

说明如下:

  • AwesomePlayer:statefright player的核心组织者
  • Datasource: 负责获取数据源,不对媒体格式进行区分
  • Mediasource: 负责获取媒体源,实现方式依赖于媒体格式,以“track”的方式供外界使用:video/audio/ subtitle track
  • MediaExtractor: 识别档案;a/v分离,并以MediaSource的方式供外界使用。这个类派生了一系列多媒体格式(container)的extractor。具体到实际开发,有可能遇到的就是添加新的格式支持。

上述几个类之间的数据流关系如下图所示:

Android MediaPlayer源码分析总结_第5张图片

5,OpenMax

从事adnroid a/v encoder/decoder开发整合人员,一般来说需要关注下图的IL层实现,详细描述参见官方文档。

Android MediaPlayer源码分析总结_第6张图片

6,MediaCodec

Android MediaPlayer源码分析总结_第7张图片

MediaCodec为android提供C++层和java层的编解码接口,方便开发者灵活的构建自己的播放器,弊端是播放逻辑要自行控制。

 

上述为对先前从事过的项目作个技术总结,本着开源的精神,与大家共同进步!

你可能感兴趣的:(android)