【问题标题】:WebRTC Peer ontrack called but video not playingWebRTC Peer ontrack 已调用但视频未播放
【发布时间】:2020-05-15 15:06:29
【问题描述】:

我有远程对等方将视频发送到本地对等方。我在哪里使用自己的信令服务器。

流程就像,

  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 datachannel with manual signaling, example please?

谁能帮我解决这个问题。

编辑:完整代码

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



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

【问题讨论】:

    标签: javascript webrtc


    【解决方案1】:

    尝试使用 await 创建答案:

    answer = await pc.localDescription.sdp;
    

    要将函数更改为异步:

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

    【讨论】:

    • 我收到类似Uncaught SyntaxError: await is only valid in async function的错误
    • 您需要将包含函数设置为异步,答案更新。
    • 仍然是同样的行为,我已经确保answer 具有正确的值,并且远程对等方接收到数据并且可以在远程看到一些指示视频发送的日志
    • 可能在添加流后使用remoteVide.play() 或将event.streams[0] 更改为event.stream
    • 我试过了,还是不行。我已经添加了有问题的完整代码。
    猜你喜欢
    • 2020-10-10
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多