Есть ли причина, по которой не удалось найти ошибку при вызове navigator.mediaDevices.getUserMedia? - PullRequest
0 голосов
/ 16 января 2019

Я пишу приложение Webrtc для настольных компьютеров Chrome, используя одновременно две камеры, используя последнюю версию Chrome для Windows.

Доступ к списку камер с помощью navigator.mediaDevices.enumerateDevices () в порядке, но доступ к этим устройствам по их определенному идентификатору с помощью navigator.mediaDevices.getUserMedia не работает.

Это происходит только иногда. Но нет ошибки в подвохе.

Итак, я попробовал navigator.mediaDevices.getUserMedia действительно существует или нет.

if (navigator && navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { }

Да, это было.

Просто не получаю никакой информации журнала при вызове navigator.mediaDevices.getUserMedia ()

getVideoSources_ = function() {
    return new Promise(function(resolve, reject) {
        if (typeof navigator.mediaDevices.enumerateDevices === 'undefined') {
            alert('Your browser does not support navigator.mediaDevices.enumerateDevices, aborting.');
            reject(Error("Your browser does not support navigator.mediaDevices.enumerateDevices, aborting."));
            return;
        }

        requestVideoSetTimeout = 500;
        navigator.mediaDevices.enumerateDevices().then((devices) => {

            // get the list first by sorting mibunsho camera in first place
            for (var i = 0; i < devices.length; i++) {
                log("devices[i]", JSON.stringify(devices[i]));
                log("devices[i].label", devices[i].label);
                if (devices[i].kind === 'videoinput' && devices[i].deviceId && devices[i].label) {
                    if (devices[i].label.indexOf("USB_Camera") > -1) {
                        deviceList[1] = devices[i];
                    } else {
                        deviceList[0] = devices[i];
                    }
                }
            }

            // request video by sorted plan
            for (var i = 0; i < deviceList.length; i++) {
                requestVideo_(deviceList[i].deviceId, deviceList[i].label, resolve, reject);
                requestVideoSetTimeout = 1000; // change requestVideoSetTimeout for next video request
            }
        }).catch((err) => {
            log("getVideoSources_:" + err.name + ": " + err.message);
            reject(Error("getVideoSources_ catch error"));
        });
    });
}
getVideoSources_().then(function(result) {
    ....
}).catch(function(err) {
    ....
});

function requestVideo_(id, label, resolve, reject) {
    if (navigator && navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        log("navigator.mediaDevices.getUserMedia found!");

        navigator.mediaDevices.getUserMedia({
            video: {
                deviceId: {exact: id},
                width: 640,
                height: 480,
                frameRate: {
                    ideal: 20,
                    max: 20
                }
            },
            audio: false}).then(
            (stream) => {
                log("***requestVideo_", id);
                log("***requestVideo_", label);
                log("***requestVideo_", stream);
          // USB_Camera is face camera
          if (label.indexOf("USB_Camera") > -1) {
            log("***requestVideo_001");
            myStream2 = stream;
            log("***requestVideo_myStream2", myStream2);
          } else {
            log("***requestVideo_002");
            myStream = stream;
            log("***requestVideo_myStream", myStream);
            getUserMediaOkCallback_(myStream, label);
          }
          resolve("###Video Stream got###");

          stream.getVideoTracks()[0].addEventListener('ended', function(){
            log("***Camera ended event fired. " + id + " " + label);
            endedDevice[id] = label;
          });
      },
      getUserMediaFailedCallback_
      ).catch((error) => {
        log('requestVideo_: ' + error.name);
        reject(Error("requestVideo_ catch error" + error.name));
      });
    }
}

function getUserMediaFailedCallback_(error) {
    log("getUserMediaFailedCallback_ error:", error.name);
    alert('User media request denied with error: ' + error.name);
}

1 Ответ

0 голосов
/ 16 января 2019

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

Это анти-шаблон конструктора обещаний . Вкратце: не пишите код приложения внутри конструкторов обещаний. Не передавайте функции resolve и reject вниз. Вместо этого позвольте функциям возвращать обещания до вас, и добавьте к ним весь код приложения в then обратных вызовах. Затем верните все обещания, чтобы они образовали единую цепочку. Только тогда ошибки распространяются корректно.

Подробнее см. Использование обещаний в MDN .

...