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 相关文章推荐
javascript实现unicode和字符的互相转换
Jul 18 Javascript
基于JQuery的asp.net树实现代码
Nov 30 Javascript
jquery实现文字由下到上循环滚动的实例代码
Aug 09 Javascript
jquery下div 的resize事件示例代码
Mar 09 Javascript
JS实现霓虹灯文字效果的方法
Aug 06 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
Dec 15 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
Jan 31 Javascript
js,jq,css多方面实现简易下拉菜单功能
May 13 Javascript
JavaScript编写棋盘覆盖代码详解
Aug 28 Javascript
vue实现模态框的通用写法推荐
Feb 26 Javascript
JavaScript EventEmitter 背后的秘密 完整版
Mar 29 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
Oct 27 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
用PHP 4.2书写安全的脚本
2006/10/09 PHP
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
Laravel数据库读写分离配置的方法
2019/10/13 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
js树形控件脚本代码
2008/07/24 Javascript
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
JavaScript字符串常用类使用方法汇总
2015/04/14 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
AngularJS在IE8的不支持的解决方法
2016/05/13 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
[01:55]2014DOTA2国际邀请赛快报:国土生病 紧急去医院治疗
2014/07/10 DOTA
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
为python设置socket代理的方法
2015/01/14 Python
python 自定义对象的打印方法
2019/01/12 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
基于python操作ES实例详解
2019/11/16 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
Python中内建模块collections如何使用
2020/05/27 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
医学检验专业大学生求职信
2013/11/18 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
导游词之泰山玉皇顶
2019/12/23 职场文书
MySQL基于索引的压力测试的实现
2021/11/07 MySQL