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 文本框使用小结
May 22 Javascript
关于jQuery中的end()使用方法
Jul 10 Javascript
jQuery 复合选择器应用的几个例子
Sep 11 Javascript
JavaScript调试工具汇总
Dec 23 Javascript
javascript 数组操作详解
Jan 29 Javascript
JavaScript计时器示例分析
Feb 05 Javascript
node.js 使用ejs模板引擎时后缀换成.html
Apr 22 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
Bootstrap表单简单实现代码
Mar 06 Javascript
如何理解jQuery中的ajaxSubmit方法
Mar 13 Javascript
微信小程序点击顶部导航栏切换样式代码实例
Nov 12 Javascript
原生javascript单例模式的应用实例分析
Feb 23 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使用ereg验证文件上传的方法
2014/12/16 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
使用JQuery实现图片轮播效果的实例(推荐)
2017/10/24 jQuery
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
Python continue语句用法实例
2014/03/11 Python
Python实现随机选择元素功能
2017/09/14 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
Python日期时间Time模块实例详解
2019/04/15 Python
python访问hdfs的操作
2020/06/06 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
Python中Selenium模块的使用详解
2020/10/09 Python
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
公司市场部岗位职责
2013/12/02 职场文书
《唯一的听众》教学反思
2014/02/20 职场文书
经典商业广告词
2014/03/13 职场文书
元旦联欢会主持词
2014/03/26 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
计算机毕业生自荐信
2014/06/12 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
员工表扬信怎么写
2015/05/05 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers
MySQL的Query Cache图文详解
2021/07/01 MySQL