使视频流在getUserMedia中可选

时间:2014-08-14 12:50:39

标签: webrtc getusermedia

在我的应用程序中,如果用户可以制作音频流,则可以拨打电话。所以,我需要访问麦克风(音频流)。没有它,应用程序应该抛出错误。视频是可选的。所以,我打电话给navigator.getUserMedia并将constraints改为:

{ audio: true, video: false }

当麦克风不存在时,它会抛出错误,就像我需要的那样。但另一个副作用是,如果用户也可以访问摄像头,则视频不会出现在视频流中。

但如果我同时将audiovideo设置为true,我会在用户拥有麦克风但无法访问相机的情况下出现错误(根据到我的应用程序逻辑)

如何将视频流设为可选获取getUserMedia

2 个答案:

答案 0 :(得分:6)

现在存在另一种方式。您现在可以在致电getUserMedia之前直接检查用户拥有的相机和麦克风数量:

navigator.mediaDevices.enumerateDevices()
  .then(devices => {
    var cams = devices.filter(device => device.kind == "videoinput");
    var mics = devices.filter(device => device.kind == "audioinput");

    var constraints = { video: cams.length > 0, audio: mics.length > 0 };
    return navigator.mediaDevices.getUserMedia(constraints);
  })
  .then(stream => video.srcObject = stream)
  .catch(failed);

旧的方式仍然有效,但这可能会更清洁。

请注意,正在使用enumerateDevices,此时Chrome中需要启用一个标记,或使用adapter.js

更新:Chrome现在也支持enumerateDevices

答案 1 :(得分:3)

我找到的解决方案是在启用视频和音频的情况下致电getUserMedia,如果通话失败(意味着他们要么没有相机或麦克风),那么请拨打{{1}再次从您提供的故障回调请求仅访问麦克风。

getUserMedia

当然,你可以随心所欲地处理成功和失败。

注意:如果没有摄像头,则永远不会出现请求初始摄像头馈送(即失败)的弹出窗口。因此,用户只能获得一个访问请求(这使得这个解决方案更加可口)。