HTML5:使用Canvas实时处理Video

文档内容

本文使用的XHTML文档如下所示。

nbsp;html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">body {background: black;color:#CCCCCC;}#c2 {background-image: url(foo.png);background-repeat: no-repeat;}p {float: left;border :1px solid #444444;padding:10px;margin: 10px;background:#3B3B3B;}

登录后复制

以上代码关键部分如下:

1.创建了两个canvas元素,ID分别为c1和c2。c1用于显示当前帧的原始视频,c2是用来显示执行chroma-keying特效后的视频;c2预加载了一张静态图片,将用来取代视频中的背景色部分。

2.JavaScript代码从main.js文件导入;这段脚本使用JavaScript 1.8的特性,所以在导入脚本时,第22行中指定了版本。

立即学习“前端免费学习笔记(深入)”;

3.当网页加载时,main.js中的processor.doLoad()方法会运行。

JavaScript代码

main.js中的JS代码包含三个方法。

初始化chroma-key

doLoad()方法在XHTML文档初始加载时调用。这个方法的作用是为chroma-key处理代码准备所需的变量,设置一个事件侦听器,当用户开始播放视频时我们能检测到。

doLoad: function() {this.video = document.getElementById("video");this.c1 = document.getElementById("c1");this.ctx1 = this.c1.getContext("2d");this.c2 = document.getElementById("c2");this.ctx2 = this.c2.getContext("2d");let self = this;this.video.addEventListener("play", function() {self.width = self.video.videoWidth / 2;self.height = self.video.videoHeight / 2;self.timerCallback();}, false);},

登录后复制

这段代码获取XHTML文档中video元素和两个canvas元素的引用,还获取了两个canvas的图形上下文的引用。这些将在我们实现chroma-keying特效时使用。

addEventListener()监听video元素,当用户按下视频上的播放按钮时被调用。为了应对用户回放,这段代码获取视频的宽度和高度,并且减半(我们将在执行chroma-keying效果时将视频的大小减半),然后调用timerCallback()方法来启动视频捕捉和视觉效果计算。

定时器回调

定时器回调函数在视频开始播放时被调用(当“播放”事件发生时),然后负责自身周期调用,为每一帧视频实现keying特效。

timerCallback: function() {if (this.video.paused || this.video.ended) {return;}this.computeFrame();let self = this;setTimeout(function () {self.timerCallback();}, 0);},

登录后复制

回调函数首先检查视频是否正在播放;如果没有,回调函数不做任何事并立即返回。

然后调用computeFrame()方法,该方法对当前视频帧执行chroma-keying特效。

回调函数做的最后一件事就是调用setTimeout(),来让它自身尽快地被重新调用。在真实环境中,你可能会基于视频的帧率来设置调用频率。

处理视频帧数据

computeFrame()方法,如下所示,实际上负责抓取每一帧的数据和执行chroma-keying特效。

