由于某些原因,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中打开,则可以轻松地复制此问题。