HTML5中如何使用帆布实时处理视频

  介绍

这篇文章给大家分享的是有关HTML5中如何使用帆布实时处理视频的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

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

& lt; ! DOCTYPE  html  PUBLIC “-//W3C//DTD  XHTML  1.0,过渡//EN"   “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"比;   & lt; html  xmlns=癶ttp://www.w3.org/1999/xhtml"比;   & lt; head>   & lt; style>   body  {   背景:,黑色;   颜色:# CCCCCC;   }   # c2  {   背景图片:url (foo.png);   平铺方式:不再重演;   }   p  {   浮:左;   border : 1 px  solid  # 444444;   填充:10 px;   保证金:10 px;   背景:# 3 b3b3b;   }   & lt;/style>   & lt; script 类型=皌ext/javascript;=1.8版本“,src=https://www.yisu.com/zixun/" main.js ">   

  <视频id="视频" src="视频。ogv”控制=" true "/>   

  

  <帆布id=" c1”宽度=" 160 "高度=" 96 "/>   <帆布id=" c2 "宽度=" 160 "高度=" 96 "/>   

     

以上代码关键部分如下:

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

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

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

JavaScript代码

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

初始化色度键

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

doLoad:,()函数,{   时间=this.video  . getelementbyid (“video");   时间=this.c1  . getelementbyid (“c1");   时间=this.ctx1  this.c1.getContext (“2 d");   时间=this.c2  . getelementbyid (“c2");   时间=this.ctx2  this.c2.getContext (“2 d");   let  self =,;   this.video.addEventListener (“play",,()函数,{   时间/时间=self.width  self.video.videoWidth  2;   时间/时间=self.height  self.video.videoHeight  2;   self.timerCallback ();   },,假);   },

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

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

定时器回调

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

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

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

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

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

处理视频帧数据

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

computeFrame:,()函数,{   this.ctx1.drawImage (this.video, 0, 0,,上,,this.height);   let  frame =, this.ctx1.getImageData(0, 0,上,,this.height);   let  l =, frame.data.length /, 4;      for  (let 小姐:=,0;,小姐:& lt;, l;,我+ +),{   let  r =, frame.data[小姐:*,4,+,0];   let  g =, frame.data[小姐:*,4,+,1];   let  b =, frame.data[小姐:*,4,+,2];   if  (g 祝辞,100,,,,r 祝辞,100,,,,b  & lt;, 43)   frame.data[小姐:*,4,+,3],=,0;   }   this.ctx2.putImageData(帧,0,0);   返回;   }

HTML5中如何使用帆布实时处理视频