视频在 H5 游戏中的应用

简介: ## 前言 游戏中如果需要使用一些预先录制好的动画,动画格式可以选择 gif 文件和视频文件,视频文件和 gif 文件相比,size 更小(相同质量,gif 文件比 mp4 文件大5倍以上)。 如果视频能在 canvas 中或者 webgl 中播放,这样视频可以和其它游戏元素整合,实现以前需要很复杂的方式才能实现的功能,比如在一个旋转的 3D 立方体中播放视频。 当前主流的浏览器

前言

游戏中如果需要使用一些预先录制好的动画,动画格式可以选择 gif 文件和视频文件,视频文件和 gif 文件相比,size 更小(相同质量,gif 文件比 mp4 文件大5倍以上)。

如果视频能在 canvas 中或者 webgl 中播放,这样视频可以和其它游戏元素整合,实现以前需要很复杂的方式才能实现的功能,比如在一个旋转的 3D 立方体中播放视频。

当前主流的浏览器 chrome,使用 U4 2.0 内核的 app(包括 UC 浏览器,手淘,支付宝,钉钉等)都支持视频在 canvas 中播放。

javascript 实现视频在 canvas 中播放

视频在 canvas 中播放,可以更好地和其它游戏元素整合,主要步骤如下(完整源码参考附件 video_canvas.html):

1.创建后台视频

var video = document.createElement('video');
video.src = '.xxxx.mp4';

2.创建 canvas

var canvas = document.createElement('canvas');
var canvasContext = canvas.getContext('2d');

3.视频播放后定时把图像 render 到 canvas

var canvas = document.createElement('canvas');
var canvasContext = canvas.getContext('2d');

video.addEventListener('play', function() {
  setInterval(function() {
    canvasContext.drawImage(video, 0, 0, width, height);
  }, 30);
});

运行效果:

image.png

javascript 实现视频在 weggl 中播放

为使示例简单,使用了three.js - javascript 3D library 实现 webgl 功能,把视频渲染到一个立方体表面,运行效果:

image.png

完整例子参考附录例子(video_canvas.html),核心代码:

1.使用视频创建纹理

texture = new THREE.Texture(video);
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
texture.repeat.set( 1, 1 );

2.创建立方体,视频纹理和立方体关联

var cubeGeometry = new THREE.CubeGeometry(1, 1, 1);
var material = new THREE.MeshLambertMaterial({map: texture, shading: THREE.FlatShading});
cube = new THREE.Mesh(cubeGeometry, material);

3.渲染的时候要定时刷新纹理

texture.needsUpdate = true;

如果你自己测试的时候, video texture 纹理更新失败 ,错误信息是:

DOMException: Failed to execute 'texImage2D' on 'WebGLRenderingContext': The video element contains cross-origin data, and may not be loaded

给 video 添加属性 crossorigin

video.setAttribute('crossorigin', 'anonymous');

白鹭引擎实现视频在 canvas 中播放

参考 官方文档

运行效果:

image.png

当前版本(5.0.15)的 白鹭引擎,视频在 canvas 中播放功能,PC浏览器运行无压力,在移动浏览器上有 bug(只能全屏播放,无法和其它页面元素整合,完整的 bugfix diff 参考:egret-patch.diff):

1、执行 WebVideo.prototype.play() 的时候,mobile 模式,直接进全屏,修改方法:

不执行 this.checkFullScreen(this._fullscreen),只执行:

_this.videoPlay();
egret.startTick(_this.markDirty, _this);

如果是 iOS 浏览器,还需要

document.body.appendChild(video)

因为,iOS 浏览器,video 不在 document 里面,无法播放起来,另外 size 不能太小,否则也无法播放起来。

2、WebVideo.prototype.$render() 在移动浏览器,总是把 video.poster render 到 canvas,没有把video 图像 render 到 cavas,修改方法:

屏蔽原来的,执行下面这个:

var data = bitmapData ? bitmapData : posterData;
if (data) {
    node.image = data;
    node.imageWidth = data == posterData ? width : bitmapData.width;
    node.imageHeight = data == posterData ? height : bitmapData.height;
    if (data == bitmapData) {
        egret.WebGLUtils.deleteWebGLTexture(bitmapData.webGLTexture);
        bitmapData.webGLTexture = null;
    }
    node.drawImage(0, 0, data.width, data.height, 0, 0, width, height);
}

