• 使用MediaPlayer和SurfaceView播放视频


    使用VideoView播放视频简单、方便,丹有些早期的开发者更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此它没有提供图像输出界面,此时

    需要借助于SurfaceView来显示MediaPlayer播放的图像输出。

    使用MediaPlayer播放视频的步骤如下:

    1、创建MediaPlayer对象,并让它加载指定的视频文件。

    2、在界面布局文件中定义SurfaceView组件,或在程序中创建SurfaceView组件,并为SurfaceView的SurfaceHolder天剑Callback监听器。

    3、调用MediaPlayer对象的setDisplay(SurfaceHolder  sh)将所播放的视频图像输出到指定的SurfaceView组件,

    4、调用MediaPlayer对象的start()、stop()和pause()方法控制视频的播放。

    import java.io.IOException;

    import android.media.AudioManager;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ImageButton;

    public class SurfaceviewPlayVideo extends Activity implements OnClickListener{
      SurfaceView surfaceView;
      ImageButton play;
      ImageButton pause;
      ImageButton stop;
      MediaPlayer mPlayer;
      //记录当前视频的播放位置
      int position;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_surfaceview_play_video);
        //获取界面中的三个按钮
        play = (ImageButton) findViewById(R.id.play);
        pause = (ImageButton) findViewById(R.id.pause);
        stop = (ImageButton) findViewById(R.id.stop);
        //为三个按钮的单击事件绑定事件监听器
        play.setOnClickListener(this);
        pause.setOnClickListener(this);
        stop.setOnClickListener(this);
        //创建MediaPlayer对象
        mPlayer = new MediaPlayer();
        surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
        //设置SurfaceView自己不管理的缓冲区
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        //设置播放时打开屏幕
        surfaceView.getHolder().setKeepScreenOn(true);
        surfaceView.getHolder().addCallback(new SurfaceListener());
      }

      @Override
      public void onClick(View source) {
        try {
          switch (source.getId()) {
            //播放按钮被单击
            case R.id.play:
              play();
              break;
            //暂停按钮被单击
            case R.id.pause:
              if(mPlayer.isPlaying()){
                mPlayer.pause();
              }else{
                mPlayer.start();
              }
              break;
            //停止按钮被单击
            case R.id.stop:
              if(mPlayer.isPlaying()){
                mPlayer.stop();
              }
              break;

          }
        } catch (Exception e) {
          e.printStackTrace();
        }

      }

      private void play() throws IllegalArgumentException, SecurityException, IllegalStateException, IOException{
        mPlayer.reset();
        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        //设置需要播放的视频
        mPlayer.setDataSource("/mnt/sdcard/movie.3gp");
        //把视频画面输出到SurfaceView
        mPlayer.setDisplay(surfaceView.getHolder());
        mPlayer.prepare();
        mPlayer.start();
      }

      private class SurfaceListener implements SurfaceHolder.Callback{

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
          if(position > 0){
            try {
              //开始播放
              play();
              //并直接从指定位置开始播放
              mPlayer.seekTo(position);
              position = 0;
            } catch (Exception e) {
              e.printStackTrace();
            }
          }

        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                      int height) {
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        }

      }
      //当其他Activity被打开时,暂停播放
      @Override
      protected void onPause() {
        if(mPlayer.isPlaying()){
          //保存当前的播放位置
          position = mPlayer.getCurrentPosition();
          mPlayer.stop();
        }
        super.onPause();
      }

      @Override
      protected void onDestroy() {
        // 停止播放
        if(mPlayer.isPlaying()){
          mPlayer.stop();
        }
        //释放资源
        mPlayer.release();
        super.onDestroy();
      }
    }

    从上面的代码不难看出,使用MediaPlayer播放视频与播放音频的步骤大同小于,关键要设置使用SurfaceView来显示MediaPlayer播放时的图像输出。当然,由于程序需要使用SurfaceView来显示MediaPlayer的图像暑促,因此程序需要一些代码来维护SurfaceView、SurfaceHolder对象。

    使用MediaPlayer播放视频要复杂一些,而且需要自己开发控制按钮来控制视频播放,因此一般推荐使用VideoView来播放视频。

  • 相关阅读:
    DockerFile体系结构
    Nignx(二) server_name 规则
    解决Redis分布式锁——死锁问题
    redis缓存穿透,缓存击穿,缓存雪崩原因+解决方案
    Docker_Linux
    正则例子
    部属流程
    Mysql insert语句的优化
    MySQL innodb_fast_shutdown参数讲解
    MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)
  • 原文地址:https://www.cnblogs.com/jiww/p/5619180.html
Copyright © 2020-2023  润新知