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 相关文章推荐
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
Apr 29 Javascript
Save a File Using a File Save Dialog Box
Jun 18 Javascript
jQuery实现的导航条切换可显示隐藏
Oct 22 Javascript
Shell脚本实现Linux系统和进程资源监控
Mar 05 Javascript
jquery分页插件jquery.pagination.js使用方法解析
Apr 01 Javascript
AngularJS动态加载模块和依赖的方法分析
Nov 08 Javascript
JS中闭包的经典用法小结(2则示例)
Dec 28 Javascript
vue子组件使用自定义事件向父组件传递数据
May 27 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
Sep 26 Javascript
详解Angular如何正确的操作DOM
Jul 06 Javascript
用vue 实现手机触屏滑动功能
May 28 Javascript
vue 二维码长按保存和复制内容操作
Sep 22 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中显示格式化的用户输入
2006/10/09 PHP
Ajax PHP分页演示
2007/01/02 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
JS array 数组详解
2009/03/22 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
js select option对象小结
2013/12/20 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
2016/12/02 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
2017/03/07 Javascript
footer定位页面底部(代码分享)
2017/03/07 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
pytyon 带有重复的全排列
2013/08/13 Python
Python绘制七段数码管实例代码
2017/12/20 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
keras slice layer 层实现方式
2020/06/11 Python
Python 读取位于包中的数据文件
2020/08/07 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
新学期开学寄语
2014/01/18 职场文书
租房协议书范例
2014/10/14 职场文书
工人先锋号申报材料
2014/12/29 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
小学生读书笔记范文
2015/06/30 职场文书
MySQL创建管理HASH分区
2022/04/13 MySQL