【Android应用开发技术:媒体开发】MediaPlayer基本原理

原创 2015年07月31日 16:35:43

作者:郭孝星
微博:郭孝星的新浪微博
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
Github:https://github.com/AllenWells

【Android应用开发技术:媒体开发】章节列表

一 MediaPlayer特性

MediaPlayer类用于控制音频文件、视频文件和流的播放。

1.1 MediaPlayer播放的文件来源

(1) 应用中自带的resource资源。

MediaPlayer.create(this, R.raw.video);

(2) 存储在SD卡或其他文件路径下的媒体文件。

mediaPlayer.setDataSource(“/sdcard/video.mp4”);

(3) 网络上的流媒体文件。

mediaPlayer.setDataSource("http://www.citynorth.cn/music/video.mp4");

MediaPlayer的setDataSource()一共有四个方法。

setDataSource (String path) 
setDataSource (FileDescriptor fd) 
setDataSource (Context context, Uri uri) 
setDataSource (FileDescriptor fd, long offset, long length)

二 MediaPlayer体系架构

MediaPlayer体系架构如下图所示:

这里写图片描述

  • libmedia_jni.so:为Java程序提供接口,实现了android.media.MediaPlayer。
  • libmedia.so:处于核心位置的库,为libmedia_jni.so提供接口。
  • libdisplayerservice.so:Media的服务器,它通过继承libmedia.so的类来实现服务器功能,而libmedia.so的另外一部分内容则通过进程间通讯和libmediaplayerservice.so进行通讯,libmediaplayerservice.so的真正功能则通过调用OpenCore Player来完成。

三 MediaPlayer生命周期

MediaPlayer对象播放控制生命周期状态图如下所示:

这里写图片描述

椭圆:表示MediaPlayer对象可能驻留的状态。

弧线:表示驱动MediaPlayer在各个状态之间迁移的播放控制操作。

  • 一个箭头开始的弧线:同步的方法调用。
  • 双箭头开始的弧线:异步的方法调用。

3.1 Idle状态

(1) new操作符构建Mediaplayer对象

(2)调用reset()方法。

在一个MediaPlayer对象刚被构建的时候,内部的播放引擎和对象的状态都没有改变,这个时候如果调用以下方法:

  • getCurrentPosition();
  • getDuration();
  • getVideoHeight();
  • getVideoWidth();
  • setAudioStreamType(int);
  • setLooping(boolean);
  • setVolume(float, float);
  • pause();
  • start();
  • stop();
  • seekTo(int);
  • prepare();
  • prepareAsync();

框架将无法回调客户端程序注册的OnErrorListener.onError()方法。
如果这个MediaPlayer对象调用了reset()方法之后,再调用以上方法,内部的播放引擎就会回调客户端程序注册的OnErrorListener.onError()方法,并将错误的状态传入。

3.2 End状态

一旦一个MediaPlayer对象不再被使用,应该立即调用release()方法来释放在内部播放引擎中与这个MediaPlayer对象关联的资源,资源包括:硬件加速组件的单态组件。
如果没有释放,可能会导致后续的MediaPlayer对象无法使用这些硬件资源。一旦一个MediaPlayer对象处于End状态,它就不能再被使用,也无法再迁移到其他状态。

3.3 Initialized状态

当MediaPlayer对象处于Idle状态时,调用以下方法:

  • setDataSource(FileDescriptor);
  • setDataSource(String);
  • setDataSource(Context,Uri);
  • setDataSource(FileDescriptor,long,long);

MediaPlayer对象迁移到Initialized状态,当此MediaPlayer对象处于其他状态时,调用这些方法会抛出IllegalStateException异常。

3.4 Prepared状态

在开始播放之前,MediaPlayer对象要进入Prepared状态。有以下两种方法可以实现:

3.4.1 同步方法

调用prepare()方法,该方法返回时表明对象已经进入Prepared状态。

3.4.2 异步方法

调用prepareAsync()方法,此方法会使此MediaPlayer对象进入Preparing状态并返回,而内部的播放引擎会继续完成未完成的准备工作。在不合适的状态调用以上两个方法会抛出IllegalStateException异常。当同步方法返回时或异步方法的准备工作完全完成时就会调用客户端程序提供的OnPreparedListener.onPrepared()监听方法。当MediaPlayer对象处于Prepared状态时,可以调整音频/视频的属性,如音量、播放时是否一直亮屏等。

