思路

第一步: 要能调起设备摄像头
第二步:扫码
第三步:解析二维码

技术简介

WebRTC API

WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间 点对点(Peer-to-Peer) 的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC 包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下,创建 点对点(Peer-to-Peer) 的数据分享和电话会议成为可能。

重要接口

MediaStream接口:是一个媒体内容的流.。一个流包含几个轨道,比如视频和音频轨道。

MDN : WebRTC API

核心的API navigator.mediaDevices.getUserMedia

MediaDevices 接口提供访问连接媒体输入的设备,如照相机和麦克风,以及屏幕共享等。它可以使你取得任何硬件资源的媒体数据。

MediaDevices.getUserMedia() 会提示用户给予使用媒体输入的许可,媒体输入会产生一个MediaStream,里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道(来自硬件或者虚拟视频源,比如相机、视频采集设备和屏幕共享服务等等)、一个音频轨道(同样来自硬件或虚拟音频源,比如麦克风、A/D 转换器等等),也可能是其它轨道类型。

它返回一个 Promise 对象,成功后会resolve回调一个 MediaStream 对象。若用户拒绝了使用权限,或者需要的媒体源不可用,promise会reject回调一个 PermissionDeniedError 或者 NotFoundError

通常你可以使用 navigator.mediaDevices 来获取 MediaDevices ,例如:

navigator.mediaDevices.getUserMedia(constraints)
.then(function(stream) {/* 使用这个 stream stream */
})
.catch(function(err) {/* 处理 error */
});

语法

var promise = navigator.mediaDevices.getUserMedia(constraints);

以下同时请求不带任何参数的音频和视频:

MDN: MediaDevices

二维码解析库 JSQR

jsQR 是一个纯 JavaScript 二维码解析库,该库读取原始图像或者是摄像头,并将定位,提取和解析其中的任何 QR码。

如果要使用 jsQR 扫描网络摄像头流,则需要 ImageData 从视频流中提取,然后可以将其传递给 jsQR。

jsQR 导出一个方法,该方法接受 4 个参数,分别是解码的 图像数据,宽、高 以及 可选的对象 进一步配置扫描行为。

imageData:格式为 [r0, g0, b0, a0, r1, g1, b1, a1, …] 的 Uint8ClampedArray( 8位无符号整型固定数组) 的 rgba 像素值。

const code = jsQR(imageData, width, height, options);
if (code) {console.log('找到二维码!', code);
}

github:jsQR

requestAnimationFrame

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行.

window.requestAnimationFrame(callback);

MDN: requestAnimationFrame

代码实现

流程: 浏览器进行调取摄像头,调用失败执行失败的回调;调用成功,进行捕获视频流,然后扫码识别,没有扫描到二维码就继续扫描, 扫码成功之后弹出扫码内容, 并停止扫码。

初始化

 <div></div><video src="" style="display: none"></video><canvas></canvas>
  // 捕获视频流var promise = navigator.mediaDevices.getUserMedia({ video: true })promise.then((mediaStream) => {// 成功的返回值mediaStream,既是媒体内容的流。// 通过原生video标签,展示视频document.querySelector('video').srcObject = mediaStreamdocument.querySelector('video').play()// 调用tick之前, 这个时候已经可以看到页面上在展示我们录制到的内容tick()}).catch(function (err) {console.log(err, 'err')})
