WebRTC - 使用来自纯音频流的提议接收来自另一个对等点的视频

WebRTC - Receive video from another peer using an offer from an audio-only stream

如果调用 createOffer() 的对端仅在通过 getUserMedia() 请求时允许音频,是否可以从另一个对端接收视频和音频?

场景说明:

  1. 爱丽丝连接到信令服务器,当调用getUserMedia()时,选择共享视频和音频。
  2. Bob连接信令服务器,调用getUserMedia()时,分享音频
  3. 由于 Bob 是最后一个参加派对的人,Bob 通过 RTCPeerConnection.createOffer() 创建了对等连接提议。他分享了他的 localDescription,其中包含未提及视频的 SDP 数据。
  4. 由于 SDP 数据仅包含与音频相关的信息,因此生成的连接仅包含音频。

能否创建要求接收视频数据但不共享的报价?

Bob 的提议将包含音频,但 alice 也会分享她的视频。

当 Bob 稍后希望添加(视频)流时,他调用 RtcPeerConnection.addStream() 并且需要进行(重新)协商(参见 negotiationneeded 事件)。这将允许 Bob 在他希望的任何时间添加不同的(附加视频)或附加流。您只需要确保在 offer/answer 上将被正确交换(例如在 negotiationneeded 事件中)。

我写了一个(基于 dart 的)webrtc 库,可以帮助您了解它是如何工作的。参见 Sender and Receiver

所以关键在于要约的创建。

参考规范

WebRTC 1.0 specification 说:

4.2.5 Offer/Answer Options

These dictionaries describe the options that can be used to control the offer/answer creation process.

dictionary RTCOfferOptions {
    long    offerToReceiveVideo;
    long    offerToReceiveAudio;
    boolean voiceActivityDetection = true;
    boolean iceRestart = false;
};

以视频为例:

offerToReceiveVideo of type long

In some cases, an RTCPeerConnection may wish to receive video but not send any video. The RTCPeerConnection needs to know if it should signal to the remote side whether it wishes to receive video or not. This option allows an application to indicate its preferences for the number of video streams to receive when creating an offer.

解决方案

RTCPeerConnection.createOffer()可以将MediaConstraints作为可选的第三个参数。

我找到的示例来自 WebRTC for Beginners 文章:

Creating Offer SDP

peerConnection.createOffer(function (sessionDescription) {
    peerConnection.setLocalDescription(sessionDescription);

    // POST-Offer-SDP-For-Other-Peer(sessionDescription.sdp, sessionDescription.type);

}, function(error) {
    alert(error);
}, { 'mandatory': { 'OfferToReceiveAudio': true, 'OfferToReceiveVideo': true } });

这些 MediaContraints 也可以与 createAnswer() 一起使用。