`

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
分享到:
评论

相关推荐

    Pro.Android.Media--Android多媒体开发白皮书

    根据给定的信息,“Pro.Android.Media--Android多媒体开发白皮书”是...通过对本书的学习,开发者不仅能够掌握基本的多媒体开发技巧,还能够深入了解各种高级功能和技术细节,从而更好地满足日益增长的多媒体应用需求。

    android 播放局域网共享多媒体文件

    在Android平台上,播放局域网共享的多媒体文件是一项...总之,Android播放局域网共享多媒体文件涉及了多媒体处理、网络通信和文件操作等多个技术领域,掌握这些技能将有助于你开发出功能完备、性能优秀的Android应用。

    Android多媒体设计教程 Android多媒体设计教程

    通过这些知识点的学习,开发者可以更好地理解Android如何处理多媒体数据,以及如何利用Android提供的多媒体API来实现复杂的多媒体功能。此外,OpenCore平台的强大功能也为Android多媒体应用的开发提供了坚实的基础。

    Android多媒体开发高级编程-5

    本篇将深入探讨Android多媒体开发的高级编程技术,帮助开发者掌握如何在Android应用中集成丰富的媒体功能。 1. **多媒体框架** Android提供了一个强大的多媒体框架,包括Media Framework,它由多个组件构成,如...

    Android的多媒体框架

    Android系统利用硬件加速技术提高多媒体处理效率,尤其是对于高清视频播放和录制。OpenMAX AL和IL库使得开发者能够利用设备的硬件编解码能力,降低CPU负载,提升用户体验。 总之,Android的多媒体框架是一个功能...

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

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

    基于Android的简单多媒体播放器

    在Android平台上开发一个简单的多媒体播放器是一个非常实用的学习项目,它涵盖了Android SDK中的多个关键知识点。这个基于Android的简单多媒体播放器旨在帮助开发者理解和实践如何处理音频和视频内容的播放。下面将...

    Android多媒体开发高级编程-电子书

    3. **Surface和OpenGL ES**:Android多媒体开发常常涉及到Surface和OpenGL ES,用于实现流畅的视频播放和复杂的图形渲染。书籍会讲解如何使用SurfaceView和TextureView进行视频显示,以及如何结合OpenGL ES进行图形...

    实验6 Android多媒体开发实验2019答案

    - **学习Android平台上的多媒体开发技术**:了解Android多媒体框架的基本结构和工作原理,熟悉多媒体组件如`MediaPlayer`的使用方法。 - **了解Android平台多媒体开发的框架**:深入理解Android系统如何处理多媒体...

    Android多媒体开发高级编程电子书

    这本书深入探讨了如何在智能手机和平板电脑上构建图形、音乐和视频应用,涵盖了Android多媒体开发的各个方面,对于想要提升自己在Android多媒体技术方面能力的开发者来说,是一份宝贵的资源。 在Android平台上进行...

    行业分类-设备装置-多媒体文件播放控制方法及多媒体设备.zip

    标题中的“行业分类-设备装置-多媒体文件播放控制方法及多媒体设备”暗示了这是一个关于多媒体设备在播放控制方面的技术文档,可能涵盖了硬件设备、软件应用以及相关操作流程。描述中的内容与标题相同,进一步确认了...

    android多媒体编程从初学到精通 第4章、多媒体框架.pdf

    无论是对于初学者还是专业开发者来说,《Android多媒体编程从初学到精通》这本书都是了解Android多媒体技术不可或缺的资源。通过学习这些框架及其背后的技术原理,可以更好地理解和掌握如何在Android平台上构建高...

    [Android多媒体编程从初学到精通].苗忠良等.扫描版.pdf

    本书名为《Android多媒体编程从初学到精通》,由苗忠良等编著,是一本详细分析Android平台下多媒体编程的知识与技术的教材。该书详细讲解了从基础到进阶的Android多媒体编程技术,内容覆盖了多媒体开发的多个方面,...

    android多媒体本地播放流程

    ### Android多媒体本地播放流程详解 #### 一、概述 在Android平台上实现多媒体本地播放是一项基本且重要的功能。随着智能手机硬件性能的不断提升,越来越多的设备能够支持高清甚至更高分辨率的视频播放。本文将...

    Android多媒体开发高级编程及源码

    在Android平台上进行多媒体开发是构建丰富用户体验的关键,涵盖了图像、音频、视频以及各种富媒体内容的处理和展示。本文将深入探讨Android多媒体开发的高级编程技术,并基于提供的资源——"Android多媒体开发高级...

    强力推荐-Android技术精髓-Pro.Android.3-英文版

    《Pro.Android.3》是Android开发领域的一本权威著作,主要涵盖了Android技术的精髓部分,适合对移动应用开发有兴趣或已经在从事相关工作的开发者阅读。这本书以其深入浅出的英文讲解,为读者揭示了Android平台的内在...

    安卓Android源码——多媒体播放器.rar

    在安卓平台上,多媒体播放器...通过深入研究这个压缩包中的源代码,开发者可以学习到如何利用Android SDK和ExoPlayer来创建一个功能齐全、高性能的多媒体播放器,同时也可以了解到多媒体播放背后的工作原理和技术细节。

    android-sdk-sources-android-19.rar

    开发者可以通过源码研究如何实现高效的媒体播放和处理。 5. **网络通信**:在Android 19中,网络功能得到了加强,包括对Wi-Fi Direct和低功耗蓝牙(Bluetooth Low Energy, BLE)的支持。源码揭示了如何进行设备间的...

    2021-2022收藏资料基于Android的多媒体播放器课程设计报告.doc

    ### 基于Android的多媒体播放器课程设计报告 #### 一、开发环境搭建 ##### 1.1 JDK安装 ...通过对这些知识点的学习,可以帮助初学者快速掌握基于Android平台开发多媒体应用的基本流程和技术要点。

Global site tag (gtag.js) - Google Analytics