`

Android学习11-----多媒体技术(3) 媒体播放

阅读更多

 

         Android 中,我们可以通过 android.media.MediaPlayer 类完成音频或视频文件的播放操作。需要注意的是视频和音频有许多格式,但是 MediaPlayer 类只能完成一些基本格式的操作,如果 MP3 3GP 等,而其他媒体格式则需要编写相应的解码器进行解码播放。

 

生命周期解释:

1、  Idle 状态 :当使用关键字 new 实例化一个 MediaPlayer 对象或者是调用了类中的 reset() 方法时会进入到此状态

2、  End 状态 :当调用 release() 方法之后将进入到此状态,此时会释放所有占用的硬件和软件的资源,并且不会再进入其他任何一种状态。

3、  Initialized 状态 :当 MediaPlayer 对象设置好要播放的媒体 (setDataSource()) 之后进入到此状态。

4、  Prepared 状态 :预播放状态 (prepare() prepareAsync()) ,进入到此状态则表示目前的媒体文件没有任何问题,可以使用 OnPreparedListener 监听。

·如果用户调用的是 prepare() 方法(同步),则表示该 MediaPlayer 对象已经进入 Prepared 状态;

·如果用户调用的是 prepareAsync() 方法(异步),则表示该 MediaPlayer 对象进入 Preparing 状态并返回,而内部播放引擎会继续执行为完成的准备工作。

5、  Started 状态 :正在进行媒体播放 (start()) ,此时可以使用 seekTo() 方法指定媒体播放的位置。

6、  Paused 状态 :在 Started 状态下使用 Paused 状态可以暂停 MediaPlayer 的播放,暂停之后可以通过 Start() 方法将其变回到 Started 状态,继续播放。

7、  Stopped 状态 :在 Started Paused 状态下都可以通过 stop() 方法停止 MediaPlayer 的播放,在 Stopped 状态下要想重新进行播放,则可以使用 prepare() prepareAsync() 方法进入到就绪状态。

8、  PlaybackCompleted 状态 :当媒体文件播放完毕之后会进入此状态,用户可以使用 OnCompletionListener 监听此状态,此时可以使用 start() 方法重新播放,也可以使用 stop() 方法停止播放,或者使用 seekTo() 方法来重新定义播放位置。

9、  Error 状态: 当用户播放操作中出现某些错误(文件格式不正确、播放文件过大等)时则进入此状态,用户可以使用 OnErrorListener 来监听此状态,如果 MediaPlayer 进入此状态,可以用 reset() 方法重新变回 Idle 状态。

MP3 播放器:

MediaPlayer01_Mp3PlayerActivity.java

package com.iflytek.demo;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class MediaPlayer01_Mp3PlayerActivity extends Activity {
	private ImageButton play = null;
	private ImageButton pause = null;
	private ImageButton stop = null;
	private TextView info = null;
	private MediaPlayer mediaPlayer = null;
	private SeekBar seekbar = null;
	private boolean playFlag = true; // 播放标记
	private boolean pauseFlag = true; // 暂停标记

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		this.info = (TextView) super.findViewById(R.id.info);
		this.play = (ImageButton) super.findViewById(R.id.play);
		this.pause = (ImageButton) super.findViewById(R.id.pause);
		this.stop = (ImageButton) super.findViewById(R.id.stop);
		this.seekbar = (SeekBar) super.findViewById(R.id.seekbar);
		this.play.setOnClickListener(new PlayOnClickListener());
		this.pause.setOnClickListener(new PauseOnClickListener());
		this.stop.setOnClickListener(new StopOnClickListener());
		this.seekbar
				.setOnSeekBarChangeListener(new OnSeekBarChangeListenerImpl());
	}

	private class UpdateSeekBar extends AsyncTask<Integer, Integer, String> {

		@Override
		protected void onPostExecute(String result) {//任务执行完后执行
			super.onPostExecute(result);
		}

		@Override
		protected void onProgressUpdate(Integer... values) {//每次更新后的数值
			MediaPlayer01_Mp3PlayerActivity.this.seekbar.setProgress(values[0]);//更新拖动条
		}

		@Override
		protected String doInBackground(Integer... params) {//处理后台任务
			while (MediaPlayer01_Mp3PlayerActivity.this.playFlag) { // 播放的话,进度要累加
				try {
					Thread.sleep(params[0]);//延缓执行
				} catch (InterruptedException e) {
				}
				this.publishProgress(MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer
						.getCurrentPosition());//修改拖动条
			}
			return null;//返回执行结果
		}

	}

	private class PlayOnClickListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer = MediaPlayer
					.create(MediaPlayer01_Mp3PlayerActivity.this, R.raw.hight); // 要播放的文件
			if (MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer != null) {
				MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.stop(); // 停止操作
			}
			MediaPlayer01_Mp3PlayerActivity.this.seekbar
					.setMax(MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer
							.getDuration()); // 设置拖拽条的长度
			UpdateSeekBar update = new UpdateSeekBar();
			update.execute(500);

			MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer
					.setOnCompletionListener(new OnCompletionListener() {

						@Override
						public void onCompletion(MediaPlayer mp) {
							MediaPlayer01_Mp3PlayerActivity.this.playFlag = false; // 播放完毕
							MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer
									.release(); // 释放资源
						}
					});
			try {
				MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.prepare();
				MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.start();
				MediaPlayer01_Mp3PlayerActivity.this.info
						.setText("正在播放音频文件...");
			} catch (Exception e) {
				MediaPlayer01_Mp3PlayerActivity.this.info.setText("文件播放出现异常,"
						+ e);
			}

		}

	}

	private class PauseOnClickListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			if (MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer != null) {
				if (MediaPlayer01_Mp3PlayerActivity.this.pauseFlag) { // 现在暂停
					MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.start();
					MediaPlayer01_Mp3PlayerActivity.this.pauseFlag = false;
				} else {
					MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.pause(); // 暂停
					MediaPlayer01_Mp3PlayerActivity.this.pauseFlag = true;
					MediaPlayer01_Mp3PlayerActivity.this.info
							.setText("暂停音频文件...");
				}
			}
		}

	}

	private class StopOnClickListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			if (MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer != null) {
				MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.stop(); // 停止
				MediaPlayer01_Mp3PlayerActivity.this.info
						.setText("停止播放音频文件...");
			}
		}
	}

	private class OnSeekBarChangeListenerImpl implements
			OnSeekBarChangeListener {

		@Override
		public void onProgressChanged(SeekBar seekBar, int progress,
				boolean fromUser) {

		}

		@Override
		public void onStartTrackingTouch(SeekBar seekBar) {

		}

		@Override
		public void onStopTrackingTouch(SeekBar seekBar) {//进度条停止拖拽
			MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.seekTo(seekBar
					.getProgress());//定义播放位置
		}

	}
}
 

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/info"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="等待音频文件播放" />

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <ImageButton
            android:id="@+id/play"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/play" />

        <ImageButton
            android:id="@+id/pause"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/pause" />

        <ImageButton
            android:id="@+id/stop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/stop" />
    </LinearLayout>

    <SeekBar
        android:id="@+id/seekbar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
 

 

         MediaPlayer 除了可以播放音频之外,还可以播放视频,但是如果要视频,只依靠 MediaPlayer 是不够的,还需要编写一个可以用于视频显示的控件,而这块显示空间要求可以快速进行 GUI 的更新,而且可以在渲染代码时对 GUI 进行无阻塞的渲染,如果要完成此功能,则必须依靠 android.view.SurfaceView 组件, SurfaceView 组件封装了一个 Surface 对象,而不是一个 Canvas 对象,使用 Surface 可以完成对后台线程的控制,对于视频、 3D 是图形等需要快速更新或者高帧率的对象有很大的用处。

视频播放 Demo

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" 
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<LinearLayout 
		xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="horizontal" 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content">
		<ImageButton
			android:id="@+id/play"
			android:src="@drawable/play"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" />
		<ImageButton
			android:id="@+id/stop"
			android:src="@drawable/stop"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" />
	</LinearLayout>
	<SurfaceView
		android:id="@+id/surfaceView"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent" /> 
</LinearLayout>

 

 

对于 SurfaceView 现在只是一个基本的使用,而关于它的更多应用,会在后面说拍照等功能实现的时候再深入。

如果要想操作 SurfaceView ,那么就必须对其做一些基本的设置,设置其操作类型,如果要想设置 SurfaceView 的一些参数,那么就必须依靠 SurfaceHolder 类完成。

MediaPlayer02_VideoPlayerActivity.java

package com.iflytek.demo;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

public class MediaPlayer02_VideoPlayerActivity extends Activity {

	private ImageButton play = null;
	private ImageButton stop = null;
	private MediaPlayer mediaPlayer = null;
	private SurfaceView surfaceView = null;
	private SurfaceHolder surfaceHolder = null;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		this.play = (ImageButton) super.findViewById(R.id.play);
		this.stop = (ImageButton) super.findViewById(R.id.stop);
		this.surfaceView = (SurfaceView) super.findViewById(R.id.surfaceView);
		this.surfaceHolder = this.surfaceView.getHolder();// 取得SurfaceHolder
		this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 设置SurfaceView的类型
		this.mediaPlayer = new MediaPlayer();// 创建MediaPlayer对象
		try {
			this.mediaPlayer.setDataSource("/sdcard/test.3gp"); // 设置播放文件的路径,这里就没有判断sdcard是否存在了
		} catch (Exception e) {
			e.printStackTrace();
		}
		this.play.setOnClickListener(new PlayOnClickListenerImpl());
		this.stop.setOnClickListener(new StopOnClickListenerImpl());
	}

	private class PlayOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			MediaPlayer02_VideoPlayerActivity.this.mediaPlayer
					.setAudioStreamType(AudioManager.STREAM_MUSIC);// 设置音频类型
			MediaPlayer02_VideoPlayerActivity.this.mediaPlayer
					.setDisplay(MediaPlayer02_VideoPlayerActivity.this.surfaceHolder);// 设置显示区域
			try {
				MediaPlayer02_VideoPlayerActivity.this.mediaPlayer.prepare();// 预备状态
				MediaPlayer02_VideoPlayerActivity.this.mediaPlayer.start();// 播放视频
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	private class StopOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			MediaPlayer02_VideoPlayerActivity.this.mediaPlayer.stop();// 停止播放
		}

	}
}
 

 

 

 

 

 

  • 大小: 23 KB
分享到:
评论

相关推荐

    Android应用开发完全自学手册——核心技术、传感器、2D/3D、多媒体与典型案例

    在技术理论的讲解方面,《Android应用开发完全自学手册:核心技术、传感器、2D/3D、多媒体与典型案例》注重对实际动手能力和完全自学的指导,书中重点讲解了Android开发的核心知识及流行的应用技术,如游戏开发、2D...

    Android多媒体编程从初学到精通

    读者对象:本书内容翔实、分析深刻,是Android学习多媒体编程不可多得的资料。可以作为IT相关专业本科生和研究生,以及嵌入式领域的初、中级软件工程师的参考读物。 作者简介 苗忠良,资深Android开发工程师和...

    Android高级编程--源代码

    作为使用androidsdk构建这些应用程序的实用指南书籍,《android高级编程》从始至终穿插了一系列示例项目,每个项目都引入android的新功能和新技术,以助您达到最圆满的学习效果。书中介绍android的所有基本功能,并...

    Android应用开发完全自学手册——核心技术、传感器、2D/3D、多媒体与典型案例(书后源码)

    看到有人书后源码和项目案例ppt居然...Android应用开发完全自学手册——核心技术、传感器、2D/3D、多媒体与典型案例(书后源码); Android应用开发完全自学手册——核心技术、传感器、2D/3D、多媒体与典型案例(书后源码)

    Android开发项目---人力资源管理系统.zip

    Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。... 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。

    基于android的多媒体播放器(服务端+客户端+数据库).zip

    使用Android技术实现的简单的多媒体播放器(服务端+客户端+数据库),平台为eclipse,可以作为毕业设计,课程设计等的参考模板,希望大家好好学习,争取更上一层楼。

    新版Android开发教程.rar

    支持视频格式: H.264 、流媒体、 3GPP 、 MPEG4 和 Codec 3GP ;支持音频格式: MP3 、 AAC 、 AAC+ 、 W MA 、 MPEG4 、 WAV 、 MIDI 、 REAL 、 AUDIO 和 OGG ;支持墙纸格式: JPG 、 BMP 、 PNG 和 GIF ;铃声 ...

    老罗android开发视频教程全集百度网盘下载

    Android进阶高级:蓝牙/WIFI SMS/MMS 应用实现 深层次解析GPS原理,实现LocationManager/LocationProvider 进行定位/跟踪/查找/趋近警告以及Geocoder正逆向编解码等技术细节 2D图形库(Graphics/View)详解 SDCARD/...

    [14本经典Android开发教程]-3-Android SDK 中文开发文档

    [14本经典Android开发教程]-3-Android SDK 中文开发文档 什么是 Android? Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。Beta版的 Android SDK 提供了在Android 平台上...

    Android课程设计-有机农场管理系统APP.zip

    Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。... 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。

    android的多媒体

    想要学习android的多媒体技术的可以看一下

    android多媒体框架

    介绍了android多媒体的框架,学习移动流媒体技术的资料

    Android开发应用实战详解.(铁道出版.张元亮).part2

    《Android开发应用实战详解(附光盘)》循序渐进地讲解了android技术在各个领域中具体应用的典型范例,详细介绍了各个范例的具体实现过程。《Android开发应用实战详解(附光盘)》内容新颖、知识全面、讲解详细,...

    NBA数据分析系统(Android客户端代码)- -.zip

    Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。... 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part3

    书名:《Android底层开发技术实战详解——内核、移植和驱动》(电子工业出版社.王振丽)。本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解...

    Android应用源码多媒体播放器.zip项目安卓应用源码下载

    Android应用源码多媒体播放器.zip项目安卓应用源码下载Android应用源码多媒体播放器.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    深入理解Android:卷I--详细书签版

    10.2.3 android.process.media媒体扫描工作的流程总结 471 10.3 MediaScanner分析 472 10.3.1 Java层分析 472 10.3.2 JNI层分析 476 10.3.3 PVMediaScanner分析 479 10.3.4 关于MediaScanner的总结 485 10.4 ...

    校竞赛管理系统--毕业设计--Android.zip

    Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。... 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。

    Android编程入门很简单.(清华出版.王勇).part1

    本书是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书。本书避免出现云山雾罩、晦涩难懂的讲解,代之以轻松活泼、由浅入深的剖析。这必将使得阅读本书的读者少走弯路,...

    Android - 个性化脊柱矫形系统.zip

    Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。... 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。

Global site tag (gtag.js) - Google Analytics