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 相关文章推荐
document.open() 与 document.write()的区别
Aug 13 Javascript
Discuz! 6.1_jQuery兼容问题
Sep 23 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
Oct 24 Javascript
js history对象简单实现返回和前进
Oct 30 Javascript
jquery获取tagName再进行判断
May 29 Javascript
js图片轮播效果实现代码
Apr 18 Javascript
js表单登陆验证示例
Oct 19 Javascript
vue双向绑定简要分析
Mar 23 Javascript
详解使用 Node.js 开发简单的脚手架工具
Jun 08 Javascript
微信小程序实现渐入渐出动画效果
Jun 13 Javascript
vue路由拦截器和请求拦截器知识点总结
Nov 08 Javascript
Nest.js散列与加密实例详解
Feb 24 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
将数组写入txt文件 var_export
2009/04/21 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
php简单截取字符串代码示例
2016/10/19 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
使用PHP开发留言板功能
2019/11/19 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
javascript与jquery动态创建html元素示例
2016/07/25 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
JavaScript函数表达式详解及实例
2017/05/05 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
js tab栏切换代码实例解析
2019/09/03 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
介绍Python中几个常用的类方法
2015/04/08 Python
Apache如何部署django项目
2017/05/21 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
python3实现磁盘空间监控
2018/06/21 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
中专毕业生自我鉴定
2014/02/02 职场文书
安全教育实施方案
2014/03/02 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
党的群众路线教育实践活动教师自我剖析材料
2014/10/09 职场文书
兵马俑的导游词
2015/02/02 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
我的收音机情缘
2022/04/05 无线电
JavaScript实现音乐播放器
2022/08/14 Javascript