基于 pion 开发 webrtc sfu 服务器

2,700 阅读4分钟

简介

webrtc

webrtc: 是 Web Real-Time Communication 的简写,包含两部分 API 和 protocol。其中 protocol 是两个 webrtc agent 之间协商双向安全的即时通信的规则集。开发者则是通过 webrtc API 使用 protocol。

webrtc protocol 不是从零开始的技术,它是将已有多种技术整合在一起,主要是四个部分:

  • signaling: 发现 webrtc 网络内可通行的终端,基于 SDP protocol
  • connectioning: 实现 NAT 网络穿透互联,基于 ICE protocol
  • securing: 确保 webrtc 网络通信安全,基于 DTLS 和 SRTP
  • communicating: 实现 webrtc agent 的之间即时通信,基于 RTP 和 SCTP

webrtc API 最主要的类 RTCPeerConnection , 是所有 webrtc protocol 对外的统一接口,采用了 Facade 模式。

pion

pion 是一个开源库,使用 golang 实现 webrtc ,其提供的 ion webrtc 服务器支持分布式部署,也提供了 Flutter 和 JS 的开发 SDK .

SFU

SFU 是一种 webrtc 架构类型。

webrtc 常见的架构有:

  • p2p : 端与端直接之间通信,适合两人的场景。
  • mesh : 同样是端于端之间通信,就是单多人使用 p2p 通信时,就会演变成 mesh 。终端存在多路上行和下行,网络拓扑结构复杂,终端带宽压力大。
  • SFU : 全称是 Selective Forwarding Unit,终端只需发送一路上行流到服务器,通过服务器来路由和转发给其它终端,避免 mesh 中终端多路上行产生的带宽压力。
  • MCU : 是在 SFU 的基础上将多路流在服务器进行合流后,再转发给终端,从而将多路下行合并为一路下行流,进一步减少带宽,但会增加服务器的压力。

总结:SFU 相比于 MCU,服务器的压力更小(纯转发,无转码合流),灵活性更好(可选择性开关任意一路数据的上下行等),受到更广泛的欢迎和应用。当然在复杂的生产环境中可能 SFU 和 MCU 会混合使用。

如何实现 SFU

SFU 的核心功能是基于 webrtc protcol 于终端建立链接,接受终端上传的视频流,并将其转发给其它终端。那么最重要的就是实现 webrtc protcol 的能力。那么可以分为两部分工作:

  • 信令服务:在 SFU 服务器于终端之间传输 webrtc protocol 中的 SDP 数据和 ICE 数据,提供建立 webrtc 链接的相关信息。
  • 流媒体服务:在 SFU 服务器于终端之间基于 webrtc protocol 传输视频流数据。

信令服务

实现信令服务首先确定由哪些信令。需要传递的 SDP 和 ICE 两类数据,但 SDP 又分为 offer 和 answer 两类数据,所以需要提供一共三个信令。

  • offset
  • answer
  • candidate

信令的格式定义基于 json, 需要一个字段区分信令和一个字段携带数据,一共两个字段:

type Message struct {
	Event string `json:"event"`
	Data  string `json:"data"`
}

传输协议选择 websocket

信令服务中流程:

sequenceDiagram
Client ->> Server: "发起 websocket 链接"
Server ->> Client: "创建 SDP offset 消息,发送给终端"
Client ->> Server: "创建 SDP answer 消息,发送给服务器"
Client ->> Server: "创建 ICE candidate 消息,发送给服务器"
Server ->> Client: "创建 ICE candidate 消息,发送给终端"

流媒体服务

流媒体服务需要实现 webrtc protocol 中定义的 connectioning, securing, communicating 的能力,这里就需要用到 pion 库。其已经提供了使用 golang 实现的 webrtc protocol ,其主要接口也与 webrtc API 基本一致。

代码

...

走过路过

抖音直播团队内推:job.toutiao.com/s/NDPYgKR

截屏2022-03-19 下午7.56.37.png

深圳、北京、杭州三地共建业务,各地均在大量招人,也欢迎大家投递和推荐

业务介绍

  • 直播团队负责为字节跳动旗下的所有 App 提供直播服务,包括但不限于抖音、火山、今日头条、西瓜视频、皮皮虾、懂车帝等,还有火遍全球的 TikTok。
  • 直播团队不仅仅负责直播平台技术研发,为直播提供稳定的基础服务;还负责直播业务研发,为用户提供完善的直播体验。

业务发展

  • 直播是字节的头部业务,用户与营收高速增长,两年不到的时间就跻身行业第一,直播体量目前已远超竞品。
  • 依托于抖音、火山、头条、西瓜等的巨大体量优势,直播业务仍有较大空间,一年翻番不是梦。
  • 直播属于中台研发模式,基础建设与架构等方面会面临和普通项目不一样的挑战,常规的业务开发上的设计也需要思考的更佳全面,此外还会涉及到性能优化、跨端技术、编译平台建设等,甚至还有手机投屏、游戏引擎打通等创新技术;总体来说,只要你敢于挑战,在技术深度与广度方面都会得到较好的锻炼。