用原生mediaplayer的一些坑,加载缓冲过程黑屏,有声音没画面

SurfaceHolder.Callback mSHCallback = new SurfaceHolder.Callback() {
        public void surfaceChanged(SurfaceHolder holder, int format,
                                   int w, int h) {
            mSurfaceWidth = w;
            mSurfaceHeight = h;
            boolean isValidState = (mTargetState == STATE_PLAYING);
            boolean hasValidSize = (mVideoWidth == w && mVideoHeight == h);
            if (mMediaPlayer != null && isValidState && hasValidSize) {
                if (mSeekWhenPrepared != 0) {
                    seekTo(mSeekWhenPrepared);
                }
                start();
            }
        }

        public void surfaceCreated(SurfaceHolder holder) {
            mSurfaceHolder = holder;
            if (null != mMediaPlayer) {
                mMediaPlayer.setDisplay(holder);
                mMediaPlayer.seekTo(mSeekWhenPrepared);
            } else {
                openVideo();
            }
            enableOrientationDetect();
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            // after we return from this we can't use the surface any more
            mSeekWhenPrepared = getCurrentPosition();
            if (mMediaController != null) mMediaController.hide();
            if (null != mMediaPlayer) {
                mMediaPlayer.setDisplay(null);
                mMediaPlayer.pause();
            }
            disableOrientationDetect();
        }
    };
 

1,SurfaceHolder.Callback的对显示view的管理。切换后台或者打开其他二级页面的时候,系统会销毁显示画面的view。这时setDisplay(null)防止不必要的error回调,mediaplayer.pause防止正在缓冲过程中,surfaceDestroyed回调,没画面有声音。

2,首次加载视频资源的时候,因为prepareAsync是不可取消的,调release是没用的。防止在prepare过程中切到后台然后缓冲好的时候直接播放了,应该做好pause

3,infolistener中的回调缓冲start和end会短暂循环调用,如果在这里做加载中进度动画开始和暂停会频闪,首次加载的话可以在第一帧回调里再停止缓冲动画

以上是基于UniversalVideoView的基础完善,测试基本可以商用,吐槽下这个开源控件的坑太多了,似乎是刚写出来的。

附上改的两个类,基本无bug流程运行

猜你喜欢

转载自blog.csdn.net/m0_38058826/article/details/88350846