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。

参考链接: https://webrtc.ventures/2020/12/webrtc-media-servers-sfus-vs-mcus/

GitHub

https://github.com/hongvinhmobile/sanbox_webrtc-flutter