直播流切片是什么
打开抖音、B站或者淘宝直播,你看到的画面其实并不是一整条连续不断的视频流。它被切成一小段一小段的文件,按顺序传到你的手机上,一边下载一边播放。这种技术就叫“直播流切片”。
为什么需要切片
试想一下,如果整场直播都是一条从头到尾的视频,网络稍微卡一下,整个画面就得等缓冲。而切片后,每段只有一两秒到几秒长,客户端可以逐段请求、并行加载,即使某一段丢了或延迟了,也不影响整体流畅度。
另外,切片还能适配不同网速。比如你在地铁里信号差,播放器会自动切换成低码率的小片段;回到家Wi-Fi变好,又悄悄换成高清版。这一切都建立在“把直播切成小块”的基础上。
HLS 与 DASH 中的切片机制
目前主流的两种协议是 HLS(HTTP Live Streaming)和 DASH(Dynamic Adaptive Streaming over HTTP)。它们都依赖切片,但方式略有不同。
HLS 是苹果推出的,最常见于 iOS 设备。它把视频切成 TS 或 fMP4 格式的片段,默认长度 6~10 秒,同时生成一个 .m3u8 的索引文件,告诉播放器接下来该播哪一段。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
chunk00001.ts
#EXTINF:10.0,
chunk00002.ts
#EXTINF:10.0,
chunk00003.ts
DASH 则更灵活,使用 MPD(Media Presentation Description)文件来管理分片信息,支持多种封装格式,并且切片时间可以更短,适合对延迟要求更高的场景,比如赛事直播互动。
切片时长怎么定
太短不行,太长也不行。常见的切片时长是 2~6 秒。如果你做的是电商直播带货,用户要实时抢购,那可能得压到 2 秒以内,否则消息推送和画面不同步。
但切得太短,服务器压力就上来了。原本一秒钟处理一次请求,现在变成每两百毫秒就要生成一个新片段,CDN 节点也要频繁更新缓存。所以很多平台会在“低延迟”和“系统负载”之间找平衡。
编码与打包流程
推流端用 OBS 或专业编码器把画面编码成 H.264 + AAC,然后交给流媒体服务器(比如 Nginx-rtmp、SRS 或 Wowza)。服务器一边接收实时数据,一边按设定的时间窗口切片,写入存储并更新索引文件。
以 SRS 为例,配置中可以指定:
hls {
enabled on;
hls_fragment 4;
hls_window 12;
hls_path /var/www/html;
}
意思是每个片段 4 秒,保留最近 12 秒的窗口内容,切好的 .ts 文件放在指定目录。客户端通过访问 .m3u8 实时获取最新列表。
遇到的问题和优化方向
有时候你会发现直播间明明开了半小时,回放却只能看最近十分钟。这是因为切片策略设置了滑动窗口,旧的片段被自动清理了。解决办法是开启持久化存储,或者对接对象存储服务如阿里云 OSS。
还有种情况是主播说话和字幕不同步。这往往是音频和视频切片对齐没做好。建议在编码阶段启用“关键帧对齐”,确保每一小段都能独立解码播放。
现在很多平台开始用 CMAF(Common Media Application Format),让 HLS 和 DASH 共用同一套切片,减少重复存储和转码成本。未来可能会成为标准做法。