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 相关文章推荐
禁止F5等快捷键的JS代码
Mar 06 Javascript
记录几个javascript有关的小细节
Apr 02 Javascript
js模仿html5 placeholder适应于不支持的浏览器
Jan 13 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
Jul 31 Javascript
JS实现alert中显示换行的方法
Dec 17 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
Jul 11 Javascript
Bootstrap显示与隐藏简单实现代码
Mar 06 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
May 20 Javascript
js学使用setTimeout实现轮循动画
Jul 17 Javascript
基于Vue实例生命周期(全面解析)
Aug 16 Javascript
javascript实现最长公共子序列实例代码
Feb 05 Javascript
封装 axios+promise通用请求函数操作
Aug 11 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 function用法如何递归及return和echo区别
2014/03/07 PHP
php中simplexml_load_file函数用法实例
2014/11/12 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
php微信开发之图片回复功能
2018/06/14 PHP
类似框架的js代码
2006/11/09 Javascript
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
js滚动条平滑移动示例代码
2016/03/29 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python实现电子产品商店
2019/02/26 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
德国咖啡批发商:Coffeefair
2019/08/26 全球购物
护理自荐信
2013/10/22 职场文书
九年级化学教学反思
2014/01/28 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
双创工作实施方案
2014/03/26 职场文书
抽奖活动主持词
2014/03/31 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
2014年人事科工作总结
2014/11/19 职场文书
护士先进个人总结
2015/02/13 职场文书
2015年化验室工作总结
2015/04/23 职场文书
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