gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 20:01:15 24 4
gpt4 key购买 nike

我使用 Chrome 中的 WebRTC API 以及我根据 W3C 规范和此处关于 SO 的其他问题自行编写的 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));

}

}

我在 Internet 上到处搜索是否有其他人遇到同样的问题,但我在规范中找不到任何人或任何东西讨论这个问题,所以我想我的代码有问题。

任何人都可以提供有关问题根源的任何指导,我们将不胜感激。谢谢。

最佳答案

嗯,终于找到问题所在了。我的服务器端 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 视频运行良好。

关于php - WebRTC 候选人信息末尾的数据是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14425382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com