Flutter 视频通话应用?
描述
- 这是一个使用 Flutter 和 WebRTC 构建的沙盒视频通话应用程序,您可以实现浏览器到浏览器、手机到手机、浏览器到手机以及反向的通话。
它是如何工作的?
- ? 客户端1 和 客户端2 通过请求向STUN服务器(STUN服务器URL:stun:stun.l.google.com:19302)创建对等连接
- 客户端1 请求STUN服务器创建 offer
- STUN服务器将以“offer”为类型的sdp文本响应给客户端1
- 客户端1 需要复制sdp文本和类型,然后发送给客户端2,之后客户端2将对等连接的远程设置为客户端1的sdp
- 客户端2 为客户端1创建 answer
- STUN服务器将以“answer”为类型的sdp文本和candidate字符串响应给客户端2
- 客户端2 需要复制上述响应并发送给客户端1
- 客户端1 将对等连接的远程设置为客户端2的sdp,并添加客户端2的candidate
- 好的,客户端1和2已连接…
可以支持多个对等点吗?
- 我找到了3种方法!
? 选项1:Mesh模型
- 这看起来类似于WebRTC的基础P2P,在此模型下,如果有6个或更多用户,性能会非常糟糕。
? 选项2:MCU – 多点控制单元
- MCU也称为多点会议单元。无论您如何拼写,基本功能都显示在下图所示。
- 群组通话中的每个对等点都与MCU服务器建立连接,以上传其视频和音频。然后,MCU将包含所有对等点视频/音频的复合视频和音频流发送回给每个人。
- 无论通话参与者有多少,MCU都确保每个参与者只收到一组视频和音频。这意味着参与者的计算机不需要做太多工作。但是,MCU正在做同样的工作。因此,随着您的通话和应用程序的增长,您将需要比SFU架构更大的MCU服务器。但是,您的参与者可以可靠地访问流,并且不会拖累他们的设备。
- 实现MCU架构的媒体服务器包括Kurento(Twilio Video基于此)、Frozen Mountain和FreeSwitch。
? 选项3:SFU – 选择性转发单元
- 在这种情况下,每个参与者仍然像我们的MCU一样,只向上发送一套视频和音频到SFU。但是,SFU不创建任何复合流。相反,它为每个用户发送一个不同的流。在此示例中,由于通话中有5个人,因此每个参与者接收4个流。
- 这样做的优点是,与Mesh P2P模型相比,每个参与者的工作量仍然更少。这是因为每个参与者只建立一个连接(到SFU),而不是与所有其他参与者建立连接来上传自己的视频/音频。但是,与MCU相比,它可能更耗费带宽,因为每个参与者都会下载多个流。
- 对于参与者来说,接收单独流的好处是他们可以随意处理这些流。他们不受MCU的布局或UI决策的限制。如果您参加过允许您选择不同布局(例如,哪个发言者的视频将最突出,或者您希望如何安排屏幕上的视频)的会议电话,那么它就是使用了SFU。
- 实现SFU架构的媒体服务器包括Jitsi和Janus。
