Android MediaPlayer 播放音频
Android 提供了 MediaPlayer 来播放多媒体,这个 API 可以播放播放音频和视频
MediaPlayer 可以以最少的代码来获取获取,解码和播放音视频
MediaPlayer 支持三种多媒体源
- 本地资源
- 内部的 URI,比通过 ContentResolver 获取的
- 外部 URL (流)
Android 支持的媒体格式列表,可以访问 Supported Media Formats
创建 MediaPlayer 实例
可以 new 或者调用 create 方法创建一个 MediaPlayer 实例
MediaPlayer mp = new MediaPlayer();
create() 方法无需再调用 setDataSource(),因为参数就是一个多媒体源
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);
create() 方法还有其它的签名,比如
create(Context context, Uri uri, SurfaceHolder holder)
通过 Uri 和指定 SurfaceHolder (抽象类) 创建一个多媒体播放器
设置播放源(音频文件)
针对不同的音频源,可以调用不同的方法
-
res/raw
目录下的文件MediaPlayer.create(this, R.raw.song);
-
本地文件路径
mp.setDataSource("/sdcard/song.mp3");
-
网络 URL 文件
mp.setDataSource("https://www.twle.cn/static/i/song.mp3");
setDataSource()
方法有多个重载,但如果你传递了 FileDescriptor 参数,则需要把多媒体文件放到 res 文件夹平级的 assets 文件夹里
然后使用下述代码设置 DataSource
AssetFileDescriptor fileDescriptor = getAssets().openFd("song.mp3"); m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
MediaPlayer 其它方法列表
方法 | 说明 |
---|---|
getCurrentPosition( ) | 得到当前的播放位置 |
getDuration() | 得到文件的时间 |
getVideoHeight () | 得到视频高度 |
getVideoWidth() | 得到视频宽度 |
isLooping() | 是否循环播放 |
isPlaying() | 是否正在播放 |
pause() | 暂停 |
prepare() | 准备(同步) |
prepareAsync() | 准备(异步) |
release() | 释放 MediaPlayer 对象 |
reset() | 重置 MediaPlayer 对象 |
seekTo(int msec) | 指定播放的位置(以毫秒为单位) |
setAudioStreamType(int streamtype) | 指定流媒体的类型 |
setDisplay(SurfaceHolder sh) | 用 SurfaceHolder 显示多媒体 |
setLooping(boolean looping) | 设置是否循环播放 |
setOnBufferingUpdateListener( MediaPlayer.OnBufferingUpdateListener listener) |
网络流媒体的缓冲监听 |
setOnCompletionListener( MediaPlayer.OnCompletionListener listener) |
网络流媒体播放结束监听 |
setOnErrorListener( MediaPlayer.OnErrorListener listener) |
设置错误信息监听 |
setOnVideoSizeChangedListener( MediaPlayer.OnVideoSizeChangedListener listener) |
视频尺寸监听 |
setScreenOnWhilePlaying(boolean screenOn) | 是否使用 SurfaceHolder 显示 |
setVolume(float leftVolume, float rightVolume) | 设置音量 |
start() | 开始播放 |
stop() | 停止播放 |
范例 : 使用 MediaPlayer 播放音频文件
接下来我们将使用 MediaPlayer 开发一个播放 mp3 文件的应用,最终效果如下
-
创建一个 空的 Android 项目
cn.twle.android.AudioPlayer
-
在 res 目录上点右键,然后选择
Android resource directory
,在弹出的界面中Resource type
项选择 raw 然后点击 OK -
然后下载范例音频文件 /static/i/song.mp3 放到
res/raw
目录下 -
修改
activity_main.xml
<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp"> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" /> <Button android:id="@+id/btn_pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂停 " /> <Button android:id="@+id/btn_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="终止" /> </LinearLayout>
-
修改
MainActivity.java
创建 MediaPlayer 实例并播放 res/raw 目录下的 song.mp3 文件package cn.twle.android.audioplayer; import android.media.MediaPlayer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button btn_play; private Button btn_pause; private Button btn_stop; private MediaPlayer mPlayer = null; private boolean isRelease = true; //判断是否 MediaPlayer 是否释放的标志 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); } private void bindViews() { btn_play = (Button) findViewById(R.id.btn_start); btn_pause = (Button) findViewById(R.id.btn_pause); btn_stop = (Button) findViewById(R.id.btn_stop); btn_play.setOnClickListener(this); btn_pause.setOnClickListener(this); btn_stop.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_start: if(isRelease){ mPlayer = MediaPlayer.create(this,R.raw.song); isRelease = false; } mPlayer.start(); //开始播放 btn_play.setEnabled(false); btn_pause.setEnabled(true); btn_stop.setEnabled(true); break; case R.id.btn_pause: mPlayer.pause(); //停止播放 btn_play.setEnabled(true); btn_pause.setEnabled(false); btn_stop.setEnabled(false); break; case R.id.btn_stop: mPlayer.reset(); //重置MediaPlayer mPlayer.release(); //释放MediaPlayer isRelease = true; btn_play.setEnabled(true); btn_pause.setEnabled(false); btn_stop.setEnabled(false); break; } } }
范例播放的是 res/raw 目录下的音频文件,创建 MediaPlayer 调用的是 create() 方法
第一次启动播放前不需要再调用 prepare()
如果是使用构造方法构造的话,则需要调用一次 prepare() 方法
播放本地 Uri
如果播放的是本地的 Uri 则只要改成如下即可
Uri myUri = ....; // 初始化 Uri MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
外部 URL
如果播放的是外部的 URL 则只要改成如下即可
String url = "http://........"; // 远程 URL MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); mediaPlayer.start();
但要注意的是,这个 URL 要以流的形式播放在线音频文件,该文件必须可以进行渐进式下载,也就是 stream 音频格式