zoukankan      html  css  js  c++  java
  • Android MediaPlayer和SurfaceView播放视频

      昨天介绍了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 }
  • 相关阅读:
    Parameter Binding in ASP.NET Web API
    Which HTTP methods match up to which CRUD methods?
    ErrorHandling in asp.net web api
    HttpStatusCode
    Autofac Getting Started(默认的构造函数注入)
    Autofac Controlling Scope and Lifetime
    luvit 被忽视的lua 高性能框架(仿nodejs)
    undefined与null的区别
    VsCode中使用Emmet神器快速编写HTML代码
    字符串匹配---KMP算法
  • 原文地址:https://www.cnblogs.com/phj981805903/p/3302198.html
Copyright © 2011-2022 走看看