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实现音频播放有几个步骤:
创建Mediaplayer对象,这有几种方法,一种是直接new出来,另外一种是通过调用create方法,需要注意的是:直接new出来需要调用prepare方法,建议使用prepareAsync方法完成准备;调用create方法就不能调用prepare方法,否则会出现状态异常
通过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实现网络视频播放,实现的步骤:
在布局文件中创建VideoView组件,或者在代码中指定
调用VedioView的两个方法指定播放的视频文件:(1)setVidePath(String path):加载path文件代表的视频;(2)setVideoURI(Uri uri):加载uri所对应的视频
调用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
欢迎大家一起交流学习!
- Android学习笔记四十五之MediaPlayer
- Android学习笔记进阶1之MediaPlayer
- Android 学习笔记二十一之 MediaPlayer
- Android学习笔记045之MediaPlayer
- Android MediaPlayer学习笔记
- Android mediaplayer学习笔记
- Android学习之MediaPlayer
- Androin学习笔记四十五:Android画图Path的使用
- JavaScript学习笔记(四十五) 策略
- 学习笔记之Vitamio的MediaPlayer
- 2011年Android MediaPlayer学习笔记之一
- 【Android学习笔记】MediaPlayer基本使用方法
- 大数据学习笔记之四十五 深度学习和机器学习的区别
- Android视频播放器之学习MediaPlayer
- Android学习之MediaPlayer 音频播放器
- Android学习之MediaPlayer视频播放
- 软件工程视频学习笔记(四十五)
- JAVA学习笔记(四十五) - 布局管理器
- 技术就是黄金屋,技术就是颜如玉
- svn版本管理软件——svn发布补丁和打补丁
- extjs regex
- 多线程向一个文件中写数据
- 【探秘ES6】系列专栏(六):解构赋值
- Android学习笔记四十五之MediaPlayer
- 发布体验版小程序-微信小程序开发-视频教程15
- 解读The Python Tutorial(三)
- Manifold SLIC A Fast Method to Compute Content-Sensitive Superpixels
- 从0开始 搭建一个SVN 和Maven 中遇到的问题
- npm install之cannot run in wd %s %s (wd=%s)问题及解决
- 手动配置PHPnow多个目录,让一台服务器上面运行无限个网站
- 和为sum的连续整数序列
- 计面1