SRS 是国产开源流媒体服务器里用得最广的一个。 它的核心价值是「源站 + 边缘」这套分发结构。
7.4 讲的是设备接入层的工具,这一节讲通用流媒体服务器。 7.6 的 ZLMediaKit 与它定位相近,7.7 转向 WebRTC。
一、两种部署形态
① 单机:一个进程全包,收流、转发、切片都在里面。 适合小规模与自用。 ② 源站加边缘:源站只接推流、边缘只接观众, 边缘按需回源。适合大规模与跨地域。
边缘的价值只有一个:把「一份流」变成「就近的很多份」。 源站只往边缘发,边缘往观众发—— 源站出口压力与边缘数成正比,与观众数无关。
注意「与观众数无关」这句话有前提: 观众被均匀分到了各个边缘上。 如果所有观众都在同一个地区,那个边缘照样会压满。 所以边缘的分布要按观众的地理分布来规划,不能随便撒。
二、边缘到底省了多少
实测这组数字:10000 人看 2048 kbps 的一路流。 单机直出需要 19.5 Gbps 出口,这显然不可能。 20 个边缘时,源站只要 0.04 Gbps,省了 500 倍。
这个倍数就是「边缘数」,不是什么黑科技: 因为观众被平均分到了 20 个边缘上,每个边缘只出 1/20。
代价是回源链路要稳: 边缘与源站之间断一次,那一片观众就全黑屏。 所以生产上边缘通常还要配一层「回源失败重试加多源备份」。
三、它主要支持哪些协议
推流侧:RTMP 最常用,也支持 SRT 与 WebRTC 推流。 播放侧:RTMP、HTTP-FLV、HLS、WebRTC 都能出。 这意味着一路流推上去,四种播放器都能看—— 这就是「媒体服务器」相对于「协议转换器」的优势。
它的配置是一份纯文本:
listen 1935; 开 RTMP、http_server { enabled on; } 开 HTTP 输出。
所有功能都靠配置文件开关,不用改代码。
这一点在实际运维里很重要: 换协议、调参数都只改一行配置,重启即可。 相比之下,自己写转发程序每次改都要重新编译部署。
四、动手 Demo:SRS——源站一份,边缘一堆
先列两种部署形态,再算边缘到底省了多少。 算完就明白「为什么大流量必须上边缘」。
total, edges, kbps = 10000, 20, 2048
single = total * kbps / 1024.0 / 1024.0
print("%d 人看 %d kbps:单机直出要 %.1f Gbps" % (total, kbps, single))
for e in (5, 10, 20, 50):
src = e * kbps / 1024.0 / 1024.0
print(" %2d 个边缘 -> 源站 %.2f Gbps,省 %.0f 倍"
% (e, src, single / src))
print()
print("每个边缘承担 %d 人 = %.0f Mbps"
% (total // edges, (total // edges) * kbps / 1024.0))
实跑输出:
--------------------------------------------------------------------
SRS——源站一份,边缘一堆
--------------------------------------------------------------------
**① 两种部署形态**
形态 结构 适合
--------------------------------------------------------
单机 一个进程全包 小规模、自用
源站加边缘 源站回源、边缘分发 大规模、跨地域
**边缘的价值只有一个:把「一份流」变成「就近的很多份」。**
**源站只往边缘发,边缘往观众发——源站出口压力与边缘数成正比,与观众数无关。**
**② 算一算边缘到底省了多少**
**10000 人看 2048 kbps 的一路流:**
**单机直出需要 19.5 Gbps 出口。**
**20 个边缘时,源站只要 0.04 Gbps。**
**省了 500 倍。**
**这个倍数就是「边缘数」,不是什么黑科技——**
**因为观众被平均分到了 20 个边缘上。**
**代价是回源链路要稳:**
**边缘与源站之间断一次,那一片观众就全黑屏。**
**所以生产上边缘通常还要配一层「回源失败重试 + 多源备份」。**
单机 19.5 Gbps 是「理论上要」,现实中没人这么干。 边缘越多,源站越轻松,但边缘本身的总带宽一点没少。 每个边缘 500 人 = 1000 Mbps,已经压满千兆了,说明 20 个边缘还不够。
30 秒实验
- 把边缘改成 50,看每个边缘多少人——200 人 400 Mbps,这才在一台千兆机的舒适区。
- 把码率改成 512,看 20 个边缘时每台压力——250 Mbps,说明降码率对边缘的意义比对源站更大。
- 把观众数改成 100,看还需要边缘吗——0.2 Gbps,一台机器就够了,边缘是纯浪费。
常见误区
- 「上了边缘总带宽就省了」——总带宽不变,只是分散了。
- 「边缘越多越好」——边缘本身有成本,要按观众分布规划。
- 「SRS 只能做 RTMP」——RTMP、HTTP-FLV、HLS、WebRTC 都能出。
自测三问(点开对答案)
1. 源站加边缘解决的是什么问题? —— **把一份流的出口压力分散到多台机器**,源站只与边缘数相关。 2. 为什么说总带宽没省? —— **观众侧的总流量不变**,只是从源站挪到了各个边缘。 3. SRS 的配置方式是什么? —— **纯文本配置文件**,所有功能靠开关,不用改代码。- ☐ (本节完,下一节 7.6 ZLMediaKit)