cocos2dx 3.4版本 VideoPlayer问题

播放mp4 时候 ,有时候正常,有时候黑屏!

代码是仿DEMO的

bool VideoPlayer::init()
{
    if (!LayerColor::initWithColor(Color4B::BLACK))
    {
        return false;
    }

    auto size = Director::getInstance()->getWinSize();
    this->setContentSize(size);
    
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    videoPlayer = cocos2d::experimental::ui::VideoPlayer::create();
    videoPlayer->setKeepAspectRatioEnabled(! videoPlayer->isKeepAspectRatioEnabled());
    //videoPlayer->setFullScreenEnabled(! videoPlayer->isFullScreenEnabled());
    videoPlayer->setPosition(size/2);
    videoPlayer->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
    videoPlayer->setContentSize(Size(640,640));
    this->addChild(videoPlayer);
    videoPlayer->addEventListener(CC_CALLBACK_2(VideoPlayer::videoEventCallback,this));

#endif
    
    return true;
}

void VideoPlayer::showVideo(const char *sName)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    if (videoPlayer)
    {
        videoPlayer->setFileName(sName);
        videoPlayer->play();
    }else
    {
        this->videoPlayOverCallBack();
    }
#endif

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
    this->videoPlayOverCallBack();
#endif

}

遇到问题的平台是安卓

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mVideoWidth == 0 || mVideoHeight == 0) {
setMeasuredDimension(mViewWidth, mViewHeight);
Log.i(TAG, “onMeasure1 :”+mViewWidth+ “:” +mViewHeight);
}
else {
setMeasuredDimension(mVisibleWidth, mVisibleHeight);
Log.i(TAG, "onMeasure2 : "+mVisibleWidth+ “:” +mVisibleHeight);
}

}

这个方法输出的是onMeasure1: 0:0
正常时候输出的尺寸是正常的,黑屏时候输出的尺寸是0:0
如果播放时候是黑屏,把游戏切到后台,再进入游戏就能从头播放!
如果播放时候正常,切到后台再切回来就变成黑屏

自顶起来 :2::2::2::2::2::2::2::2::2:

问题解决了,coco真心挺坑的!!!

在Cocos的Tests 例子里的视频播放经过多次测试都没有问题!
经过代码比对等测试 Cocos这边的代码是没有问题的
问题出在java这块

E:\cocos2d-x-3.6\cocos\platform\android\java\src\org\cocos2dx\lib 在这个路径下的Cocos2dxVideoView.java 文件
是Cocos 视频调用的地方, 在官方的例子里这个JAVA里做了一个简单地处理

    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) {
                if ( mVideoWidth * height  > width * mVideoHeight ) {
                    mVisibleWidth = width;
                    mVisibleHeight = width * mVideoHeight / mVideoWidth;
                } else if ( mVideoWidth * height  < width * mVideoHeight ) {
                    mVisibleWidth = height * mVideoWidth / mVideoHeight;
                    mVisibleHeight = height;
                }
                mVisibleLeft = left + (width - mVisibleWidth) / 2;
                mVisibleTop = top + (height - mVisibleHeight) / 2;
            } else {
                mVisibleLeft = left;
                mVisibleTop = top;
                mVisibleWidth = width;
                mVisibleHeight = height;
            }
        }
        else {
            mVisibleLeft = left;
            mVisibleTop = top;
            mVisibleWidth = mVideoWidth;
            mVisibleHeight = mVideoHeight;
        }
        
        getHolder().setFixedSize(mVisibleWidth, mVisibleHeight);
        
        FrameLayout.LayoutParams lParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
                FrameLayout.LayoutParams.WRAP_CONTENT);
        lParams.leftMargin = mVisibleLeft;
        lParams.topMargin = mVisibleTop;
        lParams.gravity = Gravity.TOP | Gravity.LEFT;
        setLayoutParams(lParams);
    }



```



tests例子里唯独比我的多了这么一句(黑色加粗)! 这句代码怎么读都是废话,因为下面的语句的else里同样给宽高赋值了
但是……  注意了,但是
如果不加这句,就会出现我标题提出来的问题
多加这一句判断,打印输出,会输出好几次的宽高(3--5次),前几次可能是0:0   后来的输出就是视频正常的宽高比了!
我想可能是播放视频的时候没有音频那个类似于缓存的玩意,设置宽高和把视频压到堆栈,应该是同步进行的!

具体我也不清楚了,反正问题是解决了,如果有版主遛弯到这里了,知道具体原因及流程,还希望不吝赐教!!!

写这段希望碰到和我一样问题的童鞋  能快速的解决问题!

:14:楼主真有雷锋精神,多谢