WebRTC候选信息末尾的数据是什么?



我设置了一个基本的视频聊天应用程序,使用Chrome浏览器的WebRTC api以及我自己根据W3C规范和其他问题编写的WebSocket脚本。

有时候,当一台PC通过WebSocket连接向另一台PC发送ICE候选信息时,一堆乱码文本附加到json字符串化的候选信息的末尾。这个问题只会偶尔发生,而通过createOffer和createAnswer方法发送的SDP信息永远不会发生。

请参阅下面的链接,以获得我所说的示例:http://s1290.beta.photobucket.com/user/HartleySan83/media/NGdata_zps0a7203e7.png.html?sort=3& o = 0

因为json字符串化的候选信息总是以'}}'结尾,通过向WebSocket服务器脚本添加if条件,我能够规避这个问题并使视频聊天应用程序工作。不幸的是,这是一个黑客,我想避免。另外,我想知道为什么会发生这种情况。

值得注意的是,在将候选信息发送到WebSocket服务器脚本之前,当我向客户端的控制台发出警报或回显候选信息时,没有任何额外的乱码文本存在,所以我不确定为什么它与候选信息一起出现在服务器端,只是有时。

以下是客户端代码的代码片段,其中候选信息被发送到服务器端脚本:

function startPeerConnection() {
  navigator.webkitGetUserMedia({ audio: true, video: true }, function (stream) {
    document.getElementById('vid1').src = webkitURL.createObjectURL(stream);
    pc = new webkitRTCPeerConnection(null);
    pc.onicecandidate = function (evt) {
      if (evt.candidate) {
        socket.send(JSON.stringify({ candidate: evt.candidate }));
      }
    };
    pc.onaddstream = function (evt) {
      document.getElementById('vid2').src = webkitURL.createObjectURL(evt.stream);
    };
    pc.addStream(stream);
  }, function () {});
}

下面是服务器端代码,用来揭开接收到的WebSocket数据的掩码:

$len = ord($buffer[1]) & 127;
if ($len === 126) {
  $masks_start = 4;
} else if ($len === 127) {
  $masks_start = 10;
} else {
  $masks_start = 2;
}
$masks = substr($buffer, $masks_start, 4);
$data = substr($buffer, $masks_start + 4);
$len = strlen($data);
$text = '';
for ($i = 0; $i < $len; $i++) {
  $text .= $data[$i] ^ $masks[$i % 4];
}
if (($end = strpos($text, '}}')) !== false) {
// This if condition eliminates the garbled text.
// Without it, a "Could not decode a text frame as UTF-8"
// error is output to the Chrome console.
  $text = substr($text, 0, $end + 2);
  $len = strlen($text);
}
if ($len <= 125) {
  $header = pack('C*', 129, $len);
} else if (($len > 125) && ($len < 65536)) {
  $header = pack('C*', 129, 126, ($len >> 8) & 255, $len & 255);
} else if ($len >= 65536) {
  $header = pack('C*', 129, 127, ($len >> 56) & 255, ($len >> 48) & 255, ($len >> 40) & 255, ($len >> 32) & 255, ($len >> 24) & 255, ($len >> 16) & 255, ($len >> 8) & 255, $len & 255);
}
$server_response = $header . $text;
foreach ($users as $user) {
  if ($user !== $users[$user_idx]) {
    @socket_write($user['socket'], $server_response, strlen($server_response));
  }
}

我在网上到处寻找有同样问题的人,但我找不到任何人或任何东西在规格中谈论这个,所以我想这是我的代码有问题。

如果有人能就问题的根源提供指导,我将不胜感激。谢谢你。

好了,我终于找到问题了。我的服务器端WebSocket代码确实是错误的。问题是我错误地计算了长度。不幸的是,我依赖于我在PHP中找到的一些关于WebSockets的页面,事实证明,该页面的代码中有许多错误,我慢慢地开始意识到越来越多。无论如何,下面是计算从客户机发送到服务器的消息长度的正确方法:

$len = ord($buffer[1]) & 127; // This is the default payload length.
if ($len === 126) { // If 126, then need to use the payload length at the 3rd and 4th bytes.
  $masks_start = 4;
  $len = (ord($buffer[2]) << 8) + ord($buffer[3]);
} else if ($len === 127) { // If 127, then need to use the next 8 bytes to calculate the length.
  $masks_start = 10;
  $len = (ord($buffer[2]) << 56) + (ord($buffer[3]) << 48) + (ord($buffer[4]) << 40) + (ord($buffer[5]) << 32) + (ord($buffer[6]) << 24) + (ord($buffer[7]) << 16) + (ord($buffer[8]) << 8) + ord($buffer[9]);
} else { // Otherwise, the default payload length is correct.
  $masks_start = 2;
}

这样做之后,一切都很好。好吧,我还没有弄清楚如何正确关闭WebSocket连接,但除此之外,WebRTC视频工作得很好。

是否在发送到Websocket服务器之前由client1 添加了乱码二进制数据?或者您只是在websocket服务器处理完它之后才在client2上看到它?我问这个问题是因为我遇到了一个类似的问题,我的信令服务器(在这种情况下是SignalR)有一个错误,损坏了我在PeerConnections之间发送的SDP。

相关内容

  • 没有找到相关文章

最新更新