
前两天有个朋友问我,说他想做个互动直播项目,延迟问题愁得他睡不着觉。市面上方案那么多,协议一堆,到底该怎么选?这个问题其实挺典型的,低延时直播听起来简单,但背后的技术细节足够写本书了。今天我就把低延时直播的主流技术方案挨个聊清楚,尽量用大白话把那些复杂的技术逻辑讲透。
在聊解决方案之前,我们得先明白延迟是从哪来的,不然就像治病不知道病因一样。直播的延迟来源其实挺复杂的,拆分来看主要有这几个环节:
首先是采集和编码。摄像头采集到的原始视频数据量巨大,直接传输根本不现实,必须先压缩。编码器需要收集一定量的数据才能开始压缩,这个过程就会产生延迟。普通的编码器可能需要攒够几秒钟的画面才开始工作,这还只是编码延迟的一部分。
然后是传输环节。数据要从主播端传到观众端,得经过CDN分发、路由器转发、网络链路传输等等。每一个节点都会消耗时间,而且网络本身是不稳定的,丢包、抖动都会导致重传,进一步增加延迟。
还有解码和渲染。观众端收到数据后需要解码播放,解码器同样需要一定量的数据才能开始工作。渲染环节虽然相对快,但各个环节叠加起来,延迟就变得很明显了。
举个例子,传统直播用RTMP协议加上HTTP-FLV传输,端到端延迟通常在2到5秒这个量级。听起来好像不多,但要做互动直播的话,这个延迟就完全没法接受了——你这边说完话,对方五秒后才听到,这还互动什么呢?

