即使用户没有网络摄像头,我也可以发送视频流吗?

时间:2015-07-07 03:23:21

标签: webrtc

我正在进行视频会议,我在使用connection.waitUntilRemoteStreamStartsFlowing = true;之前正在做其他事情。它工作正常,除非用户没有网络摄像头。有没有办法我仍然可以从没有网络摄像头的用户发送视频流?

1 个答案:

答案 0 :(得分:1)

这将浪费良好的带宽。我不熟悉您正在使用的图书馆,但使用普通的WebRTC,就像使用WebRTC sample的教科书adapter.js一样,您可以这样做:

致电navigator.mediaDevices.enumerateDevices()了解用户拥有的相机和麦克风数量:

navigator.mediaDevices.enumerateDevices()
.then(function(devices) {
  var hasCam = devices.some(function(d) { return d.kind == "videoinput"; });
  var hasMic = devices.some(function(d) { return d.kind == "audioinput"; });
  ...
})

有了这些信息,如果他们没有相机,请跳过询问用户的相机:

var constraints = { video: hasCam, audio: hasMic };

navigator.mediaDevices.getUserMedia(constraints)
.then(function(stream) {
  myPeerConnection.addStream(stream);
})

最后,如果您不发送视频,则默认情况下不会接收视频(默认为傻),因此如果对方有相机,请使用RTCOfferOptions

var options = { offerToReceiveAudio: true, offerToReceiveVideo: true };

myPeerConnection.createOffer(options)
.then(function(offer) { ... })

在Chrome中,除最后一点外,您需要adapter.js,但在最新的Firefox中,它应just work(注意:使用arrow-functions):



var pc1 = new mozRTCPeerConnection(), pc2 = new mozRTCPeerConnection();

navigator.mediaDevices.enumerateDevices()
.then(devices => navigator.mediaDevices.getUserMedia({
  video: devices.some(device => device.kind == "videoinput"),
  audio: devices.some(device => device.kind == "audioinput")
}))
.then(stream => pc1.addStream(v1.mozSrcObject = stream))
.then(() => pc1.createOffer({ offerToReceiveAudio: true,
                              offerToReceiveVideo: true }))
.then(offer => pc1.setLocalDescription(offer))
.then(() => pc2.setRemoteDescription(pc1.localDescription))
.then(() => pc2.createAnswer())
.then(answer => pc2.setLocalDescription(answer))
.then(() => pc1.setRemoteDescription(pc2.localDescription))
.then(() => log("Connected!"))
.catch(failed);

pc1.onicecandidate = e => !e.candidate ||
    pc2.addIceCandidate(e.candidate).catch(failed);
pc2.onicecandidate = e => !e.candidate ||
    pc1.addIceCandidate(e.candidate).catch(failed);
pc2.onaddstream = e => v2.mozSrcObject = e.stream;

var log = msg => div.innerHTML += msg + "<br>";
var failed = e => log(e.toString() +", line "+ e.lineNumber);
&#13;
<video id="v1" height="120" width="160" autoplay></video>
<video id="v2" height="120" width="160" autoplay></video>
<br><div id="div"></div>
&#13;
&#13;
&#13;

部分内容是全新的,所以我不确定它与您正在使用的库集成的程度如何,但它应该随着时间的推移。

Chrome有这个API的旧版本,我不会在这里提及,因为它不是标准版。