关闭

使用MediaPlayer播放音频

60人阅读 评论(0) 收藏 举报

强调!!!以下只是我个人看法,如有错误的地方请文明指出微笑,如有其他看法请耐心讨论微笑,如有看不懂可以参考其他有关博客微笑,最后如有想喷的出门左转不谢。微笑

一、使用MediaPlayer播放音频有如下两步;

1、首先装载指定的音频文件,MediaPlayer提供了如下简单的静态方法:

static MediaPlayer create(Context context, Uri uri):从指定Uri来装载音频文件,并返回创建的MediaPlayer对象。

static MediaPlayer create(Conetxt context, int resid):从resid资源ID对应的资源文件中装载音频文件,并返回新创建的MediaPlayer对象。

但是,如果要循环播放多个文件,使用此方法会每次都创建一个新的MediaPlayer对象,不太合适。此时可以通过MediaPlayer的setDataSource()方法来装载指定的音频文件。方法如下:

setDataSource(String path):指定装载path路径所代表的文件。

setDataSource(FileDescriptor fd,long offset, long length):指定装载fd所代表的文件从offset开始,长度为length的文件内容。

setDataSource(FileDescriptor fd):指定装载fd所代表的文件。

setDataSource(Context context, Uri uri):指定装载uri所代表的文件。

上面执行的setDataSource()方法之后,MediaPlayer并未真正去装载文件,还需要调用MediaPlayer中的prepare()方法去准备音频,即真正的装载音频。

2、当程序控制MediaPlayer对象装载音频完成之后,程序就可以调用MediaPlayer的如下三个方法进行播放控制;

start():开始或恢复播放。、

stop():停止播放。

pause():暂停播放。

例:

try{

    myPlayer.reset();

//装载下一首歌曲

    myPlayer.setDataSource("/mnt/sdcard/next.mp3");

//准备声音

   myPlayer.prepare();

//播放

   myPlayer.start();

}

catch(IOException e){

    e.printStackTrace();

}

二、使用MediaPlayer播放集中不同来源的音频文件:

1、播放应用的资源文件(音频文件一般放在Android应用的/res/raw目录下)

调用MediaPlayer的create(Context context, int resid)方法装载指定的资源文件。

调用MediaPlayer的start(),pause(),stop()方法控制播放即可。

MediaPlayer myPlayer = MediaPlayer.create(this,R.raw.song);
myPlayer.start();
2、播放应用的原始资源文件
调用Context的getAssets()方法获取应用的AssetManager。

调用AssetManager对象的openFd(String name)方法打开指定的原始资源,该方法返回一个AssetFileDescriptor对象。

调用AssetFileDescriptor的getFileDescriptor(),getStartOffset(),getLength()方法来获取音频文件的FileDescriptor、开始位置、长度等。

创建MediaPlayer对象(或利用已有的MediaPlayer对象),并调用MediaPlayer对象的setDataSource(FileDescriptor fd,long offset, long length)方法来装载音频资源。

调用MediaPlayer对象的prepare()方法准备音频。

调用MediaPlayer的start(),pause(),stop()等方法控制播放即可。

注:虽然MediaPlayer提供了setDataSource(FileDescriptor fd)方法来装载指定的音频资源,但实际使用这个方法似乎有问题:不管程序调用openFd(String name)方法时指定打开那个原始资源,MediaPlayer将总是播放第一个原始音频资源。

AssetManager am = getAsset();
//打开指定音频文件
AssetFileDescriptor afd = am.openFd(music);
MediaPlayer myPlayer = new MediaPlayer();
//使用MediaPlayer装载指定声音文件
myPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
//准备声音
myPlayer.prepare();
//播放
myPlayer.start();

3、播放外部存储其上的音频文件

创建MediaPlayer对象(或利用已有的MediaPlayer对象),并调用MediaPlayer对象的setDataSource(String path)方法转载指定的音频文件。

调用MediaPlayer对象的prepare()方法准备音频。

调用MediaPlayer的start(),pause(),stop()等方法控制音频的播放。

MediaPlayer myPlayer = new MediaPlayer();
//使用MediaPlayer装载指定的文件
myPlayer.setDataSource("/mnt/sdcard/mysong.mp3");
//准备声音
myPlayer.prepare();
//播放
myPlayer.start();

4、播放来自网络的音频文件

有两种方式:(1)直接使用MediaPlayer的静态create(Context context, Uri uri)方法。

(2)调用MediaPlayer的setDataSource(Context context , Uri uri)方法装载指定的Uri对应的音频文件。

以第二种方式播放来自网络的音频文件:

根据网络上的音频文件所在的位置创建Uri对象

创建MediaPlayer对象(或利用已有的MediaPlayer对象),并调用MediaPlayer对象的setDataSource(Context context, Uri uri)方法装载Uri对应的音频文件。

调用MediaPlayer对象的prepare()方法准备音频

调用MediaPlayer的start(),pause(),stop()等方法控制播放即可

Uri uri = Uri.parse("http://www.crazyit.org/abc.mp3");
MediaPlayer myPlayer = new Mediaplayer();
//使用MediaPlayer根据Uri来装载音频文件
myPlayer.setDataSource(this,uri);
//准备声音
myPlayer.prepare();
//播放
myPlayer.start();
MediaPlayer除了调用prepare()方法来准备声音之外,还可以调用prepareAsync()来准备声音。两者的区别在于,prepareAsync()是异步的,它不会阻塞主线程即UI线程。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:425次
    • 积分:61
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档