使用focusMode约束获取所需的媒体设备



大家好!

目前,我正在为我的web应用程序实现qr码扫描器。在多个设备上进行了一些测试后,我注意到我必须设置focusMode约束才能获得能够自动对焦环境的相机。

我可以通过在约束中直接设置deviceId来直接选择调试设备上的相机,如下所示:

let stream = await navigator.mediaDevices.getUserMedia({
video: {
deviceId: "332d34c91861f97ba8f0e11f446da4566a1803539764dd67c1dfe036ef32fd97"
}
});

我可以调用stream.getVideoTracks()[0].getCapabilities()来获得功能。

{
aspectRatio: {max: 4000, min: 0.0003333333333333333},
colorTemperature: {max: 7000, min: 2850, step: 50},
deviceId: "332d34c91861f97ba8f0e11f446da4566a1803539764dd67c1dfe036ef32fd97",
exposureCompensation: {max: 2, min: -2, step: 0.10000000149011612},
exposureMode: (2) ["continuous", "manual"],
exposureTime: {max: 1250, min: 0, step: 0},
facingMode: ["environment"],
focusMode: (3) ["manual", "single-shot", "continuous"],
frameRate: {max: 30, min: 0},
groupId: "40f2953f5fae495c7471348c844e919762a3213019b271664d220d0aa617313c",
height: {max: 3000, min: 1},
iso: {max: 4000, min: 20, step: 1},
resizeMode: (2) ["none", "crop-and-scale"],
torch: true,
whiteBalanceMode: (2) ["continuous", "manual"],
width: {max: 4000, min: 1}
}

从Chromium控制台日志中复制。

所以我尝试了以下约束通过Brave(基于Chromium)远程调试我的三星Galaxy A51,其中没有一个工作:

let stream = await navigator.mediaDevices.getUserMedia({
video: {
focusMode: {exact: ["continuous"]}
}
});

let stream = await navigator.mediaDevices.getUserMedia({
video: {
focusMode: "continuous"
}
});

let stream = await navigator.mediaDevices.getUserMedia({
video: {
focusMode: ["continuous"]
}
});

let stream = await navigator.mediaDevices.getUserMedia({
video: {
advanced: [{focusMode: "continuous"}]
}
});

let stream = await navigator.mediaDevices.getUserMedia({
video: {
advanced: [{focusMode: ["continuous"]}]
}
});

let stream = await navigator.mediaDevices.getUserMedia({
video: {
advanced: [{focusMode: {exact: "continuous"}}]
}
});

我不知道这个结构是否正确,我不太确定如何找出它。

有人知道如何使用focusMode约束来获得具有连续对焦模式的设备吗?

From the: documentation

过程是这样的(以MediaStreamTrack为例):

  1. 如果需要,调用MediaDevices.getSupportedConstraints()来获取支持的约束列表,它告诉您哪些约束是可约束的浏览器知道的属性。这并不总是必要的,因为当您指定时,任何未知的都将被忽略但是如果你有一些你离不开的东西,你可以从检查他们是否在名单上开始。

  2. 一旦脚本知道它希望使用的属性是否被支持,它就可以检查API的功能它的实现通过检查对象返回轨道getCapabilities()方法;此对象列出每个支持的约束以及支持的值或值的范围。

  3. 最后,调用轨道的applyConstraints()方法,通过指定的值或范围来配置所需的API的任何受约束属性所使用的值它有一个偏好

  4. 轨道的getConstraints()方法返回传递给最近的applyConstraints()调用的约束集合。这可能不是由于属性的关系,表示轨道的实际当前状态由于平台默认,需要调整哪些请求值没有表示值。的完整表示使用getSettings()。

在媒体流API中,MediaStream和MediaStreamTrack都有constrainable属性。

可能你的focusMode是一个默认设置,你的手机自己计算。因此,您必须使用getSettings()来返回实际值。

.getSettings()返回什么?

相关内容

  • 没有找到相关文章

最新更新