2

我目前正在尝试使用带有 Ajax 的 WebRTC 作为信令方法创建一个简单的视频聊天服务。

根据另一位 Stack Overflow 用户的建议,为了确保我正确理解标准 WebRTC 应用程序的流程,我首先创建了一个简单的 WebRTC 视频聊天服务,在该服务中我将创建的报价或答案以及 ICE 候选人打印到屏幕,然后手动将该信息复制并粘贴到另一个客户端窗口的文本区域中以处理所有内容。这样做后,我能够成功地弹出两个视频。

在让它正常工作后,我决定尝试使用 Ajax 作为信号方法。但是,我现在似乎无法让它工作。

在我当前的实现中,每次创建 offer/answer 或 ICE 候选信息时,我都会立即创建一个新的 Ajax 对象,用于将该信息(在对其执行 JSON.stringify 方法之后)添加到 DB 表中。两个客户端都在不断地轮询该数据库表,从另一个客户端搜索新信息。

我一直在向控制台回显很多信息,据我所知,一个有效的报价总是从一个客户发送到另一个客户,但在收到该报价后,成功将其设置为远程描述,并创建一个答案,我为设置“应答者”的本地描述所做的任何尝试都失败了。

是否有任何特殊原因导致这种情况发生?这是我的代码片段:

var i,
  len;

for (i = 0, len = responseData.length; i < len; i += 1) {

  message = JSON.parse(responseData[i]);

  if (message.type === 'offer') {

    makeAnswer(message);

  }

  // Code omitted,

}

...

makeAnswer = function (offer) {

  pc.setRemoteDescription(new RTCSessionDescription(offer), function () {

    pc.createAnswer(function (desc) {

      // An answer is always properly generated here.

      pc.setLocalDescription(desc, function () {

        // This success callback function is never executed.

        setPayload(JSON.stringify(pc.localDescription));

      }, function () {

        // I always end up here.

      });

    });

  });

};

本质上,我会遍历从数据库中检索到的所有数据(有时会同时收集一个报价和大量候选信息),如果消息的类型属性是“报价”,我调用 makeAnswer 函数,并且从那里,我将远程描述设置为收到的报价,创建一个答案,并尝试将答案设置为本地描述,但在最后一步总是失败。

如果有人可以就为什么会发生这种情况提供任何建议,我将不胜感激。
非常感谢。

4

1 回答 1

1

好吧,我发现了问题所在。事实证明,在通过 Ajax 将 SDP 和 ICE 信息发送到 PHP 脚本之前,我没有对其进行编码。结果,SDP/ICE 信息中的任何加号 (+) 都被转换为空格,从而导致本地和远程客户端之间的字符串不同并且无法正常工作。

我一直在 Ajax 的 GET 请求中使用 encodeURIComponent,但我从来不知道您也必须在 POST 请求中使用该函数。很高兴知道。

无论如何,在我开始对发布的数据使用 encodeURIComponent 函数之后,然后稍微修正了我的逻辑,以便在设置本地和远程描述之前永远不会设置 ICE 候选者,它每次都开始像魅力一样工作。

这就是好消息。坏消息是我的本地主机上一切正常,但是一旦我将完全相同的代码移植到我的网络托管服务器上,即使控制台报告报价/答案和 ICE 信息都正确接收并设置,远程视频没有弹出。

叹。在我完成这件事之前,还要跨越一个障碍。

无论如何,只是为了让大家知道,关键是在将SDP/ICE信息发送到服务器端脚本之前使用encodeURIComponent,以便另一端接收到的字符串完全相同。

于 2013-06-21T14:29:06.893 回答