You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用navigator.mediaDevices.getUserMedia时相机无法聚焦的问题求助

近距离小型二维码扫描聚焦失效及识别问题

使用navigator.mediaDevices.getUserMedia调用相机进行二维码扫描时,遇到以下问题:当二维码尺寸较小且拍摄距离过近时,相机无法聚焦得到清晰画面,设置focusMode参数也没有效果。尝试过html5-qrcode、qr-scanner、vue-qrcode-reader等第三方JavaScript插件,以及原生API,均无法识别实物上的小型二维码。

以下是我的实现代码:

<!DOCTYPE html>
<html>

<head>
    <title>HTML5 QR Code Scanner</title>
    <meta charset="utf-8">
    <script src="/assets/js/jsQR.min.js"></script>
</head>

<body>
    <div style="width: 100vw;height: 1200;display: flex;align-items: center;justify-content: center;">
        <video id="video" width="1200" height="1200" autoplay></video>
        <canvas id="canvas" width="1200" height="1200" style="display:none;"></canvas>
    </div>
    <p id="result"></p>
    <script>
        var video = document.getElementById("video");
        var canvas = document.getElementById("canvas");
        var context = canvas.getContext("2d");
        var result = document.getElementById("result");
        let supportedConstraints = navigator.mediaDevices.getSupportedConstraints();
        console.log('supported', supportedConstraints)
        const constraints = {
            width: { min: 640, ideal: 1280 },
            height: { min: 480, ideal: 720 },
            advanced: [{ width: 1920, height: 1280 }, { aspectRatio: 1.333 }, { focusMode: "continuous" }]
        }

        if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
            navigator.mediaDevices.getUserMedia({
                video: {
                    width: 900, height: 900, 
                    facingMode: { exact: 'environment' },
                    advanced: [{ focusMode: "continuous" }],
                    frameRate: { ideal: 10, max: 15 }
                }
            }).then(function (stream) {
                const track = stream.getVideoTracks()[0];
                track.applyConstraints(constraints).then((e) => {

                }).catch((e => { alert('error') }))
                let constraintsData = track.getConstraints();
                console.log('constraintsData', constraintsData)

                video.srcObject = stream;
                video.play();
                setInterval(function () {
                    context.drawImage(video, 0, 0, 300, 300);
                    var imageData = context.getImageData(0, 0, 300, 300);
                    var code = jsQR(imageData.data, imageData.width, imageData.height);
                    if (code) {
                        alert(code.data)
                    } else {
                        result.textContent = "waitting";
                    }

                }, 500);
            }).catch(function (err) {
                result.textContent = "err:" + err;
            });
        } else {
            result.textContent = "sorry";
        }
    </script>
</body>

</html>

内容的提问来源于stack exchange,提问作者tao ran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:13:13