U4 2.0 内核支持力度

特性支持

U4 2.0 内核视频自动播放特性(不需要手势触发)和在 canvas 中播放特性默认关闭,可以通过下发配置打开。

引擎支持

支持白鹭引擎

iOS 平台浏览器支持力度

特性支持

iOS 平台的浏览器,视频可以在 canvas 中播放,但 iOS safari 浏览器,视频开始播放,默认进入全屏播放,影响游戏使用,但基于 safari 内核的浏览器(比如 iOS UC 浏览器),设置:

webView.allowsInlineMediaPlayback = YES

可以实现开始播放不需要进入全屏播放(页内播放)。

另外,设置:

webView.mediaPlaybackRequiresUserAction = NO;

可以实现视频自动播放(不需要手势触发);

引擎支持

支持白鹭引擎

相关文章
|
3月前
|
机器学习/深度学习
猜谜游戏
【10月更文挑战第16天】猜谜游戏。
68 6
|
8月前
如何在游戏中实现飘花和落叶效果?
如何在游戏中实现飘花和落叶效果?
89 1
|
资源调度
游戏分享总结
游戏分享总结
58 0
|
开发者
什么才是“好游戏“?
什么样的游戏才算是一个好游戏呢?其实这是一个很私人的问题,不应该被拿出来当众讨论,就像什么样的电影才是好电影?什么样的书才是好书?什么样的生活才是好生活?什么样的人生才是好人生?...... 这些问题都有着共同的特点,就是因人而异。每个人都有着自己的经历和想法,所以对应的每个问题也都有着自己的答案。
137 0
|
开发工具 开发者
一些与做游戏有关的你想知道的事
我始终认为做游戏是一项技能,游戏创作者制作一个游戏,跟写作者写一篇文章,吉他手弹一首乐曲,糕点师做一个松软的面包,木匠做一套精美的家具都是一样的。对于掌握一项技能来讲,只有一件最重要的事,就是熟练。所以,想学好做游戏唯有不停的练习直至熟练,除此之外,其它的都是弯路。
128 0
在游戏中实现飘花和落叶效果
嗨!大家好,我是小蚂蚁。 今天这篇文章分享一下如何在游戏中实现飘花和落叶的效果,在游戏背景中加入它们,能够让你的游戏更加的栩栩如生。 之前我们讲过如何在游戏中实现一场雨,主要利用的随机性,一系列的随机处理模拟出了下雨的效果,对于飘花和落叶同样也需要各种各样的随机处理。
105 0
|
小程序
为什么要做游戏?
在开始之前,先想想这个问题:你最想做的事是什么?你又为什么最想做这件事? 大家好,我是小蚂蚁。我遇到过很多想要做游戏或者正在做游戏的人,对于“为什么要做游戏?”这个问题,有着各种各样的答案。
135 0
|
开发者
聊聊游戏中的分享
嗨!大家好,我是小蚂蚁。今天我们来谈谈游戏中的分享。 游戏分享是游戏获得更多用户的一个很重要的方法,正所谓“一传十,十传百”,如果每个玩家都愿意分享你的游戏的话,那么你的游戏将会通过这种裂变的方式获得海量的玩家。 当然,这只是想想而已。没有哪个游戏能让所有的玩家都愿意自发的分享,大家对游戏中的分享越来越抗拒,尤其遇到粗暴的被打扰的强制分享时,基本上对于这个游戏的评价也就玩完了。
169 0
简单的HANGMAN游戏
分析一下简单的hangman游戏,hangman主要两个窗口就是菜单窗口和游戏窗口。这里要用面板以及布局方式将元件排列好,有个基本雏形,这是第一步。这里第一个页面用到girdbaglayout布局方式,这种布局方式感觉效率很高,排布的也很美观,需要注意的是要使用时添加一行“特殊”的代码,后面的添加方式跟边界布局有一点点小类似。
302 0
简单的HANGMAN游戏
|
C++
201712-2 游戏
201712-2 游戏
100 0
201712-2 游戏