Android 多媒体之 MediaPlayer

Android 应用增加动画,视频,音乐等多媒体功能,因此为手机提供音频录制,播放,视频录制,播放的功能十分重要。 Android 提供了常见音频,视频的编码,解码机制, Android 支持的音频格式有 MP3,WAV 3GP 等,支持的视频格式有 MP4 3GP等。 Android 提供了这些多媒体的支持类,可以非常方便地在手机应用中播放音频,视频等。这些多媒体数据可以来自 Android 应用的资源文件,也可以来自外部存储器上的文件,也可以来自网络的文件流。

不仅如此, Android 也提供了对摄像头,麦克风的支持,因此也可以十分方便地从外部采集照片,视频,音频等多媒体信息。

——音频和视频的播放

—— MediaPlayer 播放音频

1)MediaPalyer 进行播放控制的方式:

start(): 开始或者恢复播放

stop(): 停止播放

pause(): 暂停播放

2)MediaPlayer 装载指定音频文件的方式

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

static MediaPlayer create(Content,int resid): redid 资源 ID 来装载音频文件,并返回新创建的 MediaPlayer 对象。

上面这两个方法使用起来很简单,但这两个方法每次都会返回新的 MediaPlayer. 如果程序需要播放多个音频文件,使用该方法就不太合适了。此时可通过 setDataSource 方法装载指定的音频文件。

MediaPlayer m = new MediaPlayer(): 只需要创建一个对象

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

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

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

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

执行 setDataSource 方法之后, MediaPlayer 并未真正装载那些音频文件,还需要调用 prepare() 方法准备装载音频。

3) 播放应用 raw 的资源文件

MediaPlayer m=MediaPlayer.create(this,R.raw.apple);

m.start();

4) 播放应用 raw 的资源文件

MediaPlayer m=new  MediaPlayer();

m.setDataSource(Context,Uri.parse(

"android.resource://"+getPackageName()+"/"+R.raw.apple"))

5) 播放应用的原始资源文件

a) 调用 Context getAssets() 获取 AssetManager;

b) 调用 AssetManager openFd(String name) 方法打开指定的原生资源 . 返回 AssetFileDescriptor 对象

c) 调用 AssetFileDescriptor getFileDescriptor() 方法来获取音频文件的 FileDescriptor.

d) 创建 MediaPlayer 对象,调用 setDataSource(FileDescriptor) 方法。

e) 调用 MediaPlayer prepare() 方法准备音频

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

5) 播放外部存储器上音频文件

a) 创建 MediaPlayer 对象,调用 setDataSource("/sdcard/apple.mp3")

b) 调用 MediaPlayer 对象的 prepare()方法

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

6) 播放来自网络的音频文件

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

Uri  uri = Uri.parse("http://www.baidu.com/song.mp3");

b) 创建 MediaPlayer 对象,调用 setDataSource(Context,Uri);

c) 调用 MediaPlayer 对象的 prepare()方法

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

7) 如播放下一首歌曲的代码:

mPlayer.reset();// 空闲状态

mPlayer.setDataSource("/sdcard/gequ.mp3");

mPlayer.prepare();

mPlayer.start();

8)MediaPlayer 还提供了事件监听器的方法

setOnCompletionListener(): 播放完成事件绑定事件监听器

setOnErrorListener(): 播放错误事件绑定事件监听器

setOnPreparedListener(): 调用 prepare() 方法时触发该监听器

setOnSeekCompleteListener(): 调用 seek() 方法时触发该监听器

9)Mediaplayer 除了调用 prepare() 方法准备声音之外,

还可以调用

prepareAsync() 来准备声音,他们的区别在于:

prepareAsync() 是异步的,它不会阻塞当前的 UI 线程。

10)MediaPlayer 的状态图

reset(): 清空MediaPlayer 中的数据

setDataSource(): 设置音频数据

prepare(): 准备装载音频数据

prepareAsync(): 准备装载音频数据(异步)

seekTo(): 重新定位到音频数据的什么位置,单位毫秒

seekTo() 是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发 OnSeekComplete.onSeekComplete() ,如果需要是可以调用 setOnSeekCompleteListener(OnSeekCompleteListener) 设置监听器来处理的。

start():

pause():

stop():

release(): 释放 MediaPlayer 资源

11) 其他的方法

setLooping(true): 是否重复播放

setAudioStreamType() 设置使用的音频流

A(播放音乐的界面)—>B

