代码之家  ›  专栏  ›  技术社区  ›  B''H Bi'ezras -- Boruch Hashem

rtcpeerconnection跟踪事件有时返回空流

  •  0
  • B''H Bi'ezras -- Boruch Hashem  · 技术社区  · 6 年前

    建立一个第一次成功的RTC连接的最佳方法是什么?

    addIceCandidate 在之前或之后被呼叫 createAnswer

    <body>
        <style>
            video {
                width: 300px
            }
        </style>
        <button id="s">start</button>
        <button id=c>Call</button><br>
    <video id="L" autoplay muted></video>
    <video id=R autoplay></video>
    <video id=R2 autoplay></video>
    <video id=R3 autoplay></video>
    <script>
    var ls, p, p2, bpl, bpr, con = {
     //   sdpSemantics: "default"
    }, deets = {
        offerToReceiveAudio: 1,
        offerToReceiveVideo: 1
    }
    
    function g() {
        navigator.
        mediaDevices.getDisplayMedia().then(s => {
            ls = L.srcObject = s;
    
        })
    }
    s.onclick = e => {
        g()
    };
    
    function wow(data={}) {
        let local  = new RTCPeerConnection(con),
            remote = new RTCPeerConnection(con);
    
        local .addEventListener("icecandidate", e => oic(remote, e));
        remote.addEventListener("icecandidate", e => oic(local , e));
    
        remote.addEventListener("track", e => grs(data.video, e));
    
        data
            .localStream
            .getTracks()
            .forEach(t => {
                local.addTrack(t, data.localStream);
            });
    
        local.createOffer(deets).then(offer => {
            local .setLocalDescription(offer);
            remote.setRemoteDescription(offer);
    
            remote.createAnswer().then(answer => {
                remote.setLocalDescription(answer);
                local .setRemoteDescription(answer);
            })
        });
    }
    
    c.onclick = e => {
        let localStream = ls;
        wow({
            video: R,
            localStream
        });
    
        wow({
            video: R2,
            localStream
        });
    
        wow({
            video: R3,
            localStream
        });
    
    };
    
    function grs(vid,e) { 
        if(vid.srcObject !== e.streams[0]) {
            vid.srcObject = e.streams[0];
        }
    }
    
    function oic(pc, e) {
        let other = pc;
        if(e.candidate)
            other
            .addIceCandidate(e.candidate)
    }
    </script>
    </video>
    </body>
    

    请注意,有时视频流进来晚了,而且是空的。

    0 回复  |  直到 6 年前
        1
  •  2
  •   ssskip    6 年前

    我以前在使用peerconnectionapi时也遇到过同样的问题,问题是统一计划SDP格式,也许值得一读。

        2
  •  0
  •   Travnikov.dev    6 年前

    拜托 look again at documentation . 一开始,您使用的是异步函数,所以它在当时无法解析,然后您调用它(例如,用户不响应提示或浏览器根本拒绝它)。第二,不处理错误,在代码中添加catch()块,浏览器将自动回答您的问题

    推荐文章