H5 canvas如何载入视频
2023-04-18 14:42:34 时间
Canvas可以载入图片,那么Canvas 也可以载入视频。
Canvas加载视频和图片是一样的,使用drawImage,区别就是给一个定
时器不停的抓取每帧的画面,放入Canvas画布里面。
示例1 :
附上demo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=640,user-scalable=0,target-densitydpi=device-dpi">
<meta charset="utf-8">
<style>
* {
margin: 0;
padding: 0;
}
#Mycanvas {
position: absolute;
top: 0;
left: 0;
}
#mvideo {
position: absolute;
top: 10%;
left: 10%;
width: 480px;
height: 360px;
margin: -180px 0 0 -240px;
}
</style>
</head>
<body>
<canvas id="Mycanvas">
</canvas>
<video loop controls autoplay id="mvideo" >
<source src="sintel.mp4" type="video/mp4"></source>
</video>
</body>
<script>
!(function(doc) {
var Mycanvas = doc.getElementById("Mycanvas"),
cont = Mycanvas.getContext("2d"),
Myvideo = doc.getElementById("mvideo");
cw = window.innerWidth;
ch = window.innerHeight;
Mycanvas.width = cw;
Mycanvas.height = ch;
Myvideo.addEventListener("canplay", function() {
var cont2 = cerateCanvas(cw, ch).getContext("2d");
draw(this, cont, cont2, cw, ch);
}, false)
function cerateCanvas(w, h) {
var cr = doc.createElement("canvas");
cr.width = w;
cr.height = h;
return cr;
}
function draw(v, c, c2, w, h) {
if(v.paused || v.ended) {
cancelAnimationFrame(stop);
return false;
}
c2.drawImage(v, 0, 0, w, h);
var idata = c2.getImageData(0, 0, w, h),
data = idata.data;
for(var i = 0; i < data.length; i += 4) {
var r = data[i],
g = data[i + 1],
b = data[i + 2];
brightness = (3 * r + 4 * g + b) >>> 3;
data[i] = brightness;
data[i + 1] = brightness;
data[i + 2] = brightness;
};
idata.data = data;
c.putImageData(idata, 0, 0);
var stop = requestAnimationFrame(function() {
draw(v, c, c2, w, h);
});
}
})(document)
</script>
</html>
示例2 :setInterval
附上代码:
<!DOCTYPE html>
<html>
<body>
<p>要使用的视频:</p>
<video id="video1" controls width="270" autoplay src="sintel.mp4"></video>
<p>画布(每 20 毫秒,代码就会绘制视频的当前帧):</p>
<canvas id="myCanvas" width="270" height="135"></canvas>
</body>
<script>
var v = document.getElementById("video1");
var c = document.getElementById("myCanvas");
ctx = c.getContext('2d');
v.addEventListener('play', function() {
var i = window.setInterval(function() {
ctx.drawImage(v, 0, 0, 270, 135)
}, 20);
}, false);
</script>
</html>
示例3 :requestAnimationFrame
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=640,user-scalable=0,target-densitydpi=device-dpi" />
<style>
* {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div id="container">
</div>
</body>
<script>
!(function(doc) {
var cont = doc.getElementById("container");
var cw = window.innerWidth;
var ch = window.innerHeight;
var canvas = document.createElement('canvas');
canvas.width = cw;
canvas.height = ch;
canvas.style.zIndex = 8;
canvas.style.position = "absolute";
cont.appendChild(canvas);
var cont2D = canvas.getContext("2d");
var video = document.createElement('video');
video.preload = "auto";
video.volume = 0.3;
video.setAttribute('x-webkit-airplay', true);
video.setAttribute('webkit-playsinline', true);
video.setAttribute('webkit-playsinline', 'webkit-playsinline');
video.src = 'video/nigg2.mp4';
video.autoplay = "autoplay"; //是自动播放
video.addEventListener("play", function() {
draw(this, canvas, cont2D, cw, ch);
}, false)
function cerateCanvas(w, h) {
var cr = doc.createElement("canvas");
cr.width = w;
cr.height = h;
return cr;
}
function draw(v, c, c2, w, h) {
if(v.paused || v.ended) {
cancelAnimationFrame(stop);
return false;
}
c2.drawImage(v, 0, 0, w, h);
var stop = requestAnimationFrame(function() {
draw(v, c, c2, w, h);
});
}
})(document)
</script>
</html>
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击