【问题标题】:How to get multiple streams from WebRTC PeerConnection如何从 WebRTC PeerConnection 获取多个流
【发布时间】:2021-02-17 14:27:08
【问题描述】:

根据RTCPeerConnection.ontrack 文档,“ontrack”事件假设为每个传入流触发。我有一个带有两个视频流的 PeerConnection,连接后,“ontrack”会触发两次(到这里一切正常)。但是两次它都发送相同的流,所以我最终得到了两个相同的视频,我确定发送者正在发送两个不同的流,它们的尺寸和帧速率不同,我可以在 chrome://webrtc-internals/ 中清楚地看到2 个视频流具有不同的帧大小/速率。

这是PeerConnection ontrack 代码:

        this.peerConnection.ontrack = function(evt) {
            console.log("PeerConnection OnTrack event: ", evt.streams);
            that.emit('onRemoteStreamAdded', evt.streams);
        };

我不认为evt.streams 有1 个对象,所以我没有写evt.streams[0]

这是 Chrome 控制台日志:

从日志中可以明显看出getRemoteStreams() 只返回一个对象。 ontrack 只有一个流时怎么可能触发两次,为什么第二个 RTCRtpTransceiver 不创建新流?

【问题讨论】:

    标签: webrtc


    【解决方案1】:

    在使用不同的浏览器和阅读文档数小时后,我解决了这个问题!

    问题从MediaStream.id 开始,它假设是唯一的,但HTML5 中的<video> 元素只监听每个流中的第一个音轨。 PeerConnection 将新的收发器(作为 MediaStreamTrack)添加到同一个 MediaStream,因此无论ontrack 处理程序触发多少次,您都会得到完全相同的MediaStream 对象,但每次您在RTCTrackEvent 中都有新的唯一MediaStreamTrack

    解决方案是在ontrack 处理程序中为每个新的MediaStreamTrack 创建新的MediaStream 对象。

    this.peerConnection.ontrack = function(event) {
        that.emit('onRemoteStreamAdded', new MediaStream([event.track]));
    };
    

    或者,更像是标准示例:

    pc.ontrack = function(event) {
      document.getElementById("received_video").srcObject = new MediaStream([event.track]);
    };
    

    【讨论】:

      【解决方案2】:

      您会得到两个 轨道,它们是单个流的一部分。可以看到在 event.track 属性中,一个应该是音频,另一个应该是视频。

      请参阅https://blog.mozilla.org/webrtc/the-evolution-of-webrtc/,了解有关流和轨道如何工作的背景信息。

      【讨论】:

      • 感谢您不阅读我的问题!首先,我没有两个流,我有超过 5 个。其次,它们都是没有音轨的视频,请参阅我的问题。第三,这不是 WebRTC 错误,它是部分 HTML
      • 您是否在连接的另一端调用addTrack(track) 而不是addTrack(track, stream)?这将解释这种行为,因为在这种情况下,所有内容都将进入接收器上的一个包罗万象的 MediaStream。这通常被认为不是一个好主意。
      猜你喜欢
      • 2014-11-11
      • 1970-01-01
      • 2014-01-27
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多