surfaceView 和 mediaPlayer 的使用

最近在做酒店视频的,之前的使用系统的videoView,显的有些简单,目前替换成surfaceView + MediaPlayer 

在做过程中遇到些问题,总结下

1 在项目中的视频播放的核心代码是:

 mMediaPlayer.reset();
            mMediaPlayer.setDataSource(mHotelVideo.jumpUrl);
            SurfaceHolder holder = mSurfaceView.getHolder();
            holder.addCallback(this);
            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            mMediaPlayer.prepare();
            mMediaPlayer.seekTo(mCurrentPosition);
            mMediaPlayer.start();
            mMaxProgress = mMediaPlayer.getDuration();
            mVideoSeekBar.setMax(mMaxProgress);
            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mIsCompletionBg = false;
                    mIsPlaying = true;
                    mHandler.post(mProgressBarRunnable);

                }
            });

SuraceHolder 的 addCallback(this) 方法 有三个回调

 @Override
    public void surfaceCreated(SurfaceHolder holder) {
        if (mMediaPlayer != null) {
            mMediaPlayer.setDisplay(holder);
            mMediaPlayer.seekTo(mCurrentPosition);
        }


    }

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

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        removePlayerInstance();
        mHandler.removeCallbacks(mProgressBarRunnable);
    }

在第一创建的时候触发 surfaceCreated  在我门入果将视频切到后台会触发 surfaceDestroy 切回前台的时候 会 重新触发 

surfaceCreated 和 surfaceDestroyed 所以 我们在surfaceCreated 中添加 mMediaPlayer.setDisPlay(holder) 不然会报错


3 目前 serviceView 和 MediaPlayer 组合 以及 VideoView 存在问题是 在我们设置seekto(position) 和 mediaPlayer.getCurrentPostion() 的值存在偏差

因为视频中有关键帧的概念!即使我们设置seekto 的方法 但是getCurrentPosition() 会存在偏差 。

4 在实际的开发中会存在 手机横竖屏切换的问题处理 mediaPlayer 有相应的接口

@Override
    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
        mVideoHeight = height;
        mVideoWidth = width;
        initVideoPlayerLayout();
    }

在方法 

initVideoPlayerLayout();

中处理会按照手机的横竖屏比例处理显示播放的界面

当横屏的时候

   int btWidth = 0;
        if (mVideoHeight != 0) {
            btWidth = (mScreenheight * mVideoWidth) / mVideoHeight;
        }

处理显示的宽度

当竖屏的时候

 int btHeight = 0;
        if (mVideoWidth != 0) {
            btHeight = (mScreenWidth * mVideoHeight) / mVideoWidth;
        }
  
处理比例。


猜你喜欢

转载自blog.csdn.net/ahubenkui/article/details/79300785