Android学习笔记四十五之MediaPlayer

来源:互联网 发布:正方软件股份有限公司 编辑:程序博客网 时间:2024/05/16 11:44

 这一篇我们介绍一下Android的音频和视频播放,重点讲解Mediaplayer这个类。 android的MediaPlayer包含了Audio和Video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlaer来实现的。

概述

首先我们看一下Mediaplayer的生命周期图

下面我们看一下MediaPlayer提供的方法:

  • addTimedTextSource(Context context, Uri uri, String mimeType)方法:添加一个外部定时文本文件,重载方法:addTimedTextSource(String path, String mimeType)、addTimedTextSource(FileDescriptor fd, long offset, long length, String mime)、addTimedTextSource(FileDescriptor fd, String mimeType)
  • attachAuxEffect(int effectId)方法:给播放器附加一个播放效果
  • create(Context context, Uri uri, SurfaceHolder holder, AudioAttributes audioAttributes, int audioSessionId)方法:实例化Mediaplayer的方法,重载方法有:create(Context context, Uri uri, SurfaceHolder holder)、create(Context context, int resid, AudioAttributes audioAttributes, int audioSessionId)、create(Context context, int resid)、create(Context context, Uri uri)
  • deselectTrack(int index)方法:取消曲目
  • getAudioSessionId()方法:获取音乐的SessionID
  • getCurrentPosition()方法:获取当前播放位置
  • getDuration()方法:获取文件的播放时间
  • getPlaybackParams()方法:获取播放参数
  • getSelectedTrack(int trackType)方法:获取选中的曲目
  • getSyncParams()方法:获取Audio或者Vedio的同步模式
  • getTimestamp()方法:获取当前的播放位置作为一个时间戳
  • getTrackInfo()方法:获取轨道信息数组
  • getVideoHeight()方法:获取Vedio播放器的高度
  • getVideoWidth()方法:获取Vedio播放器的宽度
  • isLooping()方法:检查播放器是否在循环
  • isPlaying()方法:检查播放器是否在播放
  • pause()方法:暂停
  • prepare()方法:准备播放器进行播放
  • prepareAsync():异步准备播放器
  • release()方法:释放与当前Mediaplayer相关的资源
  • reset()方法:重置播放器状态
  • seekTo(int msec)方法:跳转到特定时间位置
  • selectTrack(int index)方法:选中一个曲目
  • setAudioAttributes(AudioAttributes attributes)方法:设置音频播放器的属性
  • setAudioSessionId(int sessionId)方法:设置音频播放器的SessionId
  • setAudioStreamType(int streamtype)方法:设置Mediaplayer的音频流类型
  • setAuxEffectSendLevel(float level)方法:设置播放器的第二电平附加作用
  • setDataSource(String path)方法:设置多媒体资源位置,重载方法有:setDataSource(Context context, Uri uri, Map

音频播放

使用Mediaplayer实现音频播放有几个步骤:

  1. 创建Mediaplayer对象,这有几种方法,一种是直接new出来,另外一种是通过调用create方法,需要注意的是:直接new出来需要调用prepare方法,建议使用prepareAsync方法完成准备;调用create方法就不能调用prepare方法,否则会出现状态异常

  2. 通过setDataSource()方法设置音频文件的路径,当然这里只是很简单的,实际开发中会采取其他方法

3.调用start方法开始播放音频

下面我们通过一个小例子实现音频播放

首先是布局文件代码:

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="8dp"><LinearLayout    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="horizontal">    <Button        android:id="@+id/btn_music_play"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="播放"/>    <Button        android:id="@+id/btn_music_stop"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="暂停"/>    <Button        android:id="@+id/btn_music_resume"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="继续"/></LinearLayout><SeekBar    android:id="@+id/seekbar"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_marginTop="10dp"    android:max="0"    android:progress="0"    android:secondaryProgress="0"/><RelativeLayout    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_marginTop="10dp">    <TextView        android:id="@+id/tv_now_time"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:text="当前时间"/>    <TextView        android:id="@+id/tv_total_time"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:text="总时间"/></RelativeLayout></LinearLayout> 

这里没有什么好介绍的,非常简单的一个布局。

接下来是Activity的代码:

package com.example.mediplayerdemo;import android.content.Context;import android.content.Intent;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.SeekBar;import android.widget.TextView;/** * Created by Huawen on 2016/9/5. */public class MusicActivity extends AppCompatActivity {private static final String TAG = "MusicActivity";private Button btn_music_play;private Button btn_music_stop;private Button btn_music_resume;private SeekBar mSeekBar;private TextView tv_now_time;private TextView tv_total_time;private MediaPlayer mMediaPlayer;private Handler mHandler = new Handler() {    @Override    public void handleMessage(Message msg) {        super.handleMessage(msg);    }};private boolean isDstroy = false;private Runnable mRunable = new Runnable() {    @Override    public void run() {        if (!isDstroy) {            mHandler.postDelayed(this, 1000);            int currentTime = Math.round(mMediaPlayer.getCurrentPosition() / 1000);            String currentStr = String.format("%s%02d:%02d", "当前时间 ", currentTime / 60, currentTime % 60);            tv_now_time.setText(currentStr);            mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());        }    }};@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_music);    initView();    initMediaPlayer();}private void initMediaPlayer() {    mMediaPlayer = MediaPlayer.create(this, R.raw.erathemass);    Log.d(TAG, "初始化播放器");}private void initView() {    btn_music_play = (Button) findViewById(R.id.btn_music_play);    btn_music_stop = (Button) findViewById(R.id.btn_music_stop);    btn_music_resume = (Button) findViewById(R.id.btn_music_resume);    mSeekBar = (SeekBar) findViewById(R.id.seekbar);    tv_now_time = (TextView) findViewById(R.id.tv_now_time);    tv_total_time = (TextView) findViewById(R.id.tv_total_time);    mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {        @Override        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {            if (mMediaPlayer != null) {                mMediaPlayer.seekTo(seekBar.getProgress());            }        }        @Override        public void onStartTrackingTouch(SeekBar seekBar) {        }        @Override        public void onStopTrackingTouch(SeekBar seekBar) {        }    });    btn_music_play.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (!mMediaPlayer.isPlaying()) {                mMediaPlayer.start();                int totalTime = Math.round(mMediaPlayer.getDuration() / 1000);                String totalStr = String.format("%02d:%02d", totalTime / 60, totalTime % 60);                tv_total_time.setText(totalStr);                mHandler.postDelayed(mRunable, 1000);                mSeekBar.setMax(mMediaPlayer.getDuration());            }        }    });    btn_music_resume.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (mMediaPlayer.isPlaying()) {                mMediaPlayer.pause();            }        }    });    btn_music_stop.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (mMediaPlayer.isPlaying()) {                mMediaPlayer.reset();                initMediaPlayer();            }        }    });}public static void startActivity(Context mContext) {    mContext.startActivity(new Intent(mContext, MusicActivity.class));}@Overrideprotected void onDestroy() {    super.onDestroy();    if (mMediaPlayer != null) {        mMediaPlayer.stop();        isDstroy = true;        mMediaPlayer.release();    }}}

