在Safari 12中忽略getUserMedia约束条件

18

由于某些原因,Safari 12(未在其他版本上尝试)完全忽略了getUserMedia的约束条件。

我的代码类似于这样

  navigator.mediaDevices.getUserMedia({
    video: {
      facingMode: 'environment',
      width: {
        min: 640,
        ideal: 1280
      }
    },
    audio: true
  })
 .then(userStream)//Safari on Mac ignores constraints and ends up executing here
 .catch(fallback)//Chrome on Mac raises and error and ends up executing here
在Chrome中,当我执行stream.getVideoTracks()[0].getConstraints()时,我得到了预期的约束条件。但在Safari中执行相同操作则返回一个空对象。
当我尝试强制使用后置摄像头(针对移动设备)并捕获错误以回退到前置摄像头时,问题就出现了。
Mac上的Chrome会正确地引发错误并回退到前置摄像头。
而当被强制使用后置摄像头时,Mac上的Safari不会引发任何错误,导致我的应用程序中出现错误的属性。
我在SO、getUserMedia上搜索了很久,但仍然找不到解决方案,甚至没有人遇到过相同的问题。
也许有更好的方法来确定设备是否有可用的前/后摄像头?
编辑: getSupportedConstraints()函数正确返回支持facingMode。问题是设置该值时它被忽略了。 至于getConstraints()函数不被支持的问题 - 这可能是事实,但这不是问题所在。问题在于强制执行支持的约束条件(在此为facingMode)。
如果您尝试将facingMode: 'environment'设置为打开相同的代码,并从Chrome和Safari中打开,则可以轻松地复制此问题。

你找到问题/解决方法了吗? - asafrob
很抱歉,我没有。自从我写下这个问题的几天后,我就没有再深入研究过它了。由于我们项目的优先事项发生了变化,这个问题一直悬而未决。但是如果您找到任何解决方案,请在此处发布,因为根据点赞数量来看,这似乎是常见问题。 - Kkulikovskis
3个回答

0
我在移动 Safari 上遇到了类似的问题。 我学到的是,现在精确关键字被忽略了,所以你应该查询功能和自己的逻辑。 另外关于帧率这也不起作用,但对于分辨率它有效。

最近我的实验也证明了这一点。我没有印象很多人在使用这项技术,而且苹果也没有太关注它。 - johnny

0

这个 webrtc issue closed 的 Github 问题似乎为您提供了解决方案。

我在不同的浏览器上努力让 webrtc 正常工作,经历了很多挣扎。

祝你好运!


请问您能指出解决方案的评论吗?因为我的问题与该线程讨论的内容并不直接相关。至少我找不到联系。我对流本身或播放视频没有问题。问题在于强制执行约束条件。 - Kkulikovskis
我看到了tetreault的评论:@alienpavlov,如果你需要的话,这是我的完整JS演示。现在我发现它似乎根本不是解决方案。很抱歉...并且在查找指南时,我发现Safari不兼容此方法getConstrains() 链接在这里 - Ivan Sanchez
1
它说兼容性未知。但问题不在于此 - 问题在于约束本身无法正常工作。 - Kkulikovskis
1
2020年仍然存在问题。 - Chemdream

0

getSupportedConstraints 显示了支持的约束条件 - 当我调用此函数时,也会返回 facingMode。问题在于,即使它被支持,但在设置时完全被忽略了。 - Kkulikovskis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接