没有 nodejs 的共享主机 ( SSH ) 上的 WebRTC,最好在 php

WebRTC on shared hosting ( SSH ) without nodejs, preferrably in php

所以我一直在寻找一种将 webRTC 集成到我正在制作的网站中的方法,但我想在共享主机上进行。我遇到了 nielsbaloe this repo on GitHub,它对建立基本连接有很大帮助。

我认为这是负责添加对等节点的代码:(index.html 在 repo 行)

function icecandidate(localStream) {
        pc = new RTCPeerConnection(configuration);
        pc.onicecandidate = function (event) {
            if (event.candidate) {
                publish('client-candidate', event.candidate);
            }
        };
        try {
            pc.addStream(localStream);
        }catch(e){
            var tracks = localStream.getTracks();
            for(var i=0;i<tracks.length;i++){
                pc.addTrack(tracks[i], localStream);
            }
        }
        pc.ontrack = function (e) {
            document.getElementById('remoteVideo').style.display="block";
            document.getElementById('localVideo').style.display="none";
            remoteVideo.srcObject = e.streams[0];
        };
    }

现在,我面临的难题是添加房间功能,以及可能同时存在两个以上并发对等点的能力。我做了一些实验,但徒劳无功。我知道对于房间功能,id 必须在 php 中进行修补,所以至少 id 想弄清楚如何使超过 1 个对等点成为可能。

据我所知,没有办法 re-use 多个点的相同 RTCPeerConnection,所以你必须做与 1-on-1 相同的事情,但在每个点之间一组。

就信号而言,它非常简单,有点像这样:

客户端A -> [报价] -> 服务器 -> [报价] -> 客户端B -> [答案] -> 服务器 -> [答案] -> 客户端A

A nicer explanation at MDN

不一定需要 NodeJS 或 WebSocket。大多数人选择它的原因是因为此链(服务器 -> 客户端 A)中的最后一个 link 需要 server-initiated 连接。但这可以用替代技术代替,例如(长)轮询。或者,在 PHP 的情况下,您可以使用 websocket 实现,例如 Bloatless or Aerys

要实现房间功能,您必须实现以下内容:

变体 A(使用轮询):

  • 用于投放报价的端点,例如POST/房间/{id}

  • 定期检查新报价的端点,例如GET /rooms/{id}

变体 B(带有 websockets)

  • 创建广播室,例如,通过动态创建 HTTP 端点和 websocket 服务器实例。或者通过拥有一个 websocket 实例,但在建立连接后发送您打算加入的任何房间。从那里开始,只需向正确的用户发送正确的报价和答案即可。

在这两种情况下,您可能想要提前创建多个优惠以从服务器集中使用,或者动态创建新优惠,但最重要的是,请确保您没有两次连接相同的对等点,否则你最终会遇到一个循环。为防止这种情况,只需为每个用户提供一个随机生成的字符串来识别他们自己并将其发送到报价中。

如果您不想走这条路,可以使用交钥匙解决方案,但要小心并检查您是否可以将自己的 TURN 服务器与它们一起使用。我注意到的一个普遍趋势是,有很多 WebRTC 解决方案提供商在那里以其简单性吸引您,但随后将您锁定在他们自己的 TURN 服务器上,您以后可能不得不为此支付相当高的费用。