【问题标题】:Tap screen to trigger autofocus with getUserMedia点击屏幕以使用 getUserMedia 触发自动对焦
【发布时间】:2020-05-27 23:57:41
【问题描述】:

带有getUserMedia 的API 对于在浏览器/HTML5 页面中创建视频流非常有用,例如https://www.html5rocks.com/en/tutorials/getusermedia/intro/https://simpl.info/getusermedia/sources/

通过此 API,如何在视频显示中点击时触发(智能手机)相机的自动对焦?

这确实是几乎所有智能手机相机应用程序中的常见行为。

我在 API 文档 MediaDevices.getUserMedia() 中没有找到任何关于“焦点”的信息

【问题讨论】:

  • 好吧,我不认为这是可能的。

标签: javascript html camera getusermedia


【解决方案1】:

目前这是不可能的,但在不久的将来可能会。你应该看看 MediaStream Image Capture Working Draft。本规范描述了 .applyConstraints 的高级选项,最初在 Media Capture and Streams 中引入。

它是如何按照规范工作的?首先,您需要使用.getCapabilities 获取这些功能。如果浏览器可以管理焦点,那么你可以设置focusMode: "auto" | "manual"focusDistance: number为当前的约束。

对焦模式描述捕捉设备的对焦设置(例如自动或手动)。

焦距是控制镜头焦距的数字相机设置。该设置通常以米为单位表示到最佳焦距的距离。

很遗憾,目前你无法控制焦点,但你可以查看未来可能工作的代码。

Chrome issue about support for focusDistance | Chrome Platform Status | MediaCapture Image Implementation Status.

CodeSandbox Demo

navigator.mediaDevices
  .getUserMedia({ video: true })
  .then(gotMedia)
  .catch(err => console.error("getUserMedia() failed: ", err));

function gotMedia(mediastream) {
  const video = document.querySelector("video");
  video.srcObject = mediastream;

  const track = mediastream.getVideoTracks()[0];
  const capabilities = track.getCapabilities();

  // Check whether focus distance is supported or not.
  if (!capabilities.focusDistance) {
    return;
  }

  // Map focus distance to a slider element.
  const input = document.querySelector('input[type="range"]');
  input.min = capabilities.focusDistance.min;
  input.max = capabilities.focusDistance.max;
  input.step = capabilities.focusDistance.step;
  input.value = track.getSettings().focusDistance;

  input.oninput = function(event) {
    track.applyConstraints({
      advanced: [{
        focusMode: "manual",
        focusDistance: event.target.value
      }]
    });
  };
  input.hidden = false;
}
<video autoplay></video>
<input type="range" hidden />

【讨论】:

  • 非常感谢,以后有浏览器更新的时候我会检查一下,看看什么时候可用。 PS:即使它可用,似乎也没有“点击auto-focus”而只有手动focusDistance选项?这是正确的吗?很遗憾,因为.doAutofocusNow() 会非常有用。
  • 似乎focusMode: "auto 是关于“点击自动对焦”但没有点击。而且,是的,当您可以自动聚焦到某个区域时,我看不到中间的东西,但这只是工作草稿。您可以在 w3c 存储库中提出问题,并提醒他们这个错过的概念/功能。 :)
  • 我刚刚做了@artanik here :)
  • 太棒了,我希望这会在不久的将来成为一个功能?
  • 有一个pointsOfInterest 属性应该用于焦点白平衡和曝光。请参阅规范w3c section §10.4。有人试试这个吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2011-07-20
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多