quaggaJS: как "приостановить" декодер

Я использую quaggaJS ( https://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() метод:

декодер больше не обрабатывает изображения. Кроме того, если при инициализации был запрошен поток с камеры, эта операция также отключает камеру.

По этой причине я ищу способ приостановить декодирование, поэтому последний кадр все еще там, а камера еще не отключена.

Любое предложение, как этого добиться?

4 ответа

Лучшим способом сделать это было бы сначала приостановить видео, а затем вызвать Quagga.stop(), чтобы видеоэлемент, который Quagga создает для вас, был приостановлен, и вы не видели затемненного изображения. Кроме того, у вас также может быть кнопка перезапуска / повторного сканирования, чтобы возобновить или, скорее, перезапустить процесс сканирования.

Чтобы получить элемент просмотра, вы можете сделать что-то вроде ниже:

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

Лучший способ, который я нашел и который, я думаю, вам нужен, - это использоватьQuagga.stop()иQuagga.pause()

Судя по тому, что я прочитал в документации, метод stop() уже должен закрывать камеру. Я думаю, это баг, что иногда он только останавливает декодер, но не закрывает камеру, поэтому я также вызываю метод паузы().

Надеюсь это поможет :)

Вам нужно вызвать события Quagga.offProcessed(); Квагга.offDetected();

Пример:

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

чтобы иметь возможность остановить Кваггу

чтобы перезапустить сканирование, просто вызовите Quagga.init еще раз!

Вы можете получить рамку изображения через 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);
});
Другие вопросы по тегам