视频在 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;

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

引擎支持

支持白鹭引擎

相关文章
|
4月前
|
开发者
为什么你的游戏做不出来?
为什么你的游戏做不出来?
36 0
|
2月前
|
机器学习/深度学习
猜谜游戏
【2月更文挑战第4天】猜谜游戏。
24 0
|
5月前
|
资源调度
游戏分享总结
游戏分享总结
26 0
|
11月前
|
开发者
什么才是“好游戏“?
什么样的游戏才算是一个好游戏呢?其实这是一个很私人的问题,不应该被拿出来当众讨论,就像什么样的电影才是好电影?什么样的书才是好书?什么样的生活才是好生活?什么样的人生才是好人生?...... 这些问题都有着共同的特点,就是因人而异。每个人都有着自己的经历和想法,所以对应的每个问题也都有着自己的答案。
86 0
|
11月前
|
开发者
为什么你的游戏做不出来
这个收藏的行为多少让我无法理解,收藏一篇教程,或许会想着以后有时间再来学(看看自己的收藏夹就知道,根本就没有以后),收藏这样的一篇“为什么游戏做出不来”的文章是为了什么呢?难道是为了以后游戏做不出来了,回来看看,找个理由?想做游戏的人我也见过不少了,但是最终能够做出来的确实不多。这再一次证明了,想法和行动之间的那条难以逾越的鸿沟。我发现了这样一种现象,
76 0
|
11月前
|
开发工具 开发者
一些与做游戏有关的你想知道的事
我始终认为做游戏是一项技能,游戏创作者制作一个游戏,跟写作者写一篇文章,吉他手弹一首乐曲,糕点师做一个松软的面包,木匠做一套精美的家具都是一样的。对于掌握一项技能来讲,只有一件最重要的事,就是熟练。所以,想学好做游戏唯有不停的练习直至熟练,除此之外,其它的都是弯路。
81 0
|
11月前
在游戏中实现飘花和落叶效果
嗨!大家好,我是小蚂蚁。 今天这篇文章分享一下如何在游戏中实现飘花和落叶的效果,在游戏背景中加入它们,能够让你的游戏更加的栩栩如生。 之前我们讲过如何在游戏中实现一场雨,主要利用的随机性,一系列的随机处理模拟出了下雨的效果,对于飘花和落叶同样也需要各种各样的随机处理。
60 0
|
11月前
|
小程序
为什么要做游戏?
在开始之前,先想想这个问题:你最想做的事是什么?你又为什么最想做这件事? 大家好,我是小蚂蚁。我遇到过很多想要做游戏或者正在做游戏的人,对于“为什么要做游戏?”这个问题,有着各种各样的答案。
85 0
|
C++
201712-2 游戏
201712-2 游戏
71 0
201712-2 游戏

热门文章

最新文章