使用MediaPlayer和SurfaceView播放视频

从上文中可以看出,使用VideoView播放视频简单、方便,但有些早期的开发者还是喜欢使用MediaPlayer来播放视频,但是MediaPlayer主要用于播放音频,没有提供图像输出界面,此时需要借助于SurfaceView来显示MediaPlayer播放的图像输出。下面用一个简单示例来演示:

Activity:

[java]  view plain copy
  1. package com.home.activity;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import android.app.Activity;  
  6. import android.media.AudioManager;  
  7. import android.media.MediaPlayer;  
  8. import android.os.Bundle;  
  9. import android.os.Environment;  
  10. import android.view.SurfaceHolder;  
  11. import android.view.SurfaceView;  
  12. import android.view.View;  
  13.   
  14. import com.home.surfaceviewplayvideo.R;  
  15.   
  16. public class SurfaceViewPlayVideoActivity extends Activity {  
  17.     private SurfaceView surfaceView;  
  18.     private MediaPlayer mplayer;  
  19.     // 记录当前视频的播放位置  
  20.     private int position;  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.         // 创建MediaPlayer对象  
  27.         mplayer = new MediaPlayer();  
  28.         // 获取SurfaceView组件实例  
  29.         surfaceView = (SurfaceView) findViewById(R.id.main_surfaceView);  
  30.         // 设置SurfaceView自己不管理缓冲区  
  31.         surfaceView.getHolder()  
  32.                 .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  33.         // 设置播放时打开屏幕  
  34.         surfaceView.getHolder().setKeepScreenOn(true);  
  35.         surfaceView.getHolder().addCallback(new SurfaceListener());  
  36.     }  
  37.   
  38.     public void click(View v) {  
  39.         try {  
  40.             switch (v.getId()) {  
  41.             case R.id.main_btn_play:  
  42.                 play();  
  43.                 break;  
  44.             case R.id.main_btn_pause:  
  45.                 if (mplayer.isPlaying()) {  
  46.                     mplayer.pause();  
  47.                 } else {  
  48.                     mplayer.start();  
  49.                 }  
  50.                 break;  
  51.             case R.id.main_btn_stop:  
  52.                 if (mplayer.isPlaying())  
  53.                     mplayer.stop();  
  54.                 break;  
  55.             }  
  56.         } catch (Exception e) {  
  57.             e.printStackTrace();  
  58.         }  
  59.     }  
  60.   
  61.     private void play() throws IOException {  
  62.         mplayer.reset();  
  63.         mplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  64.         // 设置需要播放的视频  
  65.         mplayer.setDataSource(Environment.getExternalStorageDirectory()  
  66.                 + "/devil_may_cry.mp4");  
  67.         // 把视频画面输出到surfaceView  
  68.         mplayer.setDisplay(surfaceView.getHolder());  
  69.         mplayer.prepare();  
  70.         mplayer.start();  
  71.     }  
  72.   
  73.     private class SurfaceListener implements SurfaceHolder.Callback {  
  74.   
  75.         @Override  
  76.         public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  77.                 int height) {  
  78.         }  
  79.   
  80.         @Override  
  81.         public void surfaceCreated(SurfaceHolder holder) {  
  82.             if (position > 0) {  
  83.                 try {  
  84.                     // 开始播放  
  85.                     play();  
  86.                     // 并直接从指定位置开始播放  
  87.                     mplayer.seekTo(position);  
  88.                     position = 0;  
  89.                 } catch (IOException e) {  
  90.                     e.printStackTrace();  
  91.                 }  
  92.             }  
  93.         }  
  94.   
  95.         @Override  
  96.         public void surfaceDestroyed(SurfaceHolder holder) {  
  97.         }  
  98.     }  
  99.   
  100.     // 当其他Activity被打开时  
  101.     @Override  
  102.     protected void onPause() {  
  103.         super.onPause();  
  104.         if (mplayer.isPlaying()) {  
  105.             // 保存当前的播放位置  
  106.             position = mplayer.getCurrentPosition();  
  107.             mplayer.stop();  
  108.         }  
  109.     }  
  110.   
  111.     @Override  
  112.     protected void onDestroy() {  
  113.         super.onDestroy();  
  114.         // 停止播放  
  115.         if (mplayer.isPlaying())  
  116.             mplayer.stop();  
  117.         // 释放资源  
  118.         mplayer.release();  
  119.   
  120.     }  
  121. }  


布局XML:

[html]  view plain copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:orientation="vertical" >  
  5.   
  6.     <LinearLayout  
  7.         android:layout_width="match_parent"  
  8.         android:layout_height="wrap_content"  
  9.         android:orientation="horizontal" >  
  10.   
  11.         <Button  
  12.             android:id="@+id/main_btn_play"  
  13.             android:layout_width="wrap_content"  
  14.             android:layout_height="wrap_content"  
  15.             android:onClick="click"  
  16.             android:text="播放" />  
  17.   
  18.         <Button  
  19.             android:id="@+id/main_btn_pause"  
  20.             android:layout_width="wrap_content"  
  21.             android:layout_height="wrap_content"  
  22.             android:onClick="click"  
  23.             android:text="暂停" />  
  24.   
  25.         <Button  
  26.             android:id="@+id/main_btn_stop"  
  27.             android:layout_width="wrap_content"  
  28.             android:layout_height="wrap_content"  
  29.             android:onClick="click"  
  30.             android:text="停止" />  
  31.     </LinearLayout>  
  32.   
  33.     <SurfaceView  
  34.         android:id="@+id/main_surfaceView"  
  35.         android:layout_width="match_parent"  
  36.         android:layout_height="match_parent" />  
  37.   
  38. </LinearLayout>  

从上面的开发过程不难看出,使用MediaPlayer播放视频要复杂一些,而且需要自己开发控制按钮来控制视频的播放。所以一般推荐使用VideoView来播放视频。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值