我们公司正在摆弄WebRTC。我偶然发现了一个奇怪的事情,我不确定这是 WebRTC 的设计还是我们这边的实现错误。
我们目前有一个简单的 Web 应用程序,它显示在线联系人的联系人列表。现在可以简单地呼叫联系人列表中的任何用户。
呼叫者和被呼叫者可以自由选择共享网络摄像头和/或音频。然后 GetUserMedia() (MediaConstraints) 会尊重这一点。
现在奇怪的事情是:如果呼叫者在启用视频的情况下开始,客户端(Chrome 65)只会协商视频呼叫。如果呼叫者没有提供他的网络摄像头,我们就不会得到被叫方网络摄像头的流式传输(如果他允许的话)。
但是,当呼叫者在启用网络摄像头的情况下发起呼叫并且被呼叫者决定不显示他的摄像头时,一切都会按预期进行。 (只有来电者有直播)。
如果双方都同意显示视频,我们就会获得双向视频流。
如果这意味着是这样的话,有人了解一些内部知识吗?是否可以在不显示自己的网络摄像头的情况下呼叫某人,但稍后会看到被呼叫者的网络摄像头?
提前致谢, 斯文
尝试
pc.createOffer({offerToReceiveVideo: true})
,而不是在没有这些限制的情况下调用它。
菲利普的回答非常有效。然而,到目前为止,建议的选项已被“标记为遗留”,不应再使用。执行此操作的新方法是在创建报价之前将视频收发器添加到连接:
connection.addTransceiver('video');
// this step seems to be optional:
connection.getTransceivers().forEach(t => t.direction = 'recvonly');
connection.createOffer();
归功于https://niccoloterreri.com/webrtc-with-transceivers
。有关可选步骤,请参阅 https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpTransceiver/direction。
首先如果当前用户是CALLER:
// We have getUserMedia()
const localStream = await navigator.mediaDevices.getUserMedia({
video: true,
audio: true,
});
localStream.getTracks().forEach((track) => {
pc.addTrack(track, localStream);
});
// Also important the createOffer()
const offerDescription = await pc.createOffer({offerToReceiveAudio: true,offerToReceiveVideo: true});
localRef.current.srcObject = localStream;
否则如果当前用户是 CALLEE:
没有呼叫
getUserMedia()...
没有呼叫pc.addTrack(addStream)...
const remoteStream = new MediaStream();
pc.ontrack = (event: RTCTrackEvent) => {
event.streams[0].getTracks().forEach((track) => {
remoteStream.addTrack(track);
});
};
remoteRef.current.srcObject = remoteStream;
使用了这里的一些信息:与WEBRTC的单向通信