昨天介绍了VideoView播放视频,今天再介绍一种播放视频的方法MediaPlayer和SurfaceView,MediaPlayer播放音频,SurfaceView来显示图像,具体步骤如下:
1、创建MediaPlayer对象,并让它加载指定的视频文件。
2、在界面布局中定义SurfaceView组件,或在程序中创建SurfaceView组件,并为SurfaceView的SurfaceHolder添加Callback监听器。
3、调用MediaPlayer对象的setDisplay(SurfaceHolder sh)将所播放的视频图像输出到指定的SurfaceView组件。
4、调用MediaPlayer对象的start()、stop()和pause()方法控制视频的播放。
下面直接上个实例:
1 public class SurfaceViewPlayVideo extends Activity 2 implements OnClickListener 3 { 4 SurfaceView surfaceView; 5 ImageButton play , pause , stop; 6 MediaPlayer mPlayer; 7 //记录当前视频的播放位置 8 int position; 9 @Override 10 public void onCreate(Bundle savedInstanceState) 11 { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.main); 14 // 获取界面中的3个按钮 15 play = (ImageButton) findViewById(R.id.play); 16 pause = (ImageButton) findViewById(R.id.pause); 17 stop = (ImageButton) findViewById(R.id.stop); 18 // 为3个按钮的单击事件绑定事件监听器 19 play.setOnClickListener(this); 20 pause.setOnClickListener(this); 21 stop.setOnClickListener(this); 22 // 创建MediaPlayer 23 mPlayer = new MediaPlayer(); 24 surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView); 25 // 设置SurfaceView自己不管理的缓冲区 26 surfaceView.getHolder().setType( 27 SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 28 // 设置播放时打开屏幕 29 surfaceView.getHolder().setKeepScreenOn(true); 30 surfaceView.getHolder().addCallback(new SurfaceListener()); 31 } 32 33 @Override 34 public void onClick(View source) 35 { 36 try 37 { 38 switch (source.getId()) 39 { 40 // 播放按钮被单击 41 case R.id.play: 42 play(); 43 break; 44 // 暂停按钮被单击 45 case R.id.pause: 46 if (mPlayer.isPlaying()) 47 { 48 mPlayer.pause(); 49 } 50 else 51 { 52 mPlayer.start(); 53 } 54 break; 55 // 停止按钮被单击 56 case R.id.stop: 57 if (mPlayer.isPlaying()) 58 mPlayer.stop(); 59 break; 60 } 61 } 62 catch (Exception e) 63 { 64 e.printStackTrace(); 65 } 66 } 67 private void play() throws IOException 68 { 69 mPlayer.reset(); 70 mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 71 // 设置需要播放的视频 72 mPlayer.setDataSource("/mnt/sdcard/movie.3gp"); 73 // 把视频画面输出到SurfaceView 74 mPlayer.setDisplay(surfaceView.getHolder()); 75 mPlayer.prepare(); 76 mPlayer.start(); 77 } 78 79 private class SurfaceListener implements SurfaceHolder.Callback 80 { 81 @Override 82 public void surfaceChanged(SurfaceHolder holder, int format, int width, 83 int height) 84 { 85 } 86 87 @Override 88 public void surfaceCreated(SurfaceHolder holder) 89 { 90 if (position > 0) 91 { 92 try 93 { 94 // 开始播放 95 play(); 96 // 并直接从指定位置开始播放 97 mPlayer.seekTo(position); 98 position = 0; 99 } 100 catch (Exception e) 101 { 102 e.printStackTrace(); 103 } 104 } 105 } 106 @Override 107 public void surfaceDestroyed(SurfaceHolder holder) 108 { 109 } 110 } 111 // 当其他Activity被打开,暂停播放 112 @Override 113 protected void onPause() 114 { 115 if (mPlayer.isPlaying()) 116 { 117 // 保存当前的播放位置 118 position = mPlayer.getCurrentPosition(); 119 mPlayer.stop(); 120 } 121 super.onPause(); 122 } 123 @Override 124 protected void onDestroy() 125 { 126 // 停止播放 127 if (mPlayer.isPlaying()) 128 mPlayer.stop(); 129 // 释放资源 130 mPlayer.release(); 131 super.onDestroy(); 132 } 133 }