android之通过SurfaceView以及SurfaceHolder进行视频播放

使用AudioView进行视频播放的时候,是不是很不爽,千篇一律的模式,恶心吧。这里,我们可以通过一些方式对MediaPlayer进行包装。而所用到的正是SurfaceView以及SurfaceHolder。

最终效果图:

我们提供了四个按钮,可以进行播放控制。

--------------------------------------------------------------------------------

布局文件media.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"> <SurfaceView android:id="@+id/surfaceView1" android:layout_width="320px" android:layout_height="160px"></SurfaceView> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageButton android:id="@+id/button_play" android:src="@drawable/play" android:onClick="buttonClick" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton> <ImageButton android:id="@+id/button_pause" android:src="@drawable/pause" android:onClick="buttonClick" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton> <ImageButton android:id="@+id/button_stop" android:src="@drawable/stop" android:onClick="buttonClick" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton> <ImageButton android:id="@+id/button_reset" android:src="@drawable/reset" android:onClick="buttonClick" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton> </LinearLayout> </LinearLayout>

activity代码:

package cn.com.chenzheng_java.media; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; /** * @description 通过SurfaceView/SurfaceHolder实现自己的播放器 * @author chenzheng_java * @since 2011/03/23 * @description 这里进行一下补充说明,我们可以通过mediaplayer添加OnPreparedListener * 以及OnCompletionListener等事件对准备好播放以及播放完成后的操作进行控制。 * 使用SurfaceView以及SurfaceHolder进行视频播放时,结构是这样的: * 1、首先,我们从布局文件中获取一个surfaceView * 2、通过surfaceView.getHolder()方法获取与该容器想对应的surfaceHolder * 3、对srufaceHolder进行一些默认的设置,如addCallback()和setType() * 4、通过mediaPlayer.setDisplay()方法将视频播放与播放容器链接起来 */ public class MyMediaPlayerActivity extends Activity { MediaPlayer mediaPlayer ; // 播放器的内部实现是通过MediaPlayer SurfaceView surfaceView ;// 装在视频的容器 SurfaceHolder surfaceHolder;// 控制surfaceView的属性(尺寸、格式等)对象 boolean isPause ; // 是否已经暂停了 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.media); surfaceView = (SurfaceView) findViewById(R.id.surfaceView1); /** * 获取与当前surfaceView相关联的那个的surefaceHolder */ surfaceHolder = surfaceView.getHolder(); /** * 注册当surfaceView创建、改变和销毁时应该执行的方法 */ surfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.i("通知", "surfaceHolder被销毁了"); if(mediaPlayer!=null) mediaPlayer.release(); } @Override public void surfaceCreated(SurfaceHolder holder) { Log.i("通知", "surfaceHolder被create了"); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.i("通知", "surfaceHolder被改变了"); } }); /** * 这里必须设置为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS哦,意思 * 是创建一个push的'surface',主要的特点就是不进行缓冲 */ surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } /*** * @param targetButton 被用户点击的按钮 */ public void buttonClick(View targetButton){ int buttonId = targetButton.getId(); switch (buttonId) { case R.id.button_play: play(); break; case R.id.button_pause: pause(); break; case R.id.button_reset: reset(); break; case R.id.button_stop: stop(); break; default: break; } } /** * 播放 */ private void play(){ mediaPlayer = new MediaPlayer(); // 设置多媒体流类型 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // 设置用于展示mediaPlayer的容器 mediaPlayer.setDisplay(surfaceHolder); try { mediaPlayer.setDataSource("/data/jinsha.3gp"); mediaPlayer.prepare(); mediaPlayer.start(); isPause = false; } catch (Exception e) { Log.i("通知", "播放过程中出现了错误哦"); } } /** * 暂停 */ private void pause(){ Log.i("通知", "点击了暂停按钮"); if(isPause==false){ mediaPlayer.pause(); isPause=true; }else{ mediaPlayer.start(); isPause=false; } } /** * 重置 */ private void reset(){ Log.i("通知", "点击了reset按钮"); // 跳转到视频的最开始 mediaPlayer.seekTo(0); mediaPlayer.start(); } /** * 停止 */ private void stop(){ Log.i("通知", "点击了stop按钮"); mediaPlayer.stop(); mediaPlayer.release(); } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值