VideoPlayer坑与总结,希望触控人员可以看到

最近项目需要加一个MP4格式的开场动画,由于首次用cocos加入视频,发现不少坑下面先来总结一下(主要问题是android的)

  1. ios默认视频进度条的隐藏

  2. android打开几率性的黑屏

  3. android按home键在进入游戏的黑屏(或者视频一直都是哪一个状态,类似暂停)

  4. android点击视屏暂停、播放

  5. scene中使用VideoPlayer控件后,不管是setVisible还是removeFromParent()还是replaceScene,反正就是有关于移除,隐藏此控件都会有1s-1.5s的黑屏

由于项目就想加一个MP4的LOGO闪屏,我闪个屏让我黑1s-1.5s,表示真心丑的不行

讲一下美术给我这个视频的时候,我的内心是拒绝的,然后,重点是然后,他给我一个腾讯的游戏,让我反编译,我简直就是脑残,给他反编译,还给她确认,人家腾讯用的LOGO动画也是MP4的,他的VideoPlayer是自己写的控件,表示smail文件不会反编译:joy:
最后老老实实的研究这个VideoPlayer
下面说下研究总结

  1. 第一个解决方案
    UIVideoPlayer-ios.mm

    self.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
    self.moviePlayer.view.userInteractionEnabled = true;

    self.moviePlayer.controlStyle = MPMovieControlStyleNone;
    self.moviePlayer.view.userInteractionEnabled = false;

  2. 第二个问题
    Cocos2dxVideoView.java
    中onMeasure函数变成
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (mVideoWidth == 0 || mVideoHeight == 0) {
    mViewWidth = mVisibleWidth;
    mViewHeight = mVisibleHeight;
    setMeasuredDimension(mViewWidth, mViewHeight);
    }
    else {
    setMeasuredDimension(mVisibleWidth, mVisibleHeight);
    }
    }
    加入你的项目是3.3及3.3以下,以上不知道,反正最新
    3.15不用改
    fixSize函数
    改成
    public void fixSize(int left, int top, int width, int height) {
    if (mVideoWidth == 0 || mVideoHeight == 0) {
    mVisibleLeft = left;
    mVisibleTop = top;
    mVisibleWidth = width;
    mVisibleHeight = height;
    }
    else if (width != 0 && height != 0) {
    if (mKeepRatio) {
    …后边不变

  3. 关于第三个问题
    Cocos2dxVideoView.java中
    SurfaceHolder.Callback mSHCallback这个回调中的hasValidSize这个值,简直就是坑、坑、坑
    boolean hasValidSize = (mVideoWidth == w && mVideoHeight == h);
    mVideoWidth、mVideoHeight分别是你视频的分辨率
    w、h是你的试图显示宽高
    我就想问:“这两个比较有什么意思吗?”(可能我理解的不怎么对,求解释)

说一下解决方案
加一个变量
private boolean isComplete = false;
mSHCallback中改成
SurfaceHolder.Callback mSHCallback = new SurfaceHolder.Callback()
{

    public void surfaceChanged(SurfaceHolder holder, int format,
                                int w, int h)
    {
        boolean isValidState =  (mTargetState == STATE_PLAYING)|| !isComplete;

        if (mMediaPlayer != null && isValidState) {
            if (mSeekWhenPrepared != 0) {
                seekTo(mSeekWhenPrepared);
            }
            start();
        }
    }

surfaceDestroyed函数改成
public void surfaceDestroyed(SurfaceHolder holder)
{
// after we return from this we can‘t use the surface any more
mSurfaceHolder = null;
if(mCurrentState == STATE_PLAYING) {
isComplete = mMediaPlayer.getCurrentPosition() == mMediaPlayer.getDuration();
mSeekWhenPrepared = mMediaPlayer.getCurrentPosition();
}
release(true);
}

4.第四个问题
onTouchEvent函数中全部注释掉就成

5.第五个问题

不知道怎么解决

不知道怎么解决

不知道怎么解决

不知道怎么解决