【问题标题】:How to get both audio and video sent over WebRTC tracks?如何通过 WebRTC 轨道同时发送音频和视频?
【发布时间】:2020-03-18 16:37:48
【问题描述】:

我现在正在制作一个 WebRTC 网站并处理一对多视频连接。在发现addStream() 已弃用后,我切换到addTrack()。但是,无论我使用哪一个,都只会发送音频,而不是视频。最初我认为这是因为我在没有 https 的本地主机上,但即使我在节点服务器上运行它,也会发生同样的事情。解决方案将不胜感激。

托管代码 (host.js)

    document.addEventListener("DOMContentLoaded", () => {
    uuid = createUUID();

    localVideo = document.getElementById('localVideo');

    serverConnection = new WebSocket('wss://' + window.location.hostname + ':443');

    console.log("Opened WS on :443")

    serverConnection.onmessage = gotMessageFromServer;

    var constraints = {
        video: true,
        audio: true,
    };

    if (navigator.mediaDevices.getUserMedia) {
        navigator.mediaDevices.getUserMedia(constraints).then(getUserMediaSuccess).catch(errorHandler);
    } else {
        alert('Your browser does not support getUserMedia API');
    }

    document.getElementById("start").addEventListener("click", (e) => {
        start(uuid)
    });
});

function getUserMediaSuccess(stream) {
    localStream = stream;
    localVideo.srcObject = stream;
}

function start(uid) {
    peerConnections[uid] = new RTCPeerConnection(peerConnectionConfig);
    peerConnections[uid].onicecandidate = gotIceCandidate;

    for (const track of localStream.getTracks()) {
        peerConnections[uid].addTrack(track, localStream);
      }
}

查看器代码 (client.js)

function pageReady() {
    uuid = createUUID();

    remoteVideo = document.getElementById('remoteVideo');
    remoteVideo.srcObject = remoteStream;
    remoteVideo.play();

    serverConnection = new WebSocket('wss://' + window.location.hostname + ':443');
    serverConnection.onmessage = gotMessageFromServer;

    var constraints = {
        video: false,
        audio: true,
    };

    if (navigator.mediaDevices.getUserMedia) {
        navigator.mediaDevices.getUserMedia(constraints).then(getUserMediaSuccess).catch(errorHandler);
    } else {
        alert('Your browser does not support getUserMedia API');
    }

}

function getUserMediaSuccess(stream) {
    localStream = stream;

}

function start(isCaller) {
    console.log("pressed Start")
    peerConnection = new RTCPeerConnection(peerConnectionConfig);
    console.log("new RTCconnection")
    peerConnection.onicecandidate = gotIceCandidate;
    peerConnection.ontrack = gotRemoteStream;
    peerConnection.addTrack(localStream.getTracks()[0]);
    peerConnection.createOffer().then((desc) => {
        createdDescription(desc);
    }).catch(errorHandler);
}

function gotRemoteStream(e) {
    console.log('got remote stream');
    if (e.streams && e.streams[0]) {
        remoteVideo.srcObject = e.streams[0];
      } else {
        if (!inboundStream) {
          inboundStream = new MediaStream();
          remoteVideo.srcObject = inboundStream;
        }
        inboundStream.addTrack(e.track);
      }
}

附:我只从查看器端发送音频,因为它是单向呼叫,但查看器必须发起呼叫。我的问题是从主机端获取音频和视频到查看器端。

附言您可能需要更多代码,以便您自己运行它,所以 repo 是here。 在 /host 上打开一个客户端,在 /class 上打开另一个客户端。确保你去https://localhost 否则它不会工作。

【问题讨论】:

    标签: javascript node.js webrtc getusermedia mediastream


    【解决方案1】:

    在 client.js 文件中添加这一行 peerConnection.addTransceiver("视频");在 addtrack 调用之后。

    function start(isCaller) {
        console.log("pressed Start")
        peerConnection = new RTCPeerConnection(peerConnectionConfig);
        console.log("new RTCconnection")
        peerConnection.onicecandidate = gotIceCandidate;
        peerConnection.ontrack = gotRemoteStream;
        peerConnection.addTrack(localStream.getTracks()[0]);
        peerConnection.addTransceiver("video"); // The line to be added
        peerConnection.createOffer().then((desc) => {
            createdDescription(desc);
        }).catch(errorHandler);
    }
    

    【讨论】:

    • 你先生,是个传奇。这到底是做什么的?
    • createoffer 根据您添加到 pc 的流生成 SDP,如果它只是音频,则 m 行视频将丢失。如果你 addTransceiver 它代表一个双向流并假设视频也可以存在。
    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 2014-10-16
    • 2020-11-09
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多