onPause()—>onCreate,onStart/onResume

—>onStop

先看效果吧:

接下来我就说下步骤:

1.音乐路径:

我们要把播放的音乐文件放在虚拟机的SD卡中,要到第一个0目录下面,按照下面这个图来~

2.播放音乐要MediaPlayer

MediaPlayer mediaPlayer=new MediaPlayer();

3.音乐的声音控制

AudioManager audioManager=(AudioManager) getSystemService(AUDIO_SERVICE);

4.音乐的开始与暂停

public void start(View view){
		mediaPlayer.start();
		new Thread(){
        	public void run() {
        		while(true){
        			try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}//一秒
        			Message msg=
							handler.obtainMessage();
					msg.what=0x123;
					handler.sendMessage(msg);
        }.start();
    public void stop(View view){
		mediaPlayer.pause();
	}
5.布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="播放" 
        android:onClick="start"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暂停" 
        android:onClick="stop"/>
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv"/>
    <SeekBar 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/sb1"/>
    <SeekBar 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/sb2"/>
</LinearLayout>
6.Activity:
public class MainActivity extends Activity {
	private SeekBar sb1,sb2;
	private MediaPlayer mediaPlayer;
	private TextView tv;
	private AudioManager audioManager;
	    private Handler handler =new Handler(){
	    	//收到Handler发回的消息被回调
	    public void handleMessage(Message msg) {
	         //更新UI组件
	         if(msg.what==0x123){
		        int current=mediaPlayer.getCurrentPosition();
		        sb1.setProgress(current);
	public void start(View view){
		mediaPlayer.start();
		new Thread(){
        	public void run() {
        		while(true){
        			try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}//一秒
        			Message msg=
							handler.obtainMessage();
					msg.what=0x123;
					handler.sendMessage(msg);
        }.start();
    public void stop(View view){
		mediaPlayer.pause();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		sb1=(SeekBar) findViewById(R.id.sb1);
		sb2=(SeekBar) findViewById(R.id.sb2);
		tv=(TextView) findViewById(R.id.tv);
		//实例了一个mediaplayer,并给它装在了音乐
		/*//这个方法使用起来很简单
		//但是这俩个方法每次都会返回新的MediaPlayer
		//如果程序需要播放多个音频文件
		//使用该方法不合适
		mediaPlayer=mediaPlayer.create(this, R.raw.music);*/
		mediaPlayer=new MediaPlayer();
		//加载资源文件
		try {
			String path=Environment.getExternalStorageDirectory().
					getAbsolutePath()+"/music.mp3";
			mediaPlayer.setDataSource(path);
			/*mediaPlayer.setDataSource(this, 
					Uri.parse
					("android.resource://"+getPackageName()+"/"+R.raw.music));*/
		    //如果是setDataSource,那么调用完这个文件之后,音频文件没有真正的加载
			//要调用prepare方法
			//异步的加载方式
			//mediaPlayer.prepareAsync();
			mediaPlayer.prepare();
			//设置循环播放
			mediaPlayer.setLooping(false);
			//mediaPlayer.setOnErrorListener(listener);
			//1.setLooping --false   
			//2.在播放完成时触发
			mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
				@Override
				public void onCompletion(MediaPlayer mp) {
					// TODO Auto-generated method stub
					//加载下一首
					Toast.makeText(MainActivity.this, "播放完成", 0).show();
			tv.setText(convert(mediaPlayer.getDuration()));
			sb1.setMax(mediaPlayer.getDuration());
			sb1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
				@Override
				public void onStopTrackingTouch(SeekBar seekBar) {
					// TODO Auto-generated method stub
					//mediaPlayer.start();
				@Override
				public void onStartTrackingTouch(SeekBar seekBar) {
					// TODO Auto-generated method stub
				@Override
				public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
					// TODO Auto-generated method stub
					if(fromUser){
						mediaPlayer.seekTo(progress);
			audioManager=(AudioManager) getSystemService(AUDIO_SERVICE);
			sb2.setMax(audioManager.getStreamMaxVolume(audioManager.STREAM_MUSIC));
			sb2.setProgress(audioManager.getStreamMaxVolume(audioManager.STREAM_MUSIC));
			sb2.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
				@Override
				public void onStopTrackingTouch(SeekBar seekBar) {
					// TODO Auto-generated method stub
				@Override
				public void onStartTrackingTouch(SeekBar seekBar) {
					// TODO Auto-generated method stub
				@Override
				public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
					// TODO Auto-generated method stub
					//一句话
					audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 
							progress, AudioManager.FLAG_SHOW_UI);
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
	protected void onDestroy() {
		// TODO Auto-generated method stub
		if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
			mediaPlayer.stop();
			mediaPlayer.reset();
			mediaPlayer=null;//回收资源
		super.onDestroy();
	private String convert(int duration){
		int second=duration/1000;
		int minute=second/60;
		//剩余秒数
		int miao=second%60;
		return minute+":"+miao;
                    一个极其简单的音乐播放器~很简单很简单~~先看效果吧:接下来我就说下步骤:1.音乐路径:我们要把播放的音乐文件放在虚拟机的SD卡中,要到第一个0目录下面,按照下面这个图来~2.播放音乐要MediaPlayerMediaPlayer mediaPlayer=new MediaPlayer();3.音乐的声音控制AudioManager au
				
Android播放音乐的几种方式前言 前几天一直在研究RxJava2,也写了记录了几篇博客,但因为工作任务原因,需要研究音频相关的知识,暂时放下Rxjava,本文的demo中,MediaPalyer 部分使用RxJava编写一点逻辑,其中涉及,RxJava2的被压、解除订阅等知识点,虽然简单,最起码没有丢了RxJava,后续Rxjava会继续研究,做记录. andorid提供了对声音
class main user media group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc mediadrm ioprio rt 4
Android:使用MediaPlayer播放本地音乐标签(空格分隔): androidAndroid使用MediaPlayer播放本地音乐 一装载音频 1 静态方法 2 动态加载 3 两种方式对比 二MediaPlayer的控制方法 三事件监听 1 准备监听事件 2 完成监听事件 3 错误监听事件 4 定位监听事件 四进度控制 1 添加SeekBar控件 2 给SeekBar设置监听 3 在启动播
项目背景: 多媒体USB音乐,底层调用MediaPlayer来播放U盘中读取的歌曲,由于最初版本将一首MP3歌曲甜蜜蜜写到了AS的raw目录,直接本地播放,做了一首假数据: //临时代码,写死歌曲甜蜜蜜,点击后会播放甜蜜蜜 // mMediaPlayer.setDataSource(AudioHelper.getContext(), // Uri.parse("android.resource://"+AudioHel
MediaPlayer通过资源ID播放Raw目录下音频资源文件:MediaPlayer mMediaPlayer; mMediaPlayer = MediaPlayer.create(this, R.raw.bomb); // mMediaPlayer.setLooping(true); // 设置循环播放 mMediaPlayer.start(); // 开始播放 mMediaPlayer.s
(1)在res文件夹中新建一个文件夹重命名为raw,并且将要播放的音乐放到raw文件夹里面 (2)修改layout目录下的xml布局文件,添加3个按钮空间和一个文本控件,用于提示当前播放状态和 播放暂停 停止等功能。具体代码如下 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" androi
MediaPlayerMediaPlayer类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。它支持三种不同的媒体来源: 内部URI,比如你可以通过ContentResolver来获取 外部URL(流) 对于Android支持的媒体格式列表,可见:Supported Media Formats文档在播放网络上的视频流时,Android原生的
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" >
Android 可以通过以下几个步骤来实现播放音乐: 1. 创建一个 MediaPlayer 对象,该对象将用于播放音乐。可以使用 MediaPlayer 类提供的静态方法 create() 来创建一个新的 MediaPlayer 对象。 2. 为 MediaPlayer 对象设置数据源。可以使用 setDataSource() 方法设置要播放的音乐文件的路径或 URI。 3. 准备 MediaPlayer 对象。可以使用 prepare() 或 prepareAsync() 方法准备 MediaPlayer 对象。如果使用 prepareAsync() 方法,则需要注册一个 OnPreparedListener 来在 MediaPlayer 准备完成后接收通知。 4. 开始播放音乐。可以使用 start() 方法开始播放音乐。 5. 可以使用 pause() 方法暂停播放音乐,并使用 seekTo() 方法跳到特定的播放位置。 6. 播放完成后,可以使用 setOnCompletionListener() 方法注册一个 OnCompletionListener,以便在播放完成时接收通知。 7. 最后,可以在 Activity 或 Fragment 的 onDestroy() 方法中释放 MediaPlayer 对象,并将其设置为 null。 以上就是在 Android 上实现播放音乐的基本步骤。