背景
随着全民直播时代的到来,以及最近疫情的爆发,在线教育行业又变的炙手可热,成为了新的风口。这两者的背后都是依靠着 CDN 以及视频云等基础服务,而这些基础服务的底层又依靠着流媒体服务器这种有着“悠久历史”的特殊服务器软件。为什么说特殊呢,因为这种服务器软件的架构和传统的 Web 服务器有很大的差别。
在直播系统或者视频会议系统中,有 三大件 构成:
- 推流器——采集、编码、协议封包
- 流媒体服务器——协议解包封包、转发
- 播放器——协议解包、解码、渲染
这三大件有着不同的技术领域,而今天的主角就是其中的流媒体服务器,他的主要职责就是转发。现在让我们看看这位在幕后默默付出的角色的发展历程以及最新的架构设计思想。
流媒体服务器 1.0
本人的第一份工作就是和它打交道,当时它叫 FCS,全称 Flash Communication Server。那时候 Flash 还属于 macromedia 公司。我在一家小公司上班,产品就是用 Flash 开发的视频会议系统以及后来的培训系统,今天看来还是比较超前的。从 FCS,到后来的 FMS(全称 Flash Media Server)现在叫 AMS(Adobe Media Server)基本的架构没有变化。(FCS、AMS 后面统称 FMS)
在这个架构一下面,推流和播放都由 FlashPlayer 承担,FlashPlayer 可以嵌入到网页中,也可以做成独立的 exe。后来官方专门制作了一款用于推流的软件 FMLE(全称:Flash Media Live Encoder)。这 FlashPlayer 和 FMS 之间通过 RTMP 协议进行通讯,这个协议一直到现在还在广泛使用(虽然 Flash 已经被淘汰)。在 FMS 端还可以通过编写服务器脚本进行业务逻辑开发,可以非常方便的实现房间里面的状态同步,这个得益于 RTMP 协议可以传输一些 AS(action script)的指令,包括 RPC、共享对象等。当然如今 RTMP 人们只是用来传输音视频,其他功能都已经被忽略了。
(这里补充一点:微软也有一套流媒体服务器,但使用不是很广泛,就不做赘述了)
流媒体服务器 1.5
由于 FMS 的授权费用相当昂贵,当时一个核心 4000 美金,很多企业都承担不起,尤其是创业型公司。随后就催生出了开源的流媒体服务器,其中最著名的是 Red5,由 Java 开发。以及性能更为强悍的 crtmpserver(又名 rtmpd)由 C++ 开发。当然这些服务器的功能是不如 FMS 的。我当时潜心研究 crtmpserver,并用 C#进行了移植,这个移植版本在 github 上开源,有兴趣的朋友可以去观摩: https://github.com/langhuihui/csharprtmp 基本的结构是一模