利用getUserMedia获取摄像头权限
将摄像头返回的媒体流扔到video标签
使用canvas抓取video的某一帧画面
将其canvas转为base64通过wechat-qrcode-ocr-wasm解析其中是否包含二维码(这步很慢)
- 当这步完成后才会执行video下一次画面帧抓取/或直接绘制二维码所在区域的图形,导致抓取的画面很慢,往往画布上的每秒帧数不会超过3帧,需要对着二维码区域停留很久才能抓到比较清晰的二维码照片
// 解析二维码
const video = this.$refs.video
const canvas = this.$refs.canvas
const ctx = canvas.getContext('2d')
ctx.drawImage(video,0,0,canvas.width,canvas.height)
const img = canvas.toDataURL()
// 第一种
// 到这一步就很慢了,画布上的帧数可以说是PPT也不为过
// 因为必须等该接口返回才能抓下一帧
this.getCode(img).then(result=>{
conast {size,data,points} = result
if(size === 0){
this.animationTimer = window.requestAnimationFrame(()=>{
//继续调用这个解析二维码函数
})
return
}
// 绘制扫码完成后的动画特效
})
// 第二种
// 这种很快就会RuntimeError: Aborted(). Build with -sASSERTIONS for more info
// 在不停的抓取video图片,并发起解析的请求,就会开始加载图片
// 如果通过节流器控制应该会好点,但没试过
this.animationTimer = window.requestAnimationFrame(()=>{
//继续调用这个解析二维码函数
})
this.getCode(img).then(result=>{
conast {size,data,points} = result
if(size === 0){
return
}
this.clearTimer();
// 绘制扫码完成后的动画特效
})
思路没啥问题,主要是对视频的解析。
如果是纯前端来做,建议在
play
事件中做好节流,识别这块你用的wechat-qrcode-ocr-wasm
没听过,不过可以试一下jsqr
或zxing
.另外建议用
Web Worker
开子线程做解析。要想更快更准确的解析出二维码,这里给几个思路和建议:
如果有条件,建议第2、5两条在服务器上完成,甚至可以把视频流全给服务端,让服务端去生成。如果不行只能前端自己搞,关键就是优化,优化的好识别的就快、准。
另外给个减少噪点和增加对比度的代码吧,你根据自己的需求去调试:
记得这种计算类的代码尽量不要在主线程跑,可能会阻塞甚至卡死。
希望能对你有帮助吧