Webrt c соединяет пиров по функции вызова - PullRequest
0 голосов
/ 28 февраля 2020

Я знаю, что это пробалий - это длинный снимок, но я надеялся, что кто-то укажет мне правильное направление здесь.

Я сделал простое одноранговое видео соединение и обернул его внутри функции , так что я могу позвонить по нажатию кнопки, но он не работает. Когда он не заключен в функцию «activVideoStream», а просто загружается, он работает нормально. У меня такое ощущение, что проблема связана с функцией asyn c, но я не могу обернуться вокруг нее.

Вот код:

let isAlreadyCalling = false;
const remoteVideo = document.getElementById("remote-video");
const {
    RTCPeerConnection,
    RTCSessionDescription
} = window;
let peerConnection;

function activateVideoStream() {
    const configuration = {
        "iceServers": [{
            "urls": "stun:stun.l.google.com:19302"
        }]
    };

    console.log("Activate Video Stream");
    peerConnection = new RTCPeerConnection(configuration);

    navigator.getUserMedia({
            video: true,
            audio: true
        },
        stream => {
            const localVideo = document.getElementById("local-video");
            if (localVideo) {
                localVideo.srcObject = stream;
            }
            stream.getTracks().forEach(track => peerConnection.addTrack(track, stream));
        },
        error => {
            console.warn(error.message);
        }
    );

    peerConnection.ontrack = function ({
        streams: [stream]
    }) {
        if (remoteVideo) {
            remoteVideo.srcObject = stream;
        }
    };
}

async function callUser(socketId) {
    console.log("Call User");
    remoteVideo.style.display = "block";

    const offer = await peerConnection.createOffer();
    await peerConnection.setLocalDescription(new RTCSessionDescription(offer));

    socket.emit("callUser", {
        offer,
        to: socketId
    });
}

socket.on("callMade", async data => {
    console.log("Call made");
    await peerConnection.setRemoteDescription(
        new RTCSessionDescription(data.offer)
    );
    const answer = await peerConnection.createAnswer();
    await peerConnection.setLocalDescription(new RTCSessionDescription(answer));

    remoteVideo.style.display = "block";

    socket.emit("makeAnswer", {
        answer,
        to: data.socket
    });
});

socket.on("answerMade", async data => {
    console.log("Answer made");
    await peerConnection.setRemoteDescription(
        new RTCSessionDescription(data.answer)
    );

    if (!isAlreadyCalling) {
        callUser(data.socket);
        isAlreadyCalling = true;
    }
});

Я заметил, что "peerConnection.connectionState" внутри "callUser" устанавливается в "new", но без функции, обернутой вокруг, в "complete" так что это, вероятно, проблема.

...