簡體   English   中英

WebRTC Peer ontrack 調用但視頻不播放

[英]WebRTC Peer ontrack called but video not playing

我有遠程對等方,它將視頻發送到本地對等方。 我在哪里使用我自己的信令服務器。

流量就像,

  1. 遠程對等點通過信令服務器向本地對等點發送報價。

  2. 本地對等點接受提議並創建答案,然后通過信令服務器將其發送給遠程對等點。

  3. 遠程對等點接受答案並開始發送視頻,點對點。

    我在本地同行的 createAnswer 部分遇到了一些問題。 如果我通過單擊按鈕手動將答案發送給遠程對等方,則視頻播放正常。 但是從pc.onicecandidate內部發送答案是行不通的。

下面是代碼

 var answer;
 async function createAnswer(offer) {
   
   if (pc.signalingState != "stable") return;
   await pc.setRemoteDescription({type: "offer", sdp: offer});
   await pc.setLocalDescription(await pc.createAnswer());
   pc.onicecandidate = ({candidate}) => {
     if (candidate) return;
      answer = pc.localDescription.sdp;
      sendAnswerToSignalingServer({ peer_type: "web",remote_peer: "RPi_Dev", type: "answer",  name: userLoggedIn, sdp:answer }); 

   };
 }

使用上面的代碼,除了播放視頻,甚至是事件之外,一切都有效

pc.ontrack = function (event) {
  remoteVideo.srcObject =event.streams[0];
  //alert('new stream added! ' + event.streams[0]);
}

被叫,但視頻沒有播放。

但是,如果我在上面評論sendAnswerToSignalingServer並通過按鈕單擊發送答案,那么一切正常,

function sendSignalButtonClick(){
   sendAnswerToSignalingServer({ peer_type: "web",remote_peer: "RPi_Dev", type: "answer",  name: userLoggedIn, sdp:answer }); 
}

我認為 createAnswer 部分存在一些編碼問題。

我指的是帶有手動信令的 WebRTC 數據通道的代碼,請舉例? .

誰能幫我解決這個問題。

編輯:完整代碼

var userLoggedIn = "userWeb";
const config = {iceServers: [{urls: "stun:stun.l.google.com:19302"}]};
const pc = new RTCPeerConnection(config);

const dc = pc.createDataChannel("chat", {negotiated: true, id: 0});


pc.ontrack = function (event) {
  remoteVideo.srcObject = event.streams[0];

}

 
 var SDP;
 async function createAnswer(offer) {
   
   if (pc.signalingState != "stable") return;
   await pc.setRemoteDescription({type: "offer", sdp: offer});
   const answer = await pc.createAnswer();
   await pc.setLocalDescription(answer);
    pc.onicecandidate = async ({candidate}) => {
    if (candidate) return;
       SDP = await pc.localDescription.sdp;
       sendToWebSocket({ peer_type: "web",remote_peer: "RPi_Dev", type: "answer",  name: userLoggedIn, sdp:SDP }); 
     
   };
 

 }

async function sendSignalButtonClick() {
   SDP = await pc.localDescription.sdp;
   sendToWebSocket({ peer_type: "web",remote_peer: "RPi_Dev", type: "answer",  name: userLoggedIn, sdp:SDP }); 
}
 

function SendMessage(message) {
   dc.send(message);

 };


//********************************Signaling server part***************************/

var webSockConn = new WebSocket('wss://220.168.551.150:7000');

webSockConn.onopen = function () { 
    console.log("Connected to the signaling server"); 
    sendToWebSocket({ peer_type: "web",remote_peer: "RPi_Dev", type: "login",  name: userLoggedIn }); 
};


//when we got a message from a signaling server 
webSockConn.onmessage = function (msg) { 
   console.log("Got message", msg.data);
    
   var data = JSON.parse(msg.data);
    
   switch(data.type) { 
      case "offer": 
     console.log(data);
         createAnswer(data.offer, data.name); 
         break; 
      case "leave": 
         handleLeave(); 
         break; 
      default: 
         break; 
   } 
};
  
webSockConn.onerror = function (err) { 
   console.log("webSockConn----Got error", err); 
};

function handleLeave(){

   console.log("Leaving ......................"); 
}
  
//alias for sending JSON encoded messages 
function sendToWebSocket(message) { 
   //attach the other peer username to our messages 
   if (userLoggedIn) { 
      message.name = userLoggedIn; 
   } 
    
   webSockConn.send(JSON.stringify(message)); 
};



/*********************************************************************************/

嘗試使用 await 創建答案:

answer = await pc.localDescription.sdp;

要將 function 更改為異步:

pc.onicecandidate = async ({candidate}) => {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM