MediaPlayer基本使用总结
一、简介
MediaPlayer是Android当中开发音视频应用的一个重要组件,它不仅支持本地音视频的播放,同时也能够播放网络的音视频,支持多种视频播放格式,例如m3u8、mp4、3gp等,其与底层直接进行交互,调用底层的native方法,同时其内部包含了很多关于操作音视频播放的方法。因为MediaPlayer直接与底层进行交互,开发者对其的使用存在比较繁琐的问题,后续的Android版本通过封装MediaPlayer中的方法,同时实现MediaPlayerControl接口、继承SurfaceView类、推出了面向开发者更为友好的音视频播放组件VideoView,但其实质上还是对MediaPlayer中的方法进行调用。
MediaPlayer类是媒体框架最重要的组成部分之一。此类的对象能够获取、解码以及播放音频和视频,而且只需极少量设置。它支持多种不同的媒体源,例如:
本地资源
内部URI,例如您可能从内容解析器那获取的URI
外部网址(流式传输)
Android下对于音频、视频的支持均需要使用到MediaPlayer,它主要用来控制Android下播放文件或流的类。MediaPlayer处于Android多媒体包下"android.media.MediaPlayer",仅有一个无参的构造函数,虽然仅为我们提供了一个无参的构造函数,为了方便我们初始化,还为我们提供了几个静态的create()方法用于完成MediaPlayer初始化的工作。
• static MediaPlayer create(Context context,int resid):通过音频资源的Id来创建一个MediaPlayer实例
。
• static MediaPlayer create(Context context,Uri uri):通过一个音频资源的Uri地址来创建一个MediaPlayer实例
。
MediaPlayer除了通过上面两个create()方法在初始化的时候指定媒体资源,还可以通过MediaPlayer.setDataSource()方法为初始化后的MediaPlayer设置媒体资源,setDataSource()具有多个重载函数,适用于不同的媒体资源来源
• void setDataSource(String path)
:通过一个媒体资源的地址指定MediaPlayer的数据源,这里的path可以是一个本地路径,也可以是网络路径。
• void setDataSource(Context context,Uri uri)
:通过一个Uri指定MediaPlayer的数据源,这里的Uri可以是网络路径或者一个内容提供者的Uri。
• void setDataSource(FileDescriptor fd)
:通过一个FileDescriptor指定一个MediaPlayer的数据源
• setDataSource (FileDescriptor fd, long offset, long length)
其中使用FileDescriptor时,需要将文件放到与res文件夹平级的assets文件夹里,然后使用:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
例如:
(1)如何获得MediaPlayer实例:
可以使用直接new的方式:
MediaPlayer mp = new MediaPlayer();
也可以使用create的方式,如:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了
(2)如何设置要播放的文件:
MediaPlayer要播放的文件主要包括3个来源:
a. 用户在应用中事先自带的resource资源
例如:MediaPlayer.create(this, R.raw.test);
b. 存储在SD卡或其他文件路径下的媒体文件
例如:mp.setDataSource("/sdcard/test.mp3");
c. 网络上的媒体文件
例如:mp.setDataSource(“http://www.citynorth.cn/music/confucius.mp3”);
二、MediaPlayer的api使用
MediaPlayer其实是一个封装的很好的音频、视频流媒体操作类,如果查看其源码,会发现其内部是调用的native方法,所以它其实是有C++实现的。
既然是一个流媒体