Peerjs call.on “stream” 事件未触发,但 peer.on “call” 事件会触发

Peerjs call.on "stream" event isn't firing but peer.on "call" is

提问人:Ivan Griga 提问时间:11/19/2022 最后编辑:Ivan Griga 更新时间:11/20/2022 访问量:567

问:

我正在尝试创建一个用于语音聊天的 node+socket.io+express+peerjs 应用程序。

我面临的问题是我无法访问连接的对等体的流,因为由于某种原因没有触发。我试图操纵这些事件,但我仍然无法让它工作。它没有给我任何错误。我是peerjs的新手,所以非常感谢任何帮助,我已经花了无数个小时试图解决这个问题。call.on("stream").on

客户端调用创建和连接:

if(peerid!=-1 && peer){
    if(!window.localStream){
        window.localStream=new MediaStream();
    }
    
    //peer.listAllPeers((peers) => {
    //    console.log(peers);
    //});
    peerConn = peer.connect(peerid);

    peerConn.on("open", ()=>{
        // THIS IS FIRING
        call = peer.call(peerid, window.localStream);
        console.log("Connecting to: "+ peerid);

        call.on("stream", (stream)=>{
            // THIS IS NOT FIRING
            console.log("STEAMING CALLER");
        });

        call.on("error", function (err) {
            console.error(err);
        });
    });
}

客户端应答呼叫:

peer.on('connection', function(connection){
    peerConn=connection;
});

peer.on('call', (incoming) => {
    // THIS IS FIRING
    if(!window.localStream){
        window.localStream=new MediaStream();
    }

    console.log('Answering incoming call from ' + incoming.peer);
    incoming.answer(window.localStream);

    incoming.on("stream", (stream) => {
        // THIS IS NOT FIRING
        console.log("STREAMING CALLEE");
    });

    incoming.on("error", (err) => {
        console.log(err);
    });

});

提前感谢您的帮助!

我试图使用 捕获错误,不会抛出任何错误。我还尝试在不同的函数中插入调用事件,因为我认为这是由于在建立连接之前接听了呼叫,但无济于事。结果总是一样的:开火但不开火。我一辈子都无法弄清楚这种行为。call.on("error").onpeer.on("call")"stream"

更新:经过一番折腾,我找到了一个解决方案,即将调用创建代码更改为以下内容:

peerConn.on("open", ()=>{
    if(microphone&&peerMicrophone){
        setTimeout(function temp() {
            try {
                getLocalStream();

                call = peer.call(peerid, window.localStream);

                call.on("stream", (stream)=>{
                    window.remoteAudio.srcObject = stream;
                    window.remoteAudio.autoplay = true;
                    window.peerStream = stream;

                    addMessage(11);
                    console.log("Connecting asdato: "+ peerid);
                });
    
                call.on("error", function (err) {
                    console.error(err);
                });
            } catch (error) {
                setTimeout(temp, 20);
            }
        }, 10);
    } else {
        addMessage(12);
        peerConn.send("vc_unavailable");
    }
});

我真的不明白为什么我需要在那里添加一个超时,我通过纯粹的反复试验得到了它。有没有更优雅的解决方案来解决这个问题?

JavaScript node.js WebRTC 客户端 PeerJS

评论


答: 暂无答案