mb-*_*-ca 13 javascript media camera ios11
我试图在iOS 11的Safari中运行以下代码.它应该提示用户访问他们的设备相机,然后在我的<video autoplay id="video"></video>
元素中显示它.但是,在iOS 11中运行时,会导致OverconstrainedError
抛出:
{message: "Invalid constraint", constraint: ""}
Run Code Online (Sandbox Code Playgroud)
我知道iOS 11刚出来所以它可能是一个bug,但是有什么想法吗?有没有其他人遇到这个?
码:
var video = document.getElementById('video');
if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({video: true})
.then(function(stream) {
video.src = window.URL.createObjectURL(stream);
video.play();
})
.catch(function(err) {
console.log(err);
});
}
Run Code Online (Sandbox Code Playgroud)
我跑了navigator.mediaDevices.getSupportedConstraints()
,它返回以下内容:
{
aspectRatio: true,
deviceid: true,
echoCancellation: false,
facingMode: true,
frameRate: true,
groupId: true,
height: true,
sampleRate: false,
sampleSize: false,
volume: true,
width: true
}
Run Code Online (Sandbox Code Playgroud)
我尝试过省略video
属性的配置,但没有运气.
kin*_*aro 13
safari中的无效约束错误是因为浏览器期望您传递正确的宽度,其中之一是:
高度自动计算宽高比为4:3(320或640),16:9(1280),如果传递宽度为320,则视频流设置为:
如果您将宽度设置为640,则视频流设置为:
如果您将宽度设置为1280,则视频流设置为:
在任何其他情况下,您的宽度值都会出现"InvalidConstrain"错误.
您还可以使用最小,最大,精确或理想的宽度约束,请查看MDN文档
这是codepen中的一个例子
var config = { video: { width: 320/*320-640-1280*/ } };
var start = () => navigator.mediaDevices.getUserMedia(config)
.then(stream => v.srcObject = stream)
.then(() => new Promise(resolve => v.onloadedmetadata = resolve))
.then(() => log("Success: " + v.videoWidth + "x" + v.videoHeight))
.catch(log);
var log = msg => div.innerHTML += "<p>" + msg + "</p>";
Run Code Online (Sandbox Code Playgroud)
PD:在chrome中你可以设置一个高度宽度,视频流设置为这些大小,Firefox做一个健身距离,Safari期望完全匹配.
请记住,Xcode 附带的 iOS 模拟器不支持网络摄像头或麦克风,这就是为什么您可能会收到 OverconstrainedError(根据https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia docs,这意味着没有设备适合传递的选项,即使您没有输入细节)
这似乎是一个错误已被纠正,因为我刚刚再次尝试,错误消息不再出现。
请注意,虽然错误消息消失了,但我确实必须再做一项更改才能使其正常工作,即在回调video.srcObject = stream;
中添加then
。
归档时间: |
|
查看次数: |
10068 次 |
最近记录: |