computeFrame: function() {this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);let frame = this.ctx1.getImageData(0, 0, this.width, this.height);let l = frame.data.length / 4;for (let i = 0; i  100 && r > 100 && b 

当它被调用后,video元素将显示最近的视频帧数据,如下所示:

HTML5:使用Canvas实时处理Video

在第2行,视频帧被复制到第一个canvas ctx1的图形上下文中,高度和宽度值指定为我们之前保存的帧大小的一半。注意,您可以通过传递video元素到绘图上下文的drawImage()方法来绘制当前视频帧。其结果是:

HTML5:使用Canvas实时处理Video

第3行代码通过调用第一个canvas上下文的getImageData()方法,来获取原始图像数据当前视频帧的一个副本。它提供了原始的32位像素图像数据,这样我们就能够进行操作。第4行代码通过将帧图像数据的总长度除以4,来计算图像的总像素数。

第6行代码循环扫描所有像素,获取每个像素的红、绿、蓝值,同时和预定义的背景色进行比较,这些背景色将用foo.png中导入的背景图像替换。

被检测成背景的每一个像素,将它的alpha值替换为零,表明该像素是完全透明的。结果,最终的图像背景部分是100%透明的,这样在第13行代码,把它被绘制到目标的上下文中时,效果是内容叠加到静态背景上。

由此产生的图像看起来像这样:

HTML5:使用Canvas实时处理Video

在视频播放时反复这样做,这样一帧接一帧处理,呈现出chroma-key的特效。

更多HTML5:使用Canvas实时处理Video相关文章请关注PHP中文网!

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3203390.html

(0)
上一篇 2025年4月1日 08:26:30
下一篇 2025年4月1日 08:26:37

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • HTML 视频的播放控件样式怎么修改

    无法直接通过css修改html视频的默认播放控件样式。1. 使用javascript创建自定义控件。2. 通过css美化这些控件。3. 考虑兼容性、用户体验和性能,使用库如video.js或plyr可简化过程。 要修改 HTML 视频的播放…

    2025年4月30日
    000
  • html、css容易被忽略的小知识点_html/css_WEB-ITnose

    都说前端容易,谁说的。前端上手快,越往后学习越困难。学习前端快一年了,依然发现一些小的知识点不会。这些经验性的东西不碰到永远学不会。 (1)title前面的logo。 就像这个编辑文章前面的logo。不知道大家知不知道这个图标是如何加载过来…

    编程技术 2025年4月4日
    100
  • html节点属性操作

    nbsp;html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> …

    编程技术 2025年4月4日
    200
  • 使用html5的FormData对象,通过 Ajax表单异步提交文件数据

    每次在向服务器提交文件对象数据是,总是需要借助各种三方插件来实现表单异步提交功能,还要为不同的界面去定制不同的插件css,相当繁琐。xmlhttprequest level 2 添加了一个新的接口——formdata。利用 formdata…

    编程技术 2025年4月4日
    100
  • html5的八大技术特征简介

    html5的八大技术特征简介:   HTML5 这个词获得了它自己的生命。无论是在开发者还是公众社区中,这个词的指代对象早已超过了简简单单一个标准的范畴,以至于来带了诸多的不解和争论。这套标准 需要一个标准。那就是,HTML5需要一组一致的…

    编程技术 2025年4月4日
    200
  • html教程:用tabIndex轻松实现网页导航

    最近,当我在一个网站上输入表格数据时,我填写了一栏,并点击[tab]键移到下一栏;当我抬头时,我惊奇的发现光标跳到页面下方的另一栏中。我用鼠标将光标移到正确的文本栏中,但不久[tab]键又再次出现问题。这一情形使我想了解一下页面设计,以及t…

    编程技术 2025年4月4日
    200
  • html教程:WEB标准从头开始_DOCTYPE声明

    在较早之前的网页上,我们经常可以看到如下的网页结构代码: 这是一个网页 …… 立即学习“前端免费学习笔记(深入)”; …… 立即学习“前端免费学习笔记(深入)”; 很显然的,这种结构的网页代码是不符合Web标准规范的,但是浏览器仍然可以很好…

    编程技术 2025年4月4日
    200
  • 一步步学习html—-第一课

    在讲授第一课的时候,首先要给大家表明的一个概念是:我们学习的是一门语言,而不是一个编译工具,所以我们要习惯在编写程序的时候忽略编译工具的概念,因为只有忽略了编译工具,才能真正意义上的明白一门语言的精髓在哪里,也才能真正掌握一门语言到底是怎么…

    编程技术 2025年4月4日
    200
  • 一步步学习html—-第三课

    经过前面两课的学习,不知道你们对于什么是html有没有了一定程度上的了解,今天的第三课算是第一阶段的一个总结,会加入一点新的内容,但是更多的是会做总结,好了,废话不说了,进入今天的课程吧!在前两课的基础上,这一课主要是加入了一个插入图片的问…

    编程技术 2025年4月4日
    200
  • 一步步学习html—-第四课

    这一课我们主要讲解一下链接的问题:这个也可以定义为超文本链接,标签则是这个标签的全称是anchor,中文意思是锚;例子:http://www.baidu.com”>click!在网页上就会出现一个链接,其文本表现形式就是正…

    编程技术 2025年4月4日
    200

发表回复

登录后才能评论