Как решить проблему iOS 11 Safari getUserMedia "недопустимое ограничение"

Я пытаюсь запустить следующий код в Safari в iOS 11. Он должен предложить пользователю предоставить доступ к камере своих устройств, а затем отобразить ее в my <video autoplay id="video"></video> элемент. Однако при работе в iOS 11 это приводит к OverconstrainedError быть брошенным:

{message: "Invalid constraint", constraint: ""}
  • код отлично работает в Android и успешно открывает камеру.
  • я попытался несколько допустимых конфигураций без успеха.

Я знаю, что iOS 11 только что вышел так это может быть ошибка, но какие-то мысли? Кто-нибудь еще сталкивался с этим?

код:

var video = document.getElementById('video');
if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
     navigator.mediaDevices.getUserMedia({video: true})
         .then(function(stream) {
             video.src = window.URL.createObjectURL(stream);
             video.play();
         })
         .catch(function(err) {
             console.log(err);
         });
}

изменить 1

Я navigator.mediaDevices.getSupportedConstraints() и он возвращает следующее:

{
    aspectRatio: true,
    deviceid: true,
    echoCancellation: false,
    facingMode: true,
    frameRate: true,
    groupId: true,
    height: true,
    sampleRate: false,
    sampleSize: false,
    volume: true,
    width: true
}

Я пробовал конфигурации, опуская video собственность, но не повезло.

3 ответов


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

  • 320
  • 640
  • 1280

высота автоматически вычисляется в соотношении сторон 4:3 для 320 или 640 и 16: 9 для 1280, затем, если вы передаете ширину 320, вы устанавливаете видеопоток в:

  • 320x240

Если вы установили ширину 640, Вы видео поток установлен в:

  • 640x480

и если вы установите ширину 1280, то Вы видео поток установлен в:

  • 1280x720

в любом другом случае вы получили ошибку "InvalidConstrain" для значения ширины.

также вы можете использовать минимальные, максимальные, точные или идеальные ограничения для ширины, пожалуйста, проверьте документация MDN

вот пример в этой сайт CodePen

var config = { video: { width: 320/*320-640-1280*/ } };
var start = () => navigator.mediaDevices.getUserMedia(config)
  .then(stream => v.srcObject = stream)
  .then(() => new Promise(resolve => v.onloadedmetadata = resolve))
  .then(() => log("Success: " + v.videoWidth + "x" + v.videoHeight))
  .catch(log);

var log = msg => div.innerHTML += "<p>" + msg + "</p>";

PD: в chrome вы можете установить ширину высоты, и видеопоток установлен в этих размерах, Firefox делает фитнес, и Safari ожидают точного совпадения.


похоже, это была ошибка, которая была исправлена, потому что я просто попробовал ее снова, и сообщение об ошибке больше не появляется.

обратите внимание, что, хотя сообщение об ошибке исчезло, мне пришлось сделать еще одно изменение для его работы, которое добавляло video.srcObject = stream; на then обратный.


помните, что симулятор iOS, который поставляется с Xcode, не поддерживает веб-камеру или микрофон ,поэтому вы можете получить OverconstrainedError (согласно https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia docs, это означает, что ни одно устройство не соответствует переданным параметрам, даже если вы не ставите специфику)