首页 > 代码库 > 从零開始学android<mediaplayer自带播放器(视频播放).四十九.>

从零開始学android<mediaplayer自带播放器(视频播放).四十九.>

MediaPlayer除了能够对音频播放之外,也能够对视频进行播放,可是假设要播放视频仅仅依靠MediaPlayer还是不够的。还须要编写一个能够用于视频显示的空间,而这块显示空间要求能够高速的进行GUI的更新,并且能够在渲染代码时进行无堵塞的的对GUI进行渲染,而假设要完毕此种功能,则必须依靠android.view.SurfaceView组件完毕。SurfaceView组件封装了一个Surface对象,而不是一个Canvas对象,使用Surface能够完毕对后台线程的控制,对于像视频、3D图形等须要高速更新或者高帧率的地方上有非常大的用处。

SurfaceHolder显示一个surface的抽象接口,使你能够控制surface的大小和格式。 以及在surface上编辑像素,和监视surace的改变。这个接口通常通过SurfaceView类实现。


以下就结合前一节写过的样例来实现mediaplayer对视频的播放。

首先在xml配置surfaceview对象。


<span style="font-size:18px;"><RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageButton
        android:id="@+id/imageButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="http://www.mamicode.com/@drawable/play" />

<SurfaceView
    android:id="@+id/surfaceview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:layout_below="@+id/imageButton1" />

<ImageButton
    android:id="@+id/imageButton2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/surfaceview"
    android:layout_alignRight="@+id/surfaceview"
    android:src="http://www.mamicode.com/@drawable/stop" />

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/surfaceview"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="162dp"
    />

</RelativeLayout>
</span>

技术分享
Java文件
<span style="font-size:18px;">package com.example.mediaplayer2;

import java.io.File;

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

public class MainActivity extends Activity {
	private ImageButton play = null;// 播放
	private ImageButton stop = null;// 停止播放
	private MediaPlayer media = null;
	private ImageView image=null ;
	private SurfaceView surfaceView = null;
	private SurfaceHolder surfaceHolder = null;
	private Boolean pauseFlag=false;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_main);
		this.play = (ImageButton) super.findViewById(R.id.imageButton1);
		this.stop = (ImageButton) super.findViewById(R.id.imageButton2);
		this.surfaceView = (SurfaceView) super.findViewById(R.id.surfaceview);// 实例化SurfaceView
		this.surfaceHolder = this.surfaceView.getHolder();// 实例化SurfaceHolder
		this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 设置格式
		this.image=(ImageView)this.findViewById(R.id.imageView1);
		this.media = new MediaPlayer();// 实例化MeidaPlayer组件
		try {
			// 取得SD卡上的视频文件
			String path = Environment.getExternalStorageDirectory()
					+ File.separator + "Movies" + File.separator + "abc.mp4";
			// 设置资源
			this.media.setDataSource(path); // 少了一些推断
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 分别对開始播放盒停止播放进行监听
		this.play.setOnClickListener(new PlayOnClickListenerImpl());
		this.stop.setOnClickListener(new StopOnClickListenerImpl());
		this.surfaceView.setOnClickListener(new pauseOrstart() );
		this.surfaceView.setOnHoverListener(new OnHoverListener() {
			
			public boolean onHover(View v, MotionEvent event) {
				// TODO Auto-generated method stub
				if (MainActivity.this.media.isPlaying()) {
					MainActivity.this.image.setImageResource(R.drawable.stop);
					
				}
				else {
					MainActivity.this.image.setImageResource(R.drawable.play);
				}
				return true;
			}
		});
	}

	private class PlayOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			// 设置音频格式啊
			MainActivity.this.media
					.setAudioStreamType(AudioManager.STREAM_MUSIC);
			// 设置播放的范围
			MainActivity.this.media.setDisplay(MainActivity.this.surfaceHolder);
			try {
				// 准备播放
				MainActivity.this.media.prepare();
			} catch (Exception e) {
			}
			// 開始播放
			MainActivity.this.media.start();
		}

	}

	private class StopOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			// 停止播放
			if (MainActivity.this.media!=null) {
				
			
			MainActivity.this.media.stop();
		}
		}
	}
	private class pauseOrstart implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			if (MainActivity.this.media!=null) {
				
			
			if (MainActivity.this.pauseFlag) {
				MainActivity.this.media.start();
				MainActivity.this.pauseFlag=false;
			}
			else {
				MainActivity.this.media.pause();
				MainActivity.this.pauseFlag=true;
			}
			}
		}}
}
</span>


技术分享

这样就实现了简单的视频播放功能,可是因为解码器的缘故如今仅支持3gp和部分MP4视频的播放,想要播放很多其它的视频格式须要另外写算法或下载解码器实现


下节预报:AudioManagerandroid声音编辑器

从零開始学android&lt;mediaplayer自带播放器(视频播放).四十九.&gt;