RTC对等连接 - 接收流两次

时间:2017-07-30 21:12:53

标签: javascript webrtc

我有一个RTCPeerConnection的实例,ontrack已定义:

 newConnection.ontrack = receivedStream // remote

SDP交换完成后,对等体添加其本地流:

 connection.addStream(stream); // local

我看到每个流调用receivedStream两次 - 检查e.track向我显示第一次调用是audio曲目,第二次是video曲目。

奇怪的是,检查e.streams[0]并在此处调用getTracks会给我两个MediaStreamTracks - 一个用于音频,另一个用于视频:

enter image description here

所以尽管只调用了MediaStreamTracks一次,但我在receivedStream两次调用中净 addStream

receivedStream在这里:

 function receivedStream(e) {
        var stream = e.streams[0]; // this gets invoked twice when adding one stream!
        if (!stream) {
            throw new Error("no stream found");
        };
        // this gets me the corresponding connection
        waitForStream(stream.id).then(function (connection) {
            // get element
            targetVideoElement[0].srcObject = stream; // this now gets called twice per stream - once for audio, once for video
        }).catch(function (error) {
           // log
        });
    }

3 个答案:

答案 0 :(得分:1)

您可以为每个MediaStreamTrack执行相同的过程,即将MediaStreamTrack添加到MediaStream个实例,然后设置.srcObject的{​​{1}}

HTMLMediaElement

答案 1 :(得分:1)

可能您在远程对等点中添加了不止一首曲目,如下所示:

localStream.getTracks().forEach(track => peer.addTrack(track, localStream));

远程 Peer 中对 peer.addTrack( ) 的每次调用都会在本地 peer.ontrack = () 中产生和事件

答案 2 :(得分:1)

track 事件为每个 MediaStreamTrack 触发一次。因此,如果 MediaStream 中有两个不同的轨道,例如音频和视频,则 ontrack 事件将触发两次。两个事件的事件的 stream 属性将相同,您可以将流附加到同一个音频或视频元素两次而不会产生任何后果。