getUserMedia на Chrome часто не возвращает лучшее разрешение - PullRequest
0 голосов
/ 10 апреля 2020

Я использую navigator.mediaDevices.getUserMedia() на Chrome 80 на Linux. Чтобы получить наивысшее качество, я пробегаю через ряд ограничений, проверяю ошибки или поток, который на самом деле не имеет желаемого размера. По крайней мере, для одной из моих камер она часто получает только размер 640x480, а не 1280x720, на который она способна. Если я позвоню getUserMedia() для другого устройства, а затем go вернусь и вызову его для исходного устройства, оно, как правило, но не всегда, получает версию 1280x720. Я не уверен, как заставить Chrome использовать правильные размеры.

Вот ограничения, которые я использую (последовательно):

// OverconstrainedError (deviceId)
{"audio":false,"video":{"deviceId":{"exact":"cd059d931e1c4554faee7a5722ab8db810cec27316cc085512fcf5815dac3a98"},"frameRate":30,"width":{"min":1920,"ideal":1920,"max":1920},"height":{"min":1080,"ideal":1080,"max":1080}}}

// succeeds, but returns 640x480
{"audio":false,"video":{"deviceId":{"exact":"cd059d931e1c4554faee7a5722ab8db810cec27316cc085512fcf5815dac3a98"},"frameRate":30,"width":{"ideal":1920},"height":{"ideal":1080}}}

// OverconstrainedError (deviceId)
{"audio":false,"video":{"deviceId":{"exact":"cd059d931e1c4554faee7a5722ab8db810cec27316cc085512fcf5815dac3a98"},"frameRate":30,"width":{"min":1920},"height":{"min":1080}}}

// OverconstrainedError (deviceId)
{"audio":false,"video":{"deviceId":{"exact":"cd059d931e1c4554faee7a5722ab8db810cec27316cc085512fcf5815dac3a98"},"frameRate":30,"width":{"exact":1920},"height":{"exact":1080}}}

// succeeds, but returns 640x480
{"audio":false,"video":{"deviceId":{"exact":"cd059d931e1c4554faee7a5722ab8db810cec27316cc085512fcf5815dac3a98"},"frameRate":30,"width":1920,"height":1080}}

А затем один и тот же шаблон для 1600x1200, 1280x720, 800x600 и 640x480. Последнее успешно в конечном итоге, потому что оно соответствует единственному измерению, когда-либо возвращенному из getUserMedia().

. Это прекрасно работает на Firefox. Работает нормально для некоторых устройств. Иногда это работает, если я выбрал другое устройство после того, как первое было загружено с низкими размерами.

Тот факт, что OverconstrainedError говорит о том, что ограничение нарушителя - deviceId, немного касается, но основано на том, что Я прочитал, он просто возвращает первое ограничение, не обязательно то, которое не удалось. В любом случае, трудно понять, как идентификатор устройства может вызвать сбой, когда другие варианты не дают сбоя.

Что мне нужно сделать, чтобы эта работа работала?

1 Ответ

0 голосов
/ 10 апреля 2020

Я звонил на getUserMedia() перед вызовом enumerateDevices(), чтобы получить разрешение на просмотр имен устройств. Этот вызов использовал ограничения {video:true, audio:true}. По крайней мере, в Chrome это получает самое низкое разрешение. Последующие вызовы для одного и того же устройства всегда возвращают то же разрешение, которое появляется Чтобы это исправить, я заменил true на достаточно большую ширину и высоту {video:{width:4096,height:2160}}, и теперь Chrome получает самое высокое разрешение при последующих вызовах!

...