Android学习二、MediaPlayer播放视频

MediaPlayer主要是用来播放音频的,因此它没有提供图像输出界面,此时就需要借助于SurfaceView来显示MediaPlayer播放时候的图像输出。

有几点要注意的:

1、MediaPlayer管理播放的,所以状态问题一定不能忽略的。

2、SurfaceHolder.setType(int)方法虽然被标记为deprecate的,但是最好还是对SurfaceView进行这样设置this.surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

3、最好保证mediaPlayer.start()之后,在进行mediaPlayer.setDisplay()的设置,不过一般问题不大。

4、有时候会遇到只有声音没有图像的情况,那是因为surfaceview的创建优先级并不高,因此在mediaPlayer开始之后,surfaceView还没有创建出来,因此会出现有声音没图像的问题

一般有两种实现方法: 

一是在通过holder增加callback,监听surfaceCreate事件,在监听到之后再开始mediaPlayer的相关操作,具体可以看videoView的实现方法

二是通过按钮来实现mediaPlayer,这样也可以保证再用户按到按钮之前,surfaceView已经被创建出来了。



下面是封装的操作播放视频的代码,因为需要,加了一些判断,不过基本的封装都有。

[java]  view plain copy
  1. public class OperateMedia implements OnBufferingUpdateListener,  
  2.         OnCompletionListener, OnErrorListener {  
  3.     private int position = 0;// 保存播放的的位置  
  4.     private SurfaceView surfaceView;// surfaceVie对象  
  5.     private Context context;// 上下文对象  
  6.     private MediaPlayer mediaPlayer;// mediaplayer对象  
  7.     private int currentPlay = 0;// 保存当前正在播放的视频 0表示还没有记录  
  8.     private boolean justBack = false;// 是否刚才另外一个界面跳回,fasle 表示不是  
  9.   
  10.     public OperateMedia(Context context, MediaPlayer mediaPlayer,  
  11.             SurfaceView surfaceView) {  
  12.         // TODO Auto-generated constructor stub  
  13.         this.context = context;  
  14.         this.mediaPlayer = mediaPlayer;  
  15.         this.surfaceView = surfaceView;  
  16.         // mediaPlayer的设置  
  17.         this.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  18.         this.mediaPlayer.setOnBufferingUpdateListener(this);  
  19.         this.mediaPlayer.setOnCompletionListener(this);  
  20.         // surfaceView的设置  
  21.         this.surfaceView.getHolder().setKeepScreenOn(true);  
  22.         this.surfaceView.getHolder().setType(  
  23.                 SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  24.         this.surfaceView.getHolder().addCallback(new SurfaceCallback()); // surfaceView的回调  
  25.   
  26.     }  
  27.   
  28.     // 设置播放不同的视频  
  29.     public void loadSrc(int num) {  
  30.         // 如果在次播放的是不同的视频,那么就将position初始化,并且reset,重新设置视频源  
  31.         if (num != currentPlay) {  
  32.             position = 0;  
  33.             try {  
  34.                 currentPlay = num;  
  35.                 mediaPlayer.reset();  
  36.                 AssetFileDescriptor fd = null;  
  37.                 switch (num) {  
  38.                 case 0:  
  39.                     fd = context.getAssets().openFd("a.mp4");  
  40.                     break;  
  41.                 case 1:  
  42.                     fd = context.getAssets().openFd("b.mp4");  
  43.                     break;  
  44.                 case 2:  
  45.                     fd = context.getAssets().openFd("c.mp4");  
  46.                     break;  
  47.                 case 3:  
  48.                     fd = context.getAssets().openFd("d.mp4");  
  49.                     break;  
  50.                 }  
  51.                 mediaPlayer.setDataSource(fd.getFileDescriptor(),  
  52.                         fd.getStartOffset(), fd.getLength());  
  53.                 play();  
  54.             } catch (IllegalArgumentException e) {  
  55.                 // TODO Auto-generated catch block  
  56.                 e.printStackTrace();  
  57.             } catch (IllegalStateException e) {  
  58.                 // TODO Auto-generated catch block  
  59.                 e.printStackTrace();  
  60.             } catch (IOException e) {  
  61.                 // TODO Auto-generated catch block  
  62.                 e.printStackTrace();  
  63.             }  
  64.             return;// 中断当前程序  
  65.         }  
  66.         // 如果点击的是同一个视频。那么就不用reset了  
  67.         if (num == currentPlay) {  
  68.             if (justBack) {  
  69.                 play();  
  70.                 return;  
  71.             } else {//如果不是从另一个activity切换回来,那么,就直接设置到0,开始播放  
  72.                 mediaPlayer.seekTo(0);  
  73.                 mediaPlayer.start();  
  74.                 mediaPlayer.setDisplay(surfaceView.getHolder());// 设置屏幕  
  75.             }  
  76.         }  
  77.   
  78.     }  
  79.   
  80.     // 播放视频  
  81.     public void play() {  
  82.         mediaPlayer.prepareAsync();  
  83.         mediaPlayer.setOnPreparedListener(new OnPreparedListener() {  
  84.             public void onPrepared(MediaPlayer mp) {  
  85.                 if (position > 0) {  
  86.                     mediaPlayer.seekTo(position);  
  87.                     if (justBack) {  
  88.                         justBack = false;  
  89.                         position = 0;  
  90.                     }  
  91.                 }  
  92.                 mediaPlayer.start();  
  93.             }  
  94.         });  
  95.         mediaPlayer.setDisplay(surfaceView.getHolder());// 设置屏幕  
  96.     }  
  97.   
  98.     // 视频播放完成的回调方法  
  99.     public void onCompletion(MediaPlayer mp) throws IllegalStateException {  
  100.         if (currentPlay == 0) {  
  101.             MediaVideo.justPlay = false;  
  102.         }  
  103.     }  
  104.   
  105.     //  
  106.     public void onBufferingUpdate(MediaPlayer mp, int percent)  
  107.             throws IllegalStateException {  
  108.     }  
  109.   
  110.     // SurfaceView的callBack  
  111.     private class SurfaceCallback implements SurfaceHolder.Callback {  
  112.         public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  113.                 int height) {  
  114.         }  
  115.   
  116.         public void surfaceCreated(SurfaceHolder holder) {  
  117.             if (position > 0) {  
  118.                 loadSrc(currentPlay);  
  119.             }  
  120.         }  
  121.   
  122.         public void surfaceDestroyed(SurfaceHolder holder) {  
  123.             // 界面销毁,即将跳转到另外一个界面  
  124.             if (mediaPlayer.isPlaying()) {  
  125.                 justBack = true;  
  126.                 position = mediaPlayer.getCurrentPosition();  
  127.                 mediaPlayer.stop();  
  128.             }  
  129.         }  
  130.   
  131.     }  
  132.   
  133.     public boolean onError(MediaPlayer mp, int what, int extra) {  
  134.   
  135.         return false;  
  136.     }  
  137.   
  138. }  


推荐一个写的不错的MediaPlayer的文章:点击打开链接


转载http://blog.csdn.net/lonelyroamer/article/details/7484297

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值