WebRTC 应用实践要点

WebRTC 服务器

WebRTC 的服务器大体分为信令服务器和媒体服务器

WebRTC 信令服务器是主要功能是为 WebRTC 通讯搭建一个了解彼此能力的通道, 交换信息, 同步改动.

而媒体服务器就是用来交换媒体,包括对媒体数据的加解密,编解码,带宽和速率控制等功能

不同的 RTP Toplogies 对服务器有不同的要求, WebRTC 或者说多媒体通信一般有如下的几种拓扑结构:

  1. Point to Point 点对点

  2. Point to Multipoint Using Multicast 单点到多点(使用多播)

  3. Point to Multipoint Using the RFC 3550 Translator 单点到多点(使用RFC3550 的 Translator)

  4. Point to Multipoint Using the RFC 3550 Mixer Model 单点到多点(使用RFC3550 的Mixer)

  5. Point to Multipoint Using Video Switching MCUs 单点到多点(使用视频切换)

  6. Point to Multipoint Using RTCP-Terminating MCU 单点到多点(使用RTCP 终结方式)

  7. Non-Symmetric Mixer/Translators 非对称的 mixer/translator

  8. Combining Topologies 混合拓扑

服务器的主要功能

P2P

如果是两个人之间的端到端 (P2P) 的通信, 信令服务器的功能很简单

  1. 交换媒体通信和处理能力,主要是以 SDP 来描述

  2. 交换连接地址, 比如 ICE Candidate

而由于是点对点的通信,媒体服务器也就不需要了。

../_images/webrtc_p2p.png

SFU

如果是 SFU(Selective Forward Unit), 那么它的信令服务器除了上述的 SDP 媒体参数协商, ICE 连接地址交换,还有参加 RTP 会话的参加者信息的同步。

../_images/webrtc_sfu.webp

多个人之间的会议系统, 信令控制会麻烦很多,除了上述两个基本功能之外, 还要有

  • 会议管理

  • 成员管理

  • 设备管理

  • 会话管理

  • 连接管理

  • 媒体管理

  • 管理会议中的实体

在 RFC4575 中有这样的定义

conference-info
    |
    |-- conference-description
    |
    |-- host-info
    |
    |-- conference-state
    |
    |-- users
    |    |-- user
    |    |    |-- endpoint
    |    |    |    |-- media
    |    |    |    |-- media
    |    |    |    |-- call-info
    |    |    |
    |    |    |-- endpoint
    |    |         |-- media
    |    |-- user
    |         |-- endpoint
    |              |-- media
    |

    |-- sidebars-by-ref
    |    |-- entry
    |    |-- entry
    |
    |-- sidebars-by-val
        |-- entry
        |    |-- users
        |         |-- user
        |         |-- user
        |-- entry
            |-- users
                    |-- user
                    |-- user
                    |-- user

MCU

Multiple Control Unit 多点控制单元相比 SFU, 它有着对于媒体流的 Mix 和 translate 功能,可以很好地适配传统的通信设备,在实际应用中,一般我们会以 SFU 为主, MCU 为辅,共同形成一个服务器集群。

../_images/webrtc_mcu.png

服务器中需要维护领域对象

在 WebRTC 服务器上,我们一般会维护如下的领域对象

  • Conference

  • Session

  • Participate

  • Device

  • Connection

  • MediaSession

  • MediaSessionDescription

  • MediaStream

  • MediaStreamTrack

  • 等等

领域对象的具体内容从略,一般有如下的 Command 或 Event

应用层的事件大约可以分为 5 类

  • Request: 包括 command

  • Response

  • Subscribe

  • Notify

  • Message 就是一个消息,不要求响应, 例如 Presence 出席信息

具体的有

  • Start

  • End

  • Join

  • Leave

  • Offer

  • Answer

  • Mute

  • Unmute

  • Expel

  • RaiseHand

  • 等等

WebRTC 的开源实现

  • janus

  • Pion: Pure Go implementation of the WebRTC API.

  • aiortc: WebRTC and ORTC implementation for Python using asyncio.

  • kurento

  • webrtc-rs: A pure Rust implementation of WebRTC stack. Rewrite Pion WebRTC stack in Rust.

  • SIPSorcery: A WebRTC, SIP and VoIP library for C# and .NET. Designed for real-time communications apps.

  • werift-webrtc: WebRTC Implementation for TypeScript (Node.js)

Libraries

  • libwebrtc

  • libdatachannel