最近项目需要加一个MP4格式的开场动画,由于首次用cocos加入视频,发现不少坑下面先来总结一下(主要问题是android的)
-
ios默认视频进度条的隐藏
-
android打开几率性的黑屏
-
android按home键在进入游戏的黑屏(或者视频一直都是哪一个状态,类似暂停)
-
android点击视屏暂停、播放
-
scene中使用VideoPlayer控件后,不管是setVisible还是removeFromParent()还是replaceScene,反正就是有关于移除,隐藏此控件都会有1s-1.5s的黑屏
由于项目就想加一个MP4的LOGO闪屏,我闪个屏让我黑1s-1.5s,表示真心丑的不行
讲一下美术给我这个视频的时候,我的内心是拒绝的,然后,重点是然后,他给我一个腾讯的游戏,让我反编译,我简直就是脑残,给他反编译,还给她确认,人家腾讯用的LOGO动画也是MP4的,他的VideoPlayer是自己写的控件,表示smail文件不会反编译
最后老老实实的研究这个VideoPlayer
下面说下研究总结
-
第一个解决方案
UIVideoPlayer-ios.mm
中
self.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
self.moviePlayer.view.userInteractionEnabled = true;
改
self.moviePlayer.controlStyle = MPMovieControlStyleNone;
self.moviePlayer.view.userInteractionEnabled = false; -
第二个问题
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) {
…后边不变 -
关于第三个问题
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函数中全部注释掉就成