现在我正在制作 webrtc 信号服务器,使用 SIP。
我有大问题。如何从远程SIP客户端获取流和ICE候选?
在webrtc客户端,调用getusermedia -> peerconnection -> createoffer -> receive stream
和 webrtc 客户端发送 session 描述 (SDP) 给信号服务器。
信号服务器创建 SIP Invite 消息,使用 webrtc 客户端 session 描述(SDP)
信号服务器与 SIP 客户端(如 jitsi)通信 SIP 消息
webrtc 客户端需要接收 ICE 候选和 STREAM。如何获得?
我可以从远程 SDP 消息中创建 ICE 候选和流吗?
SDP 是 SIP 和 WebRTC 使用的自己的协议(protocol)。您可以在 SDP 交换中发送大量信息。
SIP 绝对可以通过 SDP 发送连接信息。你必须确保连接信息在 SIP 端是正确的(让它与 STUN/TURN 服务器协商),一旦它有好的信息,你可以简单地用该信息编写 SDP 并发送它。
至于媒体,您必须处理双方之间的 DTLS-SRTP key 交换过程,以便双方都可以对 SRTP 媒体进行加密/解密(双方都有主 key )。
一旦您在双方都拥有主 key 、您的连接信息(ips/端口)和您的媒体(相同的编解码器),那么您可以简单地流式传输通过 ips/端口商定的编解码器进行了协商。
当您的 SIP 客户端与 ICE 服务器通信时,您可以创建自己的 Ice Trickling 并创建 Ice 候选对象,并将其简单地发送到另一端,但等待所有 ICE 协商完成后再尝试协商可能会更容易连接本身。您必须弄清楚 SIP 端的协商何时完成,但 RTCPeerConnection 已为此 already 准备好信号。
您可能想查看 sipML5 。您将不得不做一些与他们正在做的事情类似的事情,以使所有这些事件部件正常工作。
TL;DR 注释:
- 你独立地与双方的 ICE(stun 或 turn)服务器进行协商,从中获取良好的连接信息,并将其写入 SDP(你可以在 SIP 端解析 ICE 候选以获得良好的连接,并写信给 SDP,所有候选人都聚集在 SIP 端)
- 注意 RTP/RTCP 多路复用。确保您的媒体端可以解复用这些数据包(如果与 chrome 通信)。
- 你应该阅读 DTLS-SRTP Linky Linky2 Linky3
- 阅读 SDP
编辑:有网关宣称它已经可以做到这一点。 Janus-Gateway 也可能是了解如何执行此操作的好资源。 SIP 插件似乎能够与 SIP 设备通信。恕我直言,这个源代码比 SIPML5 的更容易理解