这里只是很简单的实现单首歌曲的播放,就不贴效果图了,后面我们会专门做一个音乐播放器的项目。

视频播放

这里我们使用VideoView实现网络视频播放,实现的步骤:

  1. 在布局文件中创建VideoView组件,或者在代码中指定

  2. 调用VedioView的两个方法指定播放的视频文件:(1)setVidePath(String path):加载path文件代表的视频;(2)setVideoURI(Uri uri):加载uri所对应的视频

  3. 调用VideoView的start()、stop()、pause()方法来控制视频的播放

下面我们实现一个简单的例子:

首先是布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><VideoView    android:id="@+id/videoView"    android:layout_width="match_parent"    android:layout_height="400dp"/><LinearLayout    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_marginLeft="8dp"    android:layout_marginRight="8dp"    android:layout_marginTop="20dp"    android:orientation="horizontal">    <Button        android:id="@+id/btn_video_start"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="播放"/>    <Button        android:id="@+id/btn_video_pause"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="暂停"/>    <Button        android:id="@+id/btn_video_stop"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="暂停"/></LinearLayout></LinearLayout>

然后是activity代码:

package com.example.mediplayerdemo;import android.content.Context;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.VideoView;/** * author: Huawen * created on: 2016/9/5 11:00 * description: */public class MovieActivity extends AppCompatActivity {private VideoView videoView;private Button btn_video_start;private Button btn_video_pause;private Button btn_video_stop;private Uri mURI = Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_movie);    videoView = (VideoView) findViewById(R.id.videoView);    btn_video_start = (Button) findViewById(R.id.btn_video_start);    btn_video_pause = (Button) findViewById(R.id.btn_video_pause);    btn_video_stop = (Button) findViewById(R.id.btn_video_stop);    videoView.setVideoURI(mURI);    btn_video_start.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (videoView != null) {                videoView.start();            }        }    });    btn_video_pause.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (videoView != null) {                videoView.pause();            }        }    });    btn_video_stop.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (videoView != null) {                videoView.stopPlayback();            }        }    });}public static void startActivity(Context mContext) {    mContext.startActivity(new Intent(mContext, MovieActivity.class));}}

这里我们是手动控制播放,也可以直接设置一个MediaController控制,不需要我们手动去控制实现播放

效果图:

由于是在模拟器上,所以比较慢,就不做GIF图了。关于Mediaplayer就简单介绍到这里了,下面附上Mediaplayer和VideoView的国内镜像API:

Mediaplayer国内镜像API

VideoView国内镜像API

欢迎大家一起交流学习!

原创粉丝点击