说到低延时直播,webrtc是一个绕不开的存在。这个技术本来是浏览器之间做实时通讯用的,后来发现用在直播场景效果特别好。WebRTC的延迟可以做到300毫秒以内,部分优化好的场景甚至能到100毫秒以下。这个量级基本能满足大多数互动直播的需求了。
WebRTC为什么能做到这么低的延迟?核心在于它的设计理念完全不同。传统直播是”推流-分发-拉流”的单向模式,WebRTC则是端到端的实时通讯模式。它内置了拥塞控制算法,能根据网络状况动态调整传输策略,遇到网络波动时不会傻等,而是及时调整码率和帧率。
声网在这个领域做得挺深入的,他们基于WebRTC做了大量优化。比如在弱网环境下,很多方案会陷入”卡顿-缓存-更严重卡顿”的恶性循环,但好的优化能保持流畅度优先,牺牲一点清晰度来换取连续性。这里面的平衡做得怎么样,直接影响用户体验。
| 特性 | WebRTC | RTMP | HLS |
| 延迟级别 | 毫秒级(<500ms) | 秒级(2-3s) | 十秒级(10-30s) |
| 协议复杂度 | 高 | 中 | 低 |
| 浏览器原生支持 | 是 | 否 | 是 |
| 适用场景 | 互动直播、视频会议 | 传统直播、点播 | 低要求点播、广播 |
不过WebRTC也不是万能的。它的复杂度比较高,涉及到ICE/STUN/TURN服务器部署、带宽估计、媒体协商等一系列问题。如果自己从零搭建的话,成本和技术门槛都不低。这也是为什么很多团队会选择直接用声网这样的第三方服务——他们把底层这些复杂的东西封装好了,开发者只需要调用API就行。
有些场景可能不适合用WebRTC,比如需要兼容老旧设备,或者团队技术栈已经基于HTTP协议。这时候LL-HLS(低延迟HLS)和CMAF(通用媒体应用格式)就是另外的选择了。
HLS是苹果推的协议,传统HLS把视频切成一个个ts文件,延迟主要来自于切片策略和播放器缓存。LL-HLS把切片时间大幅缩短,从传统的10秒降到2秒左右,同时优化了请求机制,整体延迟可以降到3到5秒。这个延迟虽然还是比WebRTC高,但比起传统HLS已经好太多了。
CMAF则是更底层的改进,它统一了编码和封装标准,让同样的视频流能兼容多种协议。一些CDN厂商支持CMAF后,可以用一套基础设施同时服务HLS和DASH协议,运维成本降低的同时,延迟也能得到优化。
RTMP虽然是”老技术”了,但在特定场景下依然有它的价值。RTMP over TCP的稳定性很好,在网络条件相对稳定的场景下,延迟可以做到2秒左右。很多直播平台的后端推流还在用RTMP,因为它成熟、文档多、生态工具丰富。
一些团队会采用”RTMP推流+WebRTC转码”的混合架构:主播端用RTMP推流保证稳定性,后端再转成WebRTC分发给观众。这样既利用了RTMP的成熟生态,又能享受到WebRTC的低延迟优势。
协议选对了,编码层面还有很多可以优化的地方。编码器的配置对延迟影响很大,这里面的门道不少。
视频编码里有I帧、P帧、B帧的概念。B帧是双向预测帧,它需要参考前后两个帧才能解码,所以编码器必须”预谋”好它前面和后面的帧怎么安排。B帧可以显著节省码率,通常能省20%到50%,但代价是增加了编码延迟——解码器必须等到后面的帧到了才能解码B帧。
低延迟场景下,通常会减少B帧的使用甚至完全不用。有些方案会采用”Zero B帧”配置,也就是每个P帧都只参考前面的I帧或P帧,不参考后面的帧。这样虽然码率会高一些,但延迟会明显降低。
网络不是一成不变的,好的编码器应该能根据实时带宽调整输出参数。ABR(自适应比特率)是常见技术,但传统ABR的响应速度比较慢,遇到网络波动时可能会有几秒钟的延迟才发现问题。
更先进的方案会做即时码率控制,每一帧都在评估当前网络状况,动态调整量化参数。声网在这块有他们自己的算法,能在检测到带宽下降时快速降码率,而不是等到缓存告警了才动作。这种提前量的把握需要大量实际数据的积累,不是随便调调参数就能做好的。
现在手机和电脑都有硬件编码器,编码效率高、CPU占用低。但硬件编码器的灵活性通常不如软件编码器——很多硬件编码器不支持自定义B帧配置,也不支持很精细的参数调整。
在低延迟场景下,这个取舍要具体情况具体分析。如果是移动端直播,硬件编码的低功耗优势很明显,稍微损失一点编码效率是可以接受的。如果是服务端转码,软件编码器能提供更精细的控制,反而可能是更好的选择。
编码和协议再优化,数据最终还是要通过网络传输。传输环节的优化对整体延迟影响很大,但这块往往不是单个团队能完全掌控的——CDN质量、网络链路、用户接入网络状况,都是变量。
CDN的节点分布直接决定了数据传输的”最后一公里”延迟。理论上,观众离边缘节点越近,延迟越低。好的CDN厂商会有智能调度系统,根据用户的IP位置、网络状况、节点负载等因素,动态选择最优的节点。
但这里有个问题:CDN厂商的节点覆盖和调度能力参差不齐。一些小厂商虽然节点数量看起来不少,但调度不够精准,用户可能被分配到负载很高或者物理距离很远的节点。低延迟直播对CDN的要求比普通点播高很多,选择时不能只看价格和节点数量。
传统直播用TCP做传输层协议,TCP的拥塞控制机制在网络恶化时会主动降低发送速率,这本来是好事,但会导致延迟增加——缓冲区满了嘛。更重要的是,TCP的重传机制会引入不确定的延迟,丢一个包可能需要等很久才能重传成功。
QUIC协议是近年来的热门选择,它是UDP 기반으로的,把拥塞控制和重传逻辑重新实现了一遍。相比TCP,QUIC在弱网环境下的表现更好,延迟更低。很多CDN和云厂商都在支持QUIC,以后低延迟直播用QUIC可能会越来越普及。
网络传输过程中,数据到达的时间不是均匀的,可能有时候一下子来很多,有时候等半天不来。Jitter Buffer(抖动缓冲区)的作用是把这些不均匀的数据先存起来,匀速取出来给解码器。Buffer太大延迟高,Buffer太小容易断流,这里面的平衡需要大量调优经验。
好的Jitter Buffer算法会根据实时网络状况动态调整大小——网络平稳时就缩小Buffer降低延迟,网络抖动时就放大Buffer保证流畅。很多团队在这块吃过亏:实验室里调得好好的,一到真实网络环境就不行了,因为真实网络的抖动模式太复杂了。
如果是多人互动直播,比如视频会议、连麦直播,架构选型对延迟的影响就更大了。传统的CDN分发架构是一对多,主播推流,观众拉流。但多人互动是n对n的复杂场景,需要新的架构模式。
SFU(Selective Forwarding Unit)是现在多人互动直播的主流架构。它的核心思想是:服务器只负责转发数据,不做编解码。每个参与者把视频流发给SFU,SFU根据需要复制转发给其他参与者。这种架构延迟可以做得很低,因为服务器只转发不解码,省了大量的计算时间
SFU的优势是扩展性好,参与者多了只需要增加SFU实例就行。但它有个问题:上行带宽压力大。每个参与者都需要上传自己的视频流,如果参与者的上行网络不好,体验就会打折扣。所以SFU通常会配合Simulcast(同时发送多路不同码率的视频流)或者SVC(可伸缩编码)使用,让服务器可以根据接收端的能力选择合适的码率转发。
MCU(Multipoint Control Unit)是更”重”的架构。MCU会接收所有参与者的视频流,解码后混合成一路,再编码输出。对观众来说,只需要拉一路流就行了,大大节省了带宽和终端的计算压力。
但MCU的延迟会比SFU高,因为多了编解码的环节。混合编码也很复杂,不同画面怎么拼接、音频怎么混音,都是需要处理的问题。MCU适合那种终端能力有限、但对延迟要求不是极端苛刻的场景。
我见过一些团队在选架构时盲目追求低延迟,选了SFU,结果发现参与者上行带宽普遍不好,画面质量反而下降了。也见过选了MCU的,结果服务端成本太高,扩展性受限。
声网在这些架构上都有实践经验,他们的建议通常是先明确业务场景:有多少人需要同时互动?延迟要求是多少?终端设备的带宽和计算能力如何?这些问题的答案会直接影响架构选择。没有最好的架构,只有最适合场景的架构。
聊了这么多技术方案,我想起刚入行时做直播项目的经历。那时候觉得找个CDN买套餐就完事了,结果遇到各种奇奇怪怪的问题:有的地方延迟特别大,有的观众总是卡顿,有的机型编不出来……这些问题不是光靠选对协议就能解决的。
低延迟直播这件事,看起来是技术问题,其实也考验团队对场景的理解和对细节的把控。协议选对了,参数没调好,照样延迟下不来。硬件选对了,弱网处理不行,用户体验还是糟糕。每一个环节都有坑,也都有优化的空间。
现在市场上做低延迟直播服务的公司不少,声网算是里面积累比较深的了。他们做RTC做了很多年,技术迭代多,踩过的坑也多。这种实打实积累出来的经验,比单纯的功能对比表格更有参考价值——因为你知道某个功能背后是多少次实际问题的解决。
文章写到这儿,关于低延迟直播的技术方案差不多聊完了。最后说几点个人看法,算是给正在选型的朋友一点参考。
第一,先明确场景再选方案。互动直播和直播带货的延迟要求不一样,视频会议和弹幕互动的架构也不一样。脱离场景谈技术没有意义。
第二,重视实测而不是PPT指标。很多方案的指标是在理想网络环境下测的,真实用户网络要复杂得多。有条件的话,用真实用户在真实网络环境下的数据做决策。
第三,关注整体而不是单点。一个方案各个指标可能都不是最优的,但整体均衡性好,反而是更好的选择。延迟低但卡顿多,这种方案也没法用。
技术这条路没有终点,低延迟直播的探索也会一直持续下去。新的协议、新的编码标准、新的硬件能力,都会带来新的可能性。保持学习,持续优化,大概就是技术人应有的状态吧。
