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 全兼容可高亮二级缓冲折叠菜单
Jun 04 Javascript
JavaScript汉诺塔问题解决方法
Apr 21 Javascript
jquery实现静态搜索功能(可输入搜索文字)
Mar 28 jQuery
react-router4 嵌套路由的使用方法
Jul 24 Javascript
Vue.js 踩坑记之双向绑定
May 03 Javascript
vue裁切预览组件功能的实现步骤
May 04 Javascript
微信小程序冒泡事件及其阻止方法实例分析
Dec 06 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
Apr 26 Javascript
JS开发常用工具函数(小结)
Jul 04 Javascript
微信小程序与公众号卡券/会员打通的问题
Jul 25 Javascript
JS实现灯泡开关特效
Mar 30 Javascript
Vue组件模板及组件互相引用代码实例
Mar 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+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
PHP连接sftp并下载文件的方法教程
2018/08/26 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
js Date概念详细介绍
2013/11/22 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
JavaScript中的关联数组问题
2015/03/04 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
浅谈jquery上下滑动的注意事项
2016/10/13 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
JS中的BOM应用
2018/02/02 Javascript
详解Angular操作cookies方法
2018/06/01 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
python实现360的字符显示界面
2014/02/21 Python
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python2/3中urllib库的一些常见用法
2017/12/19 Python
python 编码规范整理
2018/05/05 Python
python 读写文件,按行修改文件的方法
2018/07/12 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
python绘制多个子图的实例
2019/07/07 Python
python中的&&及||的实现示例
2019/08/07 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
使用Python实现将多表分批次从数据库导出到Excel
2020/05/15 Python
Python如何定义有可选参数的元类
2020/07/31 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
骨干教师考核方案
2014/05/09 职场文书
公务员个人考察材料
2014/12/23 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书