最近在做酒店视频的,之前的使用系统的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;
}
处理比例。