html5调用摄像头截图功能


Posted in Javascript onJanuary 18, 2022

关于html5调用音视频等多媒体硬件的API已经很成熟,不过一直找不到机会把这些硬件转化为实际的应用场景,不过近年来随着iot和AI的浪潮,我觉得软硬结合的时机已经成熟。那我们就提前熟悉下怎么操作这些多媒体硬件吧,首先图像识别是其中最热门的应用场景,首先实现调用摄像头以及截图。

demo的效果请看:摄像头截图

API兼容性

核心的api就是navigator.MediaDevices,从caniuse可看出,PC端除了IE,已经没多大问题。移动端新版本浏览器也支持,同时很多项目都已经转向小程序,加上移动端一向紧跟最新标准,问题也不大。接着就是支持度就更好的video标签。最后还有canvas,支持度就更加乐观了。

硬件的获取

使用到的api:enumerateDevices,它返回的是一个promise,结果就是设备列表。设备的对象属性主要包括 deviceId,groupId,kind。其中deviceId,groupId 是设备的标记,可以通过这两个id调用所属的硬件。而kind 顾名思义就是硬件类型了。有了enumerateDevices就可以遍历硬件,同时可以实现选择对应的硬件并调用。

//遍历多媒体硬件
navigator.mediaDevices.enumerateDevices().then(function (devices) {
  console.log(devices);
  /*
  {
    deviceId: ""
    groupId: "8cac2d9a9e5d30a7bfc5a33b9971a3d40a850f7b0f6634b7f41f7dbe1de0a519"
    kind: "audioinput"
    label: ""
  } []
  */
});

调用摄像头

接着开始调用对应的硬件,这里会使用到另一个api,getUserMedia,同样它返回的也是一个promise,结果是一个视频流。有了视频流就好办了,把stream设置到video的srcObject,马上一个视频监控的应用就出来了。

getUserMedia的参数设置比较复杂,具体可参考MDN里面的文档 getUserMedia,我这里设置的是对应的摄像头及视频的尺寸。loadedmetadata事件在元数据(metadata)被加载完成后触发视频播放。

// 调用摄像头,并将流导入video
navigator.mediaDevices.getUserMedia({ 
  video: { groupId, width: 800, height: 600 }
}).then(function (stream) {
    video.srcObject = stream;
    mediaTrack = stream.getTracks()[0];
    video.onloadedmetadata = function (e) {
      video.play();
    };
})
.catch(console.log);

视频的截图

最后就是截取视频画面了,这就用到了canvas的drawImage,这个api不仅支持把canvas对象和image对象渲染进画布,同时还支持video对象,这就完美解决了我们的需求,核心代码如下:

//写入画布,并转换为base64
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
const imgURL = canvas.toDataURL('image/jpeg');

根据需求我们可以把图片数据转换为流或二进制,我这里转换为base64,拿到了数据就可以发挥想象了,tensorflow,机器学习,模式识别,大把的应用场景。

到此这篇关于html5调用摄像头截图的文章就介绍到这了,更多相关html5调用摄像头内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
Javascript 相关文章推荐
jquery $.ajax入门应用二
Nov 19 Javascript
javasript实现密码的隐藏与显示
May 08 Javascript
Javascript使用post方法提交数据实例
Aug 03 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
Sep 06 Javascript
jquery trigger实现联动的方法
Feb 29 Javascript
微信支付 JS API支付接口详解
Jul 11 Javascript
浅谈js中几种实用的跨域方法原理详解
Dec 02 Javascript
jQuery根据ID、CLASS、等获取对象的实例
Dec 04 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
Jan 29 Javascript
vue 地区选择器v-distpicker的常用功能
Jul 23 Javascript
p5.js临摹动态图形的方法
Oct 23 Javascript
JS轮播图的实现方法2
Aug 25 Javascript
在 HTML 页面中使用 React的场景分析
Jan 18 #Javascript
Element-ui Layout布局(Row和Col组件)的实现
Dec 06 #Vue.js
浅谈JavaScript作用域
Dec 06 #Javascript
JavaScript流程控制(循环)
Dec 06 #Javascript
JavaScript流程控制(分支)
Dec 06 #Javascript
JavaScript实现队列结构过程
Dec 06 #Javascript
JavaScript实现栈结构详细过程
Dec 06 #Javascript
You might like
PHP4 与 MySQL 交互使用
2006/10/09 PHP
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
php 短链接算法收集与分析
2011/12/30 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
php使用数组填充下拉列表框的方法
2015/03/31 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
document.getElementById介绍
2011/09/13 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
详解自动生成博客目录案例
2016/12/09 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
十分钟带你快速了解React16新特性
2017/11/10 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
深入浅析Python中的yield关键字
2018/01/24 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
毕业生求职信的经典写法
2014/01/31 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
出国导师推荐信
2015/03/25 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫
python神经网络 使用Keras构建RNN训练
2022/05/04 Python