Chrome 上的 getUserMedia 经常无法返回最佳分辨率

sir*_*ide 1 google-chrome webrtc getusermedia

navigator.mediaDevices.getUserMedia()在 Linux 上的 Chrome 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}}
Run Code Online (Sandbox Code Playgroud)

然后是 1600x1200、1280x720、800x600 和 640x480 的相同模式。最后一个最终成功,因为它匹配从getUserMedia().

这在 Firefox 上运行良好。它适用于某些设备。如果我在第一个设备加载了低尺寸后选择了不同的设备,它有时会起作用。

事实上,有问题的OverconstrainedError约束deviceId有点令人担忧,但根据我读过的内容,它只返回第一个约束,不一定是失败的约束。无论如何,当其他变体没有失败时,很难看出设备 ID 如何导致它失败。

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

sir*_*ide 6

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