简体   繁体   English

WebRTC Peer ontrack 调用但视频不播放

[英]WebRTC Peer ontrack called but video not playing

I have remote peer which send video to local peer.我有远程对等方,它将视频发送到本地对等方。 Where I am using my own signalling server.我在哪里使用我自己的信令服务器。

The flow is like,流量就像,

  1. Remote peer send offer to local peer through signalling server.远程对等点通过信令服务器向本地对等点发送报价。

  2. Local peer accept offer and create answer, then send it to remote peer through signalling server.本地对等点接受提议并创建答案,然后通过信令服务器将其发送给远程对等点。

  3. Remote peer accept answer and start sending video, peer to peer.远程对等点接受答案并开始发送视频,点对点。

    I am having some issue in createAnswer section at local peer.我在本地同行的 createAnswer 部分遇到了一些问题。 If I manually send the answer to remote peer by clicking a button then the video play fine.如果我通过单击按钮手动将答案发送给远程对等方,则视频播放正常。 But of send the answer from inside pc.onicecandidate it doesn't work.但是从pc.onicecandidate内部发送答案是行不通的。

Below is the code下面是代码

 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 }); 

   };
 }

Using above code every thing works except playing video, even the event使用上面的代码,除了播放视频,甚至是事件之外,一切都有效

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

get called but the video not playing.被叫,但视频没有播放。

But if I comment sendAnswerToSignalingServer above and send the answer through button click then everything works fine,但是,如果我在上面评论sendAnswerToSignalingServer并通过按钮单击发送答案,那么一切正常,

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

I think some coding problem in createAnswer section.我认为 createAnswer 部分存在一些编码问题。

I am referring the code from here WebRTC datachannel with manual signaling, example please?我指的是带有手动信令的 WebRTC 数据通道的代码,请举例? . .

Can anyone help me to resolve the problem.谁能帮我解决这个问题。

Edit: full code编辑:完整代码

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)); 
};



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

Try to create the answer with await:尝试使用 await 创建答案:

answer = await pc.localDescription.sdp;

To change the function to async:要将 function 更改为异步:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM