H5调用摄像头扫码详解

这篇具有很好参考价值的文章主要介绍了H5调用摄像头扫码详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

思路

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

技术简介

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 = mediaStream
          document.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划线,把页面中的码位置圈出来
H5调用摄像头扫码详解

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文章来源地址https://www.toymoban.com/news/detail-457935.html

到了这里,关于H5调用摄像头扫码详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • h5端调用手机摄像头实现扫一扫功能

     一、前言         最近有遇到一个需求,在h5浏览器中实现扫码功能,其本质便是打开手机摄像头定时拍照,特此做一个记录。主要技术栈采用的是vue2,使用的开发工具是hbuilderX。         经过测试发现部分浏览器并不支持打开摄像头,测试了果子,华子和米,发现

    2024年03月14日
    浏览(76)
  • H5 页面通过navigator.mediaDevices.getUserMedia调用手机摄像头拍照上传

    需求: 某知名化妆品牌,要做个在线问卷调查。需要试用着自拍上传 注:使用navigator.mediaDevices.getUserMedia 需要使用https请求协议否者视为不安全,无法访问,开发阶段需要将启动改为https 在package.json中 前端开发环境启动项目将http协议改为https协议    授权,默认前置,切换

    2024年02月11日
    浏览(43)
  • vue - H5 移动端网页中调用手机摄像头扫描二维码 / 条形码功能,在h5手机网页里调起相机摄像头进行二维码或条形码扫描效果详细教程(详细示例组件源码,一键复制开箱即用!)

    实现了在vue2、vue3网页项目中,实现调起手机摄像头进行扫描二维码或者条码,可自定义样式。 直接复制组件代码,然后根据你的需求改一下。

    2024年02月16日
    浏览(38)
  • 【android开发-21】android中调用系统摄像头camera拍照和相册的用法详解

    1, 调用摄像头 在Android中,调用系统摄像头拍照需要使用Intent来启动Camera应用,并在应用中设置相应的权限。下面是一个简单的例子:

    2024年02月21日
    浏览(38)
  • Android相机调用-CameraX【外接摄像头】【USB摄像头】

    Android相机调用有原生的Camera和Camera2,我觉得调用代码都太复杂了,CameraX调用代码简洁很多。 说明文档:https://developer.android.com/jetpack/androidx/releases/camera?hl=zh-cn 现有查到的调用资料都不够新,对于外接摄像头(USB摄像头)这类非前置也非后置摄像头的设备调用,都说是没有实

    2024年02月09日
    浏览(36)
  • javacv基础02-调用本机摄像头并预览摄像头图像画面视频

    引入架包: 运行效果: 注意: 1、maven依赖后,会导致整个项目工程打包发布后的体积变得十分巨大 原因是ffmpeg和opencv两个依赖默认会把android,ios,linux,macos,windows以及各自不同cpu芯片下,86/64等所有版本的Jar会全部依赖进来,项目打包后体积剧增500M+ 解决方法也比较简单

    2024年02月11日
    浏览(42)
  • 前端调用电脑摄像头

    项目中需要前端调用,所以做了如下操作 先看一下效果吧 主要是基于vue3,通过canvas把画面转成base64的形式,然后是把base64转成 file文件,最后调用了一下上传接口 但是这个得开启浏览器的摄像头权限,不然会报错 以下是代码 进入页面先调用一下摄像头 拍照 转base64 完整代

    2024年02月10日
    浏览(34)
  • Python调用手机摄像头

    1、在手机上安装app:IP摄像头 2、调用代码(前提:电脑连接手机热点) 2.1、如果没有cv2安装包,则需要安装opencv-python库(功能:数字图像处理、人脸检测、视频捕捉,图像旋转等) 和poencv-contrib-python库(功能:图像拼接、CNN人脸识别、特征检测、背景分割,OCR等)。注意

    2024年02月12日
    浏览(41)
  • 使用OpenCV调用摄像头

    1.创建一个摄像头调用的空项目 2.添加上篇博客里已经改好的属性表——现有属性表 3.返回解决方案资源管理器,在源文件里添加新建项命名为摄像头调用 4.输入以下代码,开始调试,然后就会弹出摄像头 #include opencv2/highgui/highgui.hpp  #include opencv2/imgproc/imgproc.hpp  #include ope

    2024年02月05日
    浏览(34)
  • Android——调用摄像头拍照

    首先修改activity_main.xml 如下: 添加一个按钮和图片。 我们的逻辑功能是: 点击按钮后打开相机 相机拍照后图片返回到图片里 由于代码比较长切复杂,我会一步步讲解以便于我的理解。(没错就是我的) 首先我们需要为Button注册点击事件 我们要创建一个文件存放我们拍照的

    2024年02月14日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包