Android MediaPlayer 播放音频

Android 提供了 MediaPlayer 来播放多媒体,这个 API 可以播放播放音频和视频

MediaPlayer 可以以最少的代码来获取获取,解码和播放音视频

MediaPlayer 支持三种多媒体源

  1. 本地资源
  2. 内部的 URI,比通过 ContentResolver 获取的
  3. 外部 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 (抽象类) 创建一个多媒体播放器

设置播放源(音频文件)

针对不同的音频源,可以调用不同的方法

  1. res/raw 目录下的文件

    MediaPlayer.create(this, R.raw.song);
    
  2. 本地文件路径

    mp.setDataSource("/sdcard/song.mp3");
    
  3. 网络 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 文件的应用,最终效果如下


  1. 创建一个 空的 Android 项目 cn.twle.android.AudioPlayer

  2. 在 res 目录上点右键,然后选择 Android resource directory,在弹出的界面中 Resource type 项选择 raw 然后点击 OK

  3. 然后下载范例音频文件 /static/i/song.mp3 放到 res/raw 目录下

  4. 修改 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>
    
  5. 修改 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 音频格式

参考文档

  1. Android MediaPlayer

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.