1. 整体流程概述
说明端到端流程:采集→低延迟编码→分段/打包(CMAF/LL-HLS/LL-DASH)→推送到边缘CDN→播放器减缓。要把每一段的延迟最小化,并控制缓冲与并发。
2. 采集与上行(Ingress)配置
实践步骤:使用SRT或WebRTC做主路上行;示例FFmpeg发送SRT:
ffmpeg -re -i cam.mp4 -c:v libx264 -preset veryfast -g 48 -keyint_min 48 -bf 0 -b:v 2500k -maxrate 2500k -bufsize 5000k -f mpegts "srt://CDN_INGEST:port?pkt_size=1316"
说明开启FEC与低延迟模式、固定GOP、禁用B帧以减少编码延迟。
3. 编码器参数与实时转码建议
步骤:设置GOP为帧率的1〜2秒(如48帧@25fps),keyint固定;关闭重复P/B(-bf 0),降低延迟预设(veryfast/ultrafast),限制bufsize和maxrate;若需质量优先可用硬件编码(NVENC/QuickSync)并行转码多码率。
4. 打包为CMAF / LL-HLS / LL-DASH 的实操
使用Shaka Packager或FFmpeg+Packager:示例(Shaka):
packager in=video.mp4,stream=audio,output=out.mp4 --segment_duration 1000 --fragment_duration 200
要点:采用fMP4(CMAF),启用chunked transfer(chunked encoding),segment/chunk长度控制在200-1000ms,以便边缘可即时转发小片段。
5. CDN与边缘配置要点
步骤:在CDN侧设置短TTL、启用chunked transfer和HTTP/2或QUIC,关闭大段合并缓存,启用回源直连(origin shield)与预取策略。确保边缘直接转发CMAF小片段并保持HTTP连接长连接与Keep-Alive。
6. 播放器与客户端缓冲优化
实践:播放器设置initialBuffer 0.5s〜1s,liveDelay最小化至1s,启用低延迟解码路径(MSE fMP4 支持),使用LL-HLS标识(EXT-X-PREFETCH)或WebRTC直接播放以实现端到端最短延时。同时实现ABR快速切换与填充黑帧策略。
7. 网络与传输层优化
操作步骤:在服务端启用QUIC/HTTP3、开启TCP/TFO与TLS会话复用;在Linux主机上启用BBR拥塞控制:sysctl -w net.ipv4.tcp_congestion_control=bbr。对SRT启用流量控制与重传(NACK)以减少重试延迟。
8. 容错、监控与回退策略
做法:部署主动监控(latency、packet loss、buffer health);建立回退路径(若CMAF链路异常,切换到WebRTC或低码率RTMP);使用边缘转码和边缘缓存预热减少突发抖动。
9. 实际部署顺序与检查清单
逐步操作:1)确认采集设备与GOP设置;2)搭建SRT/WebRTC入站并测试丢包;3)配置转码节点与Shaka/packager分段;4)配置CDN边缘支持chunked与HTTP/2/3;5)调整播放器初始缓冲并压测延时;6)上线前做全链路压力与回退验证。
10. 常见问题解答 - 问:如何衡量“无延迟”是否达成?
答:用端到端时间戳对比(采集端时间戳与播放器显示时间),监控90/95百分位延时、丢包率与抖动。目标端到端延时<=2s为低延时,<=500ms可视为接近实时(需WebRTC)。
11. 常见问题解答 - 问:如果CDN中间有缓冲导致延时怎么办?
答:检查CDN是否合并小段为大段、关闭边缘合并、启用chunked转发与短TTL,并在origin开启chunked upload或HTTP/2 push;如仍有问题,使用边缘转码或将流直连最近POP。
12. 常见问题解答 - 问:要在成本与延迟间如何权衡?
答:更低延迟常需更多边缘资源与更高带宽(短segments、更多请求)。建议:对关键直播使用专线或SRT/WebRTC+边缘实例,对非实时观众使用普通HLS/DASH节省成本,并在策略上做分层服务。