js 调用本地摄像头通过canvas进行截图

js 调用本地摄像头通过canvas进行截图

月光魔力鸭

2018-10-15 13:05 阅读 2030 喜欢 1 调用本地摄像头 canvas截图

如何通过js调用本地摄像头呢?获取后如何对视频进行截图呢?在这里跟大家做一个简易的Demo来实现以上几个功能。

涉及到的知识点

实现的功能点

html简单布局

以下先通过HTML我们来实现一个简单的布局,包括样式和按钮。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>H5 canvas 调用摄像头进行绘制</title>
	<style>
		html,body{
			width:100%;
			height:100%;
			padding: 0px;
			margin: 0px;
			overflow: hidden;
		}
		#canvas{
			width:500px;
			height:300px;
		}
		#video{
			width:500px;
			height:300px;
		}
		.btn{
			display:inline-block;
			text-align: center;
			background-color: #333;
			color:#eee;
			font-size:14px;
			padding:5px 15px;
			border-radius: 5px;
			cursor:pointer;
		}
	</style>
</head>
<body>
	<video id="video" autoplay="true" style="background-color:#ccc;display:none;"></video>
	<div style="width:500px;height:300px;margin:30px auto;">
		<canvas id="canvas" width="500px" height="300px">您的浏览器不支持H5 ,请更换或升级!</canvas>
		<span class="btn" filter="screenshot">截图</span>
		<span class="btn" filter="close">暂停</span>
		<span class="btn" filter="open">打开</span>
	</div>
	<div style="width:500px;height:300px;margin:40px auto;" id="show"></div>
</body>
</html>

样子差不多是这样的:

hahiahia 空白一片

我们将video进行了隐藏,然后加上了几个按钮,还有canvas以及最底部的图片展示区域(用来存放截图图片)。

js实现功能

这里先贴下核心代码:

navigator.getUserMedia({
	video : {width:500,height:300}
},function(stream){
	LV.video.srcObject = stream;
    LV.video.onloadedmetadata = function(e) {
    	LV.video.play();
    };
},function(err){
	alert(err);//弹窗报错
})

相关的知识点可以参考:undefined

然后根据页面逻辑实现事件以及其他功能,包括:截图、暂停。

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
	var events = {
		open : function(){
			LV.open();
		},
		close : function(){
			console.log(LV.timer);
			clearInterval(LV.timer);
		},
		screenshot : function(){
			//获得当前帧的图像并拿到数据
			var image = canvas.toDataURL('jpeg');
			document.getElementById('show').innerHTML = '<img src="'+image+'" style="width:500px;height:300px;" />'
		}
	};
	var LV = {
		video : document.getElementById('video'),
		canvas : document.getElementById('canvas'),
		timer : null,
		media : null,
		open :function(){
			if(!LV.timer){
				navigator.getUserMedia({
					video : {width:500,height:300}
				},function(stream){
					LV.video.srcObject = stream;
			        LV.video.onloadedmetadata = function(e) {
			        	LV.video.play();
			        };
				},function(err){
					alert(err);//弹窗报错
				})
			}
			if(LV.timer){
				clearInterval(LV.timer);
			}
			//将画面绘制到canvas中
			LV.timer = setInterval(function(){
				LV.ctx.drawImage(LV.video,0,0,500,300);
			},15);
		},
		init : function(){
			LV.ctx = LV.canvas.getContext('2d');
			//绑定事件
			document.querySelectorAll('[filter]').forEach(function(item){
				item.onclick = function(ev){
					var type = this.getAttribute('filter');
					events[type].call(this,ev);
				}
			});
			return LV;
		}
	};
	LV.init();

原谅我放荡不羁的命名 ...


具体已经实现的demo可以点击 undefined

转载请注明出处: https://chrunlee.cn/article/js-local-video-canvas-screenshot.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
需求如下:有一张大图,需要显示大图中的一小部分,目前能知道的时候小图的宽高和坐标,同时大图有一个旋转角度可以知道,目标就是把小图正确的显示出来。
本文概括了递归、闭包、原型、继承,理清这些基本的概念,有助于你接纳更多的东西,我们会在下一个章节对函数进行更深入的讨论。
在文件上传的时候,经常会对文件的mime进行限制,比如图片 image/jpg 等,让用户可以选择图片,而不是其他的文件。
突然来了一个调研任务,想要实现一个类似3D虚拟展厅类似的需求,主要就是放一些学生的作品,然后预览啥的,效果还是要全景的效果。 经过一番调查,最终锁定了以前从未接触过的krpano。
codewars上的一个题目,这里记录下解决方法。
nvm install 16.15.0 : The process cannot access the file because it is being used by another process
现象:在IOS中,jsp页面绑定的点击事件,点击后延迟很大,接近1000ms,反应很慢
在页面中不同的frame之间进行相互调用的话,我们可以通过frame获取对应的window然后进行调用,但是如果是浏览器不同的tab之间呢?