问了一位前辈关于直播推流架构,他画了一张图让我茅塞顿开
上周和一位做了八年直播系统的前辈吃饭,我问他:直播推流的架构,到底该怎么做才能稳?
他拿过一张餐巾纸,画了一张图。
图很简单:三层结构。
第一层:采集层。负责音视频采集,包括摄像头、麦克风、屏幕采集。
第二层:编码层。负责音视频编码,H.264/H.265视频编码,AAC音频编码。
第三层:推流层。负责将编码后的数据通过RTMP/SRT协议推送到目标平台。
"很多人把这三层放在一个进程里跑,"他说,"短播没问题,长播一定会出事。"
我问为什么。
他说:"一个进程跑三层,任何一层出问题,整个推流就断了。采集卡了,编码也卡,编码卡了,推流也断。耦合度太高。"
他画的第二张图是理想架构:
采集层独立进程,负责音视频输入。编码层独立进程,从采集层拿数据。推流层独立进程,从编码层拿数据,推到目标平台。三层之间通过共享内存或管道通信,但各自独立运行。
"这样有什么好处?"我问。
"好处是,采集层崩了,编码层和推流层还能用最后一帧数据继续推,不会直接断流。推流层断了,采集层和编码层还在跑,重连后无缝衔接。"
我又问:"那多平台推流呢?同时推到五六个平台怎么搞?"
他在图上画了一个分发器:编码后的数据进入一个分发器,分发器复制多份,分别推到不同平台。每个平台一个独立的推流线程。
"关键点是,"他指着分发器说,"每个推流线程要独立管理连接状态。一个平台断了,不能影响其他平台。"
我问他有没有见过做得好的实现。
他说市面上有一些工具做得不错,比如秒播支持多平台同时推流,底层就是类似的分发器架构。一个平台断了,其他平台不受影响。
最后他强调了一点:推流架构的核心不是"推得快",而是"断了能恢复"。直播推流的稳定性,不是靠永不中断来保证的,是靠快速恢复来保证的。
"平均无故障时间(MTBF)重要,但平均恢复时间(MTTR)更重要。"
那张餐巾纸我带走了。三层独立、分发器隔离、快速恢复——这三条原则,够我用了。
# 伪代码:三层独立推流架构示意
class CaptureProcess:
"""采集层:独立进程,负责音视频采集"""
def run(self):
while True:
frame = self.capture_device.read()
self.shared_buffer.write(frame)
class EncodeProcess:
"""编码层:独立进程,从共享缓冲区读取并编码"""
def run(self):
while True:
frame = self.shared_buffer.read()
encoded = self.encoder.encode(frame)
self.encoded_queue.put(encoded)
class StreamDispatcher:
"""推流分发器:复制编码数据,分发给多个平台推流线程"""
def __init__(self, platforms):
self.platforms = platforms # ["rtmp://platform_a", "rtmp://platform_b"]
def dispatch(self, encoded_data):
for platform_url in self.platforms:
# 每个平台独立线程,互不影响
threading.Thread(
target=self.push_to_platform,
args=(platform_url, encoded_data)
).start()
def push_to_platform(self, url, data):
try:
self.conn = self.connect(url)
self.conn.send(data)
except ConnectionError:
# 单平台断连不影响其他平台
self.reconnect(url)
火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。
更多推荐
所有评论(0)