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的状态机了然于胸,如下:

 

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

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

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

 

说明:

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

4,播放器构成组件

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

说明如下:

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

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

5,OpenMax

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

6,MediaCodec

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

 

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

更多相关文章

  1. Android动态创建布局常用方法
  2. android ide开发工具
  3. Android(安卓)Fragment使用小结
  4. (转摘)Android腾讯微博客户端开发二:相关工具篇
  5. Android(安卓)Studio Build Output 汉字乱码
  6. Android开发之MAC下无法连接Android设备
  7. Android(安卓)开发学习手记(三):关于PullToRefresh的setOnTouchList
  8. jni中使用libcurl做网络开发
  9. Android开发中LogCat工具的使用

随机推荐

  1. Android(安卓)Button 上添加图片
  2. RecylcerView中的子view matchParent属性
  3. android webkit 打开debug调试信息
  4. android定义可以被其他程序调用的activit
  5. 定制Android之4G-LTE模块驱动
  6. 【Android】数据存储之Files
  7. android中从图库中选取图片
  8. Android动画学习笔记-Android(安卓)Anima
  9. Android(安卓)NDK概述
  10. Android视频开发国人开发的Vitamio开源项