MediaPlayer

本文详细介绍了Android中的MediaPlayer组件,包括它的基本使用、API、使用技巧、状态机、架构详解及总结。MediaPlayer支持本地和网络音视频播放,通过setDataSource方法设置数据源,提供start、stop、pause等控制操作。使用时要注意异步准备资源以避免UI卡顿,并在适当时候回收资源。此外,文章还讨论了MediaPlayer的状态流转和错误处理策略。
摘要由CSDN通过智能技术生成

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++实现的。
  既然是一个流媒体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值