// tick方法,初始化canvas,调用jsQR识别二维码function tick() {let cvs = document.querySelector('canvas')var ctx = cvs.getContext('2d')cvs.width = '800'cvs.height = '600'// 通过canvas绘制每一帧图片, 使绘制的图片和video展示的图片相吻合ctx.drawImage(document.querySelector('video'), 0, 0, '800', '600')// 获取画布数据(存储像素点信息)const imageData = ctx.getImageData(0, 0, '800', '600')let code = false// jsQR 识别二维码code = jsQR(imageData.data, imageData.width, imageData.height)if (code) {// 找到二维码,并展示在页面上document.querySelector('div').innerHTML = code.data// 绘制矩形框drawBox(code.location)}// 这次没有找到二维码,调用run方法run()}
 function run() {if (!document.querySelector('div').innerHTML) {// 进行周期性扫码识别requestAnimationFrame(tick)}}

可以看下, 这是扫码成功的回调。location 对象里包含了二维码具体的位置, 我们可以通过canvas划线,把页面中的码位置圈出来

function drawBox(location) {drawLine(location.topLeftCorner, location.topRightCorner)drawLine(location.topRightCorner, location.bottomRightCorner)drawLine(location.bottomRightCorner, location.bottomLeftCorner)drawLine(location.bottomLeftCorner, location.topLeftCorner)}function drawLine(begin, end) {let cvs = document.querySelector('canvas')var ctx = cvs.getContext('2d')ctx.beginPath()ctx.moveTo(begin.x, begin.y)ctx.lineTo(end.x, end.y)ctx.lineWidth = '3'ctx.strokeStyle = 'red'ctx.stroke()}

最终实现效果就是这样

到这里基本上就完事了, 可以调起摄像头, 可以正确扫码并拿到对应的值。

参考文章: https://github.com/dragonir/h5-scan-qrcode
JSQR: https://www.npmjs.com/package/jsqr
https://blog.csdn.net/weixin_41856395/article/details/120597131

H5调用摄像头扫码详解相关推荐

  1. VUE项目移动端H5调用摄像头扫码

    <template><div><div @click="moveToCameraAVG()" v-cloak><div class=&qu ...

  2. vue项目中实现H5调取摄像头扫码扫一扫功能+生成可识别的条形码。单纯的h5网页不涉及真机

    vue项目中实现H5调取摄像头扫码扫一扫功能+生成可识别的条形码. 单纯的h5网页不涉及真机 demo链接 前端同学可以加我一起交流一起进步 案例描述:需求是生成条形码并且在vue项目中实现扫一扫功能 ...

  3. vue实现点击按钮调用摄像头扫码

    vue在APP端点击[扫码签到]按钮实现调取摄像头扫码: 1.按钮页面: <template><div><button @click="scanCode&quo ...

  4. Vue h5 调用微信扫码接口

    需求 调用微信扫码接口,然后获取扫码返回结果的url中的参数,携参跳转到其他页面 1. 安装微信js-sdk 通过yarn安装 yarn add weixin-js-sdk 通过npm安装 npm i ...

  5. WinForm调用摄像头扫码识别二维码

    前言 因公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能.根据网上网友提供的一些资料,自己整合应用到项目中,效果还不错(就是感觉像素不是太好).现在将调用摄像头+识别二 ...

  6. 【Vue 调用微信扫码 IOS报错 解决办法】

    遇到一个问题,H5调用摄像头扫码,安卓环境下基本所有机型都可以调起摄像头,但是IOS 只有少部分机型才能调用,参考了网上很多例子 比如以下两位老大哥的例子 Vue 移动端实现调用相机扫描二维码或条形码 ...

  7. 【javascript】浏览器调用摄像头扫二维码踩坑记录

    前言 最近做一个项目需要用浏览器调用摄像头扫二维码,然后就踩了几个坑记录下. 踩坑记录 我一开始发现了zxing这个库,他分为https://www.npmjs.com/package/@zxing/ ...

  8. AidLux“换脸”案例源码详解 (Python)

    "换脸"案例源码详解 (Python) faceswap_gui.py用于换脸,可与facemovie_gui.py身体互换源码(上一篇文章)对照观看 打开faceswap_gui ...

  9. Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解

    Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 目录 Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 一.OpenGL ES渲染管线 1.基本处 ...

  10. AidLux “人脸测试”案例源码详解

    "人脸检测"案例源码详解 testface.py用于进行人脸检测 构建APP框架和添加主要控件 人脸关键点识别的方法 打开人脸测试案例 1.在VScode中进入代码编辑状态. 2. ...

最新文章

  1. 对做C#自定义控件的一点心得
  2. DXUT框架剖析(12)
  3. 【项目管理】沟通管理
  4. java 中类的加载顺序
  5. 用POP动画引擎实现弹簧动画(POPSpringAnimation)
  6. MyBatis之输入与输出(resultType、resultMap)映射
  7. Tomcat绑定jre
  8. 关于bayes错误率计算公式P[error] = P[error | x]P(x)dx
  9. KBQA-Bert学习记录-CRF模型
  10. OpenCms后台工作间汉化设置10.5
  11. 河北画报杂志河北画报杂志社河北画报编辑部2022年第20期目录
  12. 企业微信PC版多开软件,测试win10有效
  13. 评职称计算机应用能力考核有分吗,苏州评工程师所要求的职称计算机应用能力考核问题有哪些?...
  14. Fitbit IPO给智能硬件从业者的启示
  15. java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(一:总览篇)~整起
  16. MATLAB/Simulink电力系统与仿真,第四章的2机5节点潮流计算模型建模经验
  17. 建站手册-浏览器信息:Netscape 浏览器
  18. 如何获取网络视频(或者说后台返回视频URL)第一帧图片以及获取本地视频的第一帧图片
  19. 全新红包封面平台可搭建分站独立后台的源码
  20. 三十而立的他开始创业,打造旗舰网店,达到月销30万的传奇

热门文章

  1. 如何搜c语言考题答案,C语言考题答案.doc
  2. Vissim与java(IntelliJ IDEA )联调环境配置
  3. [Devcpp]为Devc自定义编译器及Devcpp路径读取的Bug
  4. AS SSD Benchmark 免费固态跑分工具分享
  5. git小乌龟不显示图标状态解决方案
  6. 关于idea中运行maven项目报错显示找不到包或符号的问题——终极方案
  7. Python 常见函数汇总
  8. 火山安卓自定义组件封装源码讲解
  9. mysql8 连接不上数据库_MySQL升级8.0后连接不上数据库
  10. mysql 个版本区别_MySQL各个版本区别