3.5 Preparing状态

Preparing是一个中间状态,在此状态下调用任何具备边影响的方法的结果都是未知的。

3.6 Started状态

MediaPlayer对象调用start()方法,当此方法成功返回时,MediaPlayer对象处于Started状态,isPlaying()方法可以用来测试MediaPlayer对象是否处于Started状态。

  1. 当处于Started状态时,内部播放引擎会调用客户端程序提供的OnBufferingUpdateListener.onBufferingUpdate()回调方法,此回调允许应用程序追踪流播放的缓冲状态。
  2. 当对一个已经处于Started状态的MediaPlayer对象调用start()方法没有影响。

3.7 Paused状态

当调用pause()方法并返回时,MediaPlayer对象进入Paused状态。

  1. Started和Paused状态的相互转换在内部播放引擎是异步的,所以需要一点时间在isPlaying()方法中更新状态。
  2. 对一个已经处于Paused状态的MediaPlayer对象调用pause()方法没有任何影响。

3.8 Stopped状态

当调用stop()方法会停止播放,并且会让一个处于Started、Paused、Prepared、PlaybackCompleted状态的MediaPlayer对象进入Stopped状态。对一个已经处于Stopped状态的MediaPlayer对象调stop()方法没有任何影响。

3.9 PlaybackCompleted状态

如果没有开启循环模式,内部的播放引擎会调用客户端程序提供的OnCompletion.onCompletion()回调方法。

Android-多媒体之MediaPlayer原理

Android-多媒体之MediaPlayer原理 一 MediaPlayer原理图 二 解析MediaPlayer原理 MediaPlayer控制状态 当MediaPlayer对象感...
  • qq_22075977
  • qq_22075977
  • 2015年07月13日 18:49
  • 1308

android Media原理学习

思考Android安装的app如何快速辨别磁盘上的文件哪些是多媒体文件,并且存放在哪个位置?通常情况下,我们是使用Android系统自带的音乐或者视频播放器,它里面就包含了磁盘上所有的音乐视频文件,它...
  • jackzhouyu
  • jackzhouyu
  • 2016年12月15日 14:50
  • 819

Android的MediaPlayer架构介绍

本文主要介绍的是Android中很重要也最为复杂的媒体播放器(MediaPlayer)部分的架构。对于Android这样一个完整又相对复杂的系统,一个MediaPlayer功能的实现不在其具体的功能,...
  • eustoma
  • eustoma
  • 2011年08月21日 18:14
  • 40481

Android MediaPlayer架构图解

在android原生的媒体播放器中是由mediaplayerservice来控制媒体播放器的,在mediaplayerservice中创建了 mediaplayer,在mediaplayer.java...
  • guojin08
  • guojin08
  • 2014年05月30日 14:23
  • 1418

【Android应用开发技术:媒体开发】MediaPlayer基本原理

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://githu...
  • AllenWells
  • AllenWells
  • 2015年07月31日 16:35
  • 1307

Android 源码分析之基于Stagefright的MediaPlayer播放框架[3]

 MediaPlayer播放框架源代码解析: Prepare–加载解码器,数据缓存的初始化 通过setDataSource设置播放资源后。就可以调用Prepare方法为播放做准备了。Prep...
  • avel__
  • avel__
  • 2016年12月27日 14:29
  • 957

【Android应用开发技术:媒体开发】拍照

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://githu...
  • AllenWells
  • AllenWells
  • 2015年08月03日 15:48
  • 553

【Android应用开发技术:媒体开发】音频

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://githu...
  • AllenWells
  • AllenWells
  • 2015年08月03日 14:20
  • 675

Android MediaRecorder架构详解

1. 简介 在android中录制音频有两种方式,MediaRecorder和AudioRecord。两者的区别如下: (1) MediaRecorder 简单方便,不需要理会中间录制过程,结束...
  • omnispace
  • omnispace
  • 2016年10月28日 13:35
  • 624

android MediaPlayer播放音视频流程

在播放一个本地音视频文件或网络传输的音视频流时,apk中一般会调用类似如下代码: MediaPlayer mp = new MediaPlayer();(1)   //创建一个播放器 mp.se...
  • zhanxiaoqi
  • zhanxiaoqi
  • 2017年03月23日 18:09
  • 911
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Android应用开发技术:媒体开发】MediaPlayer基本原理
举报原因:
原因补充:

(最多只允许输入30个字)