【问题标题】:Webrtc: How to negotiate tracks without knowing number ahead of time?Webrtc:如何在不提前知道号码的情况下协商曲目?
【发布时间】:2021-05-18 15:37:48
【问题描述】:

我正在尝试通过 WebRTC 中的单个 RTCPeerConnection 实现多个视频流。我知道这在浏览器中有不同的支持,但在最新的 Chrome 和 Firefox 中一切正常。无论如何,我目前能够通过使用 RTCPeerConnection.addTransceiver() 在发送 SDP 报价之前添加多个视频轨道来使多个视频轨道工作。我的问题是:浏览器可能无法提前知道远程设备上有多少视频频道可用。目前,如果我在浏览器和远程设备上设置相同数量的收发器,一切正常,但如果存在差异,则浏览器在遇到轨道数量与提供的轨道数量不同的 SDP 答案时会引发错误。有没有办法通过 WebRTC 协议进行协商,还是我必须设置某种外部 API 来报告有多少轨道可用?

【问题讨论】:

    标签: webrtc sdp


    【解决方案1】:

    对于 2 个视频轨道,只需使用常规 RTCPeerConnection.addTrack 即可:

    var pc = new RTCPeerConnection()
    
    ...
    
    const webcamStream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
    const screenStream = await navigator.mediaDevices.getDisplayMedia();
    
    webcamStream.getVideoTracks().forEach((track) => pc.addTrack(track));
    screenStream.getVideoTracks().forEach((track) => pc.addTrack(track));
    
    

    使用上述方法,pc.createOffer 生成一个包含 3 m= 字段的 SDP 报价消息; 1 用于音频,2 用于视频。然后在另一端,当我createAnswer 时,它会使用这 3 个媒体生成正确的 SDP 应答消息并建立连接。

    如果你想要更多的轨道,我不确定上面代码的行为是什么,但我相信这将取决于客户端的 webrtc 实现。

    也就是说,我认为解决此问题的最安全方法是包括在您发送报价时通过您的信号服务器传入的视频轨道数量。然后,您只需在收到它时addTransceivers 多次即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-09
      • 2014-03-12
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 2018-05-05
      相关资源
      最近更新 更多