Chrome 上的 getUserMedia 经常不是 return 最佳分辨率

getUserMedia on Chrome frequently does not return the best resolution

我在 Chrome 上使用 navigator.mediaDevices.getUserMedia(),在 Linux 上使用 80。为了获得最高质量,我 运行 通过一系列约束,检查错误,或者检查流实际上是否达到所需大小。对于我的至少一台相机,它通常只能获得 640x480 尺寸,而不是它能够达到的 1280x720 尺寸。如果我为不同的设备调用 getUserMedia() 然后返回并为原始设备调用它,它通常(但并非总是)获得 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 上运行良好。它适用于某些设备。如果我 select 在第一个设备加载低尺寸后使用不同的设备,它有时会起作用。

OverconstrainedError 说有问题的约束是 deviceId 这一事实有点令人担忧,但根据我读到的内容,它只是 returns 第一个约束,而不是必然是失败的那个。无论如何,当其他变体不会失败时,很难看出设备 ID 如何导致它失败。

我需要做什么才能完成这项工作?

我在调用 enumerateDevices() 之前调用了 getUserMedia(),以便获得查看设备名称的权限。该调用使用了约束 {video:true, audio:true}。在 Chrome 中,至少,这得到了最低的分辨率。对同一设备的进一步调用将始终 return 显示的分辨率相同。为了解决这个问题,我将 true 替换为适当大的宽度和高度 {video:{width:4096,height:2160}},现在 Chrome 在后续调用中获得最高分辨率!