From c2a52a80a1fa2c80b7ee8854d9d7b263748b3490 Mon Sep 17 00:00:00 2001 From: James Easter Date: Wed, 2 Apr 2025 16:06:03 -0600 Subject: [PATCH 1/9] Use Barcode Detection API to detect barcodes. --- CHANGELOG.md | 5 +++ components/BarcodeScanner.vue | 63 +++++++++++++++++++++++++++-------- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff599c6..1ef5f7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # bedrock-vue-barcode-scanner ChangeLog +## 1.4.0 - 2025-04-xx + +### Changed +- Use Barcode Detection API to detect barcodes. + ## 1.3.1 - 2025-03-11 ### Changed diff --git a/components/BarcodeScanner.vue b/components/BarcodeScanner.vue index 6d2498e..98f6765 100644 --- a/components/BarcodeScanner.vue +++ b/components/BarcodeScanner.vue @@ -69,7 +69,7 @@ export default { // map formats from Web standard to `Html5QrcodeSupportedFormats` scanner = new Html5Qrcode( 'dce-video-container', { - fps: 60, + fps: 30, formatsToSupport: _mapFormats(formatsToSupport), useBarCodeDetectorIfSupported: true, } @@ -99,8 +99,14 @@ export default { await getZoomConstraints(); // Set focus mode scanner.applyVideoConstraints({ - advanced: [{focusMode: 'continuous'}], + advanced: [ + {frameRate: 30}, + {resizeMode: 'none'}, + {focusMode: 'continuous'}, + ], }); + // Use Barcode Detection API + startBarcodeDetection(); loadingCamera.value = false; }); @@ -138,6 +144,44 @@ export default { cameraConstraints.zoom.step = step; } + function startBarcodeDetection() { + // Get video element + const videoElement = document.querySelector( + '#dce-video-container > video' + ); + const {BarcodeDetector} = globalThis; + // Check if BarcodeDetector is supported + if(!BarcodeDetector) { + alert('Barcode Detector is not supported in this browser.'); + return; + } else { + const barcodeDetector = new BarcodeDetector({formats: ['pdf417']}); + const detectBarcode = async video => { + try { + // Detect barcodes in the current video frame + const barcodes = await barcodeDetector.detect(video); + if(barcodes.length > 0) { + barcodes.forEach(barcode => { + const {format, rawValue} = barcode; + if(format && rawValue) { + console.log('Barcode Detection API:', barcode); + emit('result', {type: format, text: rawValue}); + } + }); + } + } catch(error) { + console.error('Barcode detection failed:', error); + } + // Schedule the next frame check + video.requestVideoFrameCallback(() => detectBarcode(video)); + }; + // Start the detection loop + videoElement.requestVideoFrameCallback(() => + detectBarcode(videoElement) + ); + } + } + // Update camera zoom async function onZoomChange(updatedValue) { scanner.applyVideoConstraints({ @@ -145,17 +189,9 @@ export default { }); } - function onScanSuccess(decodedText, decodedResult) { - const text = decodedText; - const type = decodedResult?.result?.format?.formatName; - console.log( - 'BarcodeScanner detected something:', - decodedText ? decodedText : '' - ); - if(!type || !text) { - return; - } - emit('result', {type, text}); + // Use Barcode Detection API instead of html5qrcode's logic + function onScanSuccess() { + return; } function onError(error) { @@ -262,7 +298,6 @@ function _mapFormats(formats) { return result; }); } -