navigator.getUserMedia允许一个约束,另一个不允许,成功回调在关闭浏览器提示时调用

Mau*_*oni 5 javascript getusermedia

这是我的代码.

captureUserMedia(mediaConstraints, successCallback, errorCallback) {
    navigator.getUserMedia(mediaConstraints, successCallback, errorCallback);
}

captureUserMedia00(callback){
  captureUserMedia({
    audio: true,
    video: true
  }, function(stream) {
    console.log('user media Callback', stream);
    callback(stream);
  }, function(error) {
    console.log('user media Error ', JSON.stringify(error));
  });
 }});
}
Run Code Online (Sandbox Code Playgroud)

这里,当用户尚未允许视频约束时,但已经允许音频(由于其他只是录音),并且当提示相同,并且用户'关闭'提示时,调用successCallback,我不会得到VideoStream,但只是音频.

如何在调用successCallback时确保允许视频和音频权限?

jib*_*jib 2

这实际上是 Chrome 和 Firefox 中的一个错误,因为在这种情况下它应该调用errorCallback。它已在 Firefox 开发者版 (49) 中得到修复。

作为解决方法,请检查您是否有两个轨道:

if (stream.getTracks().length < 2) {
  throw new Error("Need both");
}
Run Code Online (Sandbox Code Playgroud)

Polyfill 可能看起来像这样(在 Chrome 中使用https fiddle ):

if (stream.getTracks().length < 2) {
  throw new Error("Need both");
}
Run Code Online (Sandbox Code Playgroud)
let getUserMedia = constraints =>
  navigator.mediaDevices.getUserMedia(constraints).then(stream => {
    if (constraints.audio && !stream.getAudioTracks().length ||
        constraints.video && !stream.getVideoTracks().length) {
      stream.getTracks().forEach(track => track.stop());
      throw new DOMException("The object can not be found here.",
                             "NotFoundError");
    }
    return stream;
  });

getUserMedia({ video: true, audio: true })
  .then(stream => video.srcObject = stream)
  .catch(e => console.log(e.name + ": "+ e.message));
Run Code Online (Sandbox Code Playgroud)