【问题标题】:Use the focusMode constraint to get required media device使用 focusMode 约束获取所需的媒体设备
【发布时间】:2021-08-24 18:11:23
【问题描述】:

大家好!

目前,我正在为我的 Web 应用程序实施二维码扫描器。在多台设备上进行了一些测试后,我注意到我必须设置 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 控制台日志中复制。

因此,我在三星 Galaxy A51 上通过 Brave(基于 Chromium)远程调试尝试了以下限制,但均未奏效:

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 约束来获得具有连续对焦模式的设备吗?

【问题讨论】:

  • 更新:还测试了谷歌浏览器中的实现,结果相同。
  • 我在一加上也面临同样的问题。似乎浏览器和 MediaTrack 都支持。如果你使用track.getConstraints(),你会看到什么?
  • 始终为空对象。似乎 Chromium 无法识别该约束,即使它被声明为受支持。我为 Chromium 项目创建了this issue,但还没有得到有用的回复。

标签: javascript android camera chromium brave


【解决方案1】:

发件人:documentation

流程如下(以 MediaStreamTrack 为例):

  1. 如果需要,请调用 MediaDevices.getSupportedConstraints() 以获取 支持的约束列表,它告诉你什么是可约束的 浏览器知道的属性。这并不总是必要的, 因为当您指定时,任何未知的都将被忽略 他们——但如果你有任何你不能没有的东西,你可以 首先检查以确保它们在列表中。

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

  3. 最后,调用 track 的 applyConstraints() 方法,通过指定值或范围来根据需要配置 API 它希望用于任何可约束属性的值 它有一个偏好。

  4. 轨道的 getConstraints() 方法返回传递给最近调用 applyConstraints() 的一组约束。这可能不会 表示轨道的实际当前状态,由于属性 必须调整其请求的值,并且因为平台默认 没有表示值。对于完整的表示 track的当前配置,使用getSettings()。

在媒体流 API 中,MediaStream 和 MediaStreamTrack 都有 可约束的属性。

您的focusMode 可能是默认设置,您的手机会自行判断。所以你必须使用 getSettings() 来返回实际值。

.getSettings() 返回的是什么?

【讨论】:

  • .getSettings() 确实返回了正确的约束。谢谢你的回答!我不认为这是好的行为,但至少这个文档解释了为什么事情是这样的。
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 2014-12-18
  • 2013-11-29
  • 2020-02-27
  • 2023-01-05
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多