亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

onaddstream事件未調用

onaddstream事件未調用

神不在的星期二 2021-04-06 17:10:59
我使用WebRTC連接了2個Chrome瀏覽器。我offer在第一個signalR客戶端上創建并將其發送給第二個客戶端,如下所示:function initiate_call() {callerPeerConn = new RTCPeerConnection(peerConnCfg);callerPeerConn.ontrack = function (event) {    console.log('caller recived new stream');    remoteVideo.srcObject = event.streams[0];    console.log(event);}navigator.mediaDevices.getUserMedia({ audio: true, video: true })    .then(function (stream) {        localVideo.srcObject = stream;        for (const track of stream.getTracks()) {            callerPeerConn.addTrack(track, stream);        }        return callerPeerConn.createOffer();    })    .then(    function (offer) {        var off = new RTCSessionDescription(offer);        callerPeerConn.setLocalDescription(            new RTCSessionDescription(off),            function () {                // invite to video chat                console.log('send offer');            },            function (err) {                console.log(err.message);            }        )    });}當我使用第二個瀏覽器時,offer他使用setLocalDescription并嘗試創建,而answer不是像這樣將其發送給呼叫者:function accept_send_answer(){    calleePeerConn = new RTCPeerConnection(peerConnCfg);calleePeerConn.ontrack = function (event) {    console.log('callee accept offer and got streams');    remoteVideo.srcObject = event.streams[0];}calleePeerConn.setRemoteDescription(offer)    .then(function () {        return navigator.mediaDevices.getUserMedia({ audio: true, video: true });    })    .then(function (stream) {        localVideo.srcObject = stream;         for (const track of stream.getTracks()) {            calleePeerConn.addTrack(track, stream);        }        return calleePeerConn.createAnswer();    })    })    .catch(function (err) {        console.log(err.message);    });}
查看完整描述

1 回答

?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

首先,addStream和onaddstream已棄用,在其他瀏覽器中將無法使用。請改用addTrack和ontrack。


第二,時機。


您正在致電peerConn.createOffer(),peerConn.addStream(stream)因此不會接聽曲目。


與peerConn.createAnswer()以前一樣peerConn.addStream(stream)。


最后,混合使用回調和Promise會使這里的順序混亂。嘗試:


const peerConn = new RTCPeerConnection(peerConnCfg);

peerConn.ontrack = function (event) {

  alert('new stream added! ' + event.streams[0]);

}

function initiate_call() {

  navigator.mediaDevices.getUserMedia({audio: true, video: true})

    .then(function (stream) {

      localVideo.srcObject = stream;

      for (const track of stream.getTracks()) {

        peerConn.addTrack(track, stream);

      }

     return peerConn.createOffer();

    })

    .then(function (offer) {

      // signaling and invite

      return peerConn.setLocalDescription(off);

    })

    .catch(function (err) {

      console.log(err.message);

    });

}

function accept_send_answer(offer) {

  peerConn.setRemoteDescription(offer)

    .then(function () {

      return navigator.mediaDevices.getUserMedia({audio: true, video: true});

    })

    .then(function (stream) {

      video.srcObject = stream;

      for (const track of stream.getTracks()) {

        peerConn.addTrack(track, stream);

      }

      return peerConn.createAnswer();

    })

    .then(function (answer) {

      //signaling to caller and send answer

      return peerConn.setLocalDescription(answer);

    })

    .catch(function (err) {

      console.log(err.message);

    });

}

請注意,您的代碼(和我的回復)仍然缺少關鍵的內容:候選者交換,并且您沒有顯示setRemoteDescription(answer)代碼來完成協商循環。


請注意,大多數示例都傾向于在兩側使用相同的JS,例如使用iframe postMessage進行信號傳遞的這種工作方式。


查看完整回答
反對 回復 2021-04-08
  • 1 回答
  • 0 關注
  • 836 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號