quaggaJS:如何"暂停"解码器

时间:2017-04-18 15:23:56

标签: javascript quaggajs

我使用quaggaJShttps://github.com/serratus/quaggaJS)来阅读网络应用程序中的条形码。它工作得很好,这是我的初始化代码:

Quagga.init({
    inputStream: {
        name: "Live",
        type: "LiveStream",
        constraints: {
            width: 1280,
            height: 720,
            facingMode: "environment"
        }
    },
    decoder: {
        readers: ["code_39_reader"],
        debug: {
            drawBoundingBox: true,
            showFrequency: false,
            drawScanline: true,
            showPattern: true
        },
        multiple: false
    },
    locator: {
        halfSample: true,
        patchSize: "medium"
    }
}, function (err) {
    if (err) {
        alert(err);
        return;
    }
    Quagga.registerResultCollector(resultCollector);
    Quagga.start();
});

此处处理onDetected事件:

Quagga.onDetected(function (data) {
    Quagga.stop();  // <-- I want to "pause"
    // dialog to ask the user to accept or reject
});

这是什么意思? 当它识别条形码时,我需要询问用户是否要接受或拒绝解码的值 - 因此重复该过程。

离开捕获的图像以便他能够真正看到他刚捕获的图像会很好。

Quagga.stop()在大多数情况下有效,但它不可靠,因为有时画布会变黑。我想这是由于stop()方法的行为:

  

解码器不再处理任何图像。此外,如果在初始化时请求摄像机流,此操作也会断开摄像机的连接。

出于这个原因,我正在寻找暂停解码的方法,因此最后一帧仍在那里,相机还没有断开连接。

有任何建议如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

一个更好的方法是先暂停视频,然后调用Quagga.stop(),这样Quagga为您创建的视频元素将被暂停,而您不会看到变黑的图像。此外,您还可以使用重新启动/重新扫描按钮来恢复或重新启动扫描过程。

要获取view元素,您可以执行以下操作:

    Quagga.onDetected(function (result) {
        var cameraFeed = document.getElementById("cameraFeedContainer")
        cameraFeed.getElementsByTagName("video")[0].pause();
        return;
    });

答案 1 :(得分:0)

您可以通过Quagga.canvas.dom.image获取图像帧。 这样,您可以覆盖视频流。

HTML

<div class="scanArea">
    <div id="interactive" class="viewport"></div>
    <div class="scanArea__freezedFrame"></div>
</div>

CSS

.scanArea {
    position: relative;
}
.scanArea__freezedFrame {
    position: absolute;
    left: 0;
    top: 0;
}

JavaScript

Quagga.onDetected(function(result) {
    var canvas = Quagga.canvas.dom.image;
    var $img = $('<img/>');
    $img.attr("src", canvas.toDataURL());
    $('.scanArea__freezedFrame').html($img);
});