资讯动态

LL-DASH低延时直播:DVB与DASH IF两套规范对比与选型指南

发布时间:2026/10/21 14:16:49 来源:尧图企业网站定制
做流媒体的朋友应该都有这种体会一条直播流从信号源到播放器延迟能做到 10 秒以内已经算不错想往 3 秒、1 秒以下压难度成倍增加。DASH 作为目前 OTT 领域覆盖面最广的自适应流媒体协议本身不是为超低延时设计的。分片生成、MPD 更新、播放器探测这一整套环节都在往延迟上“加码”。这几年围绕 DASH 低延时方案出现了两套影响最大的技术规范DVB 提出的 LL-DASH 与 DASH IF 提出的 LL-DASH。前者偏向服务器端支持、基于 Range 请求的“部分分片”思路后者则把重点放在 HTTP 分块传输与 CMAF Chunk 的流式推送再结合时钟同步把时延进一步压低。这篇文章就把这两套规范放在一起讲透它们的出发点、核心机制、在 MPD 与服务器行为上的差异、落地时要注意的坑以及你做低延时直播时到底该优先走哪条路线。适合正在搭直播系统的后台开发、写播放器的客户端工程师以及准备改造现有 DASH 链路的产品和技术负责人参考。1. 为什么 DASH 天生“慢半拍”在聊低延时方案之前我们得先搞清楚 DASH 的延迟到底是从哪来的。传统 DASH 的工作流程大致是这样编码器采集视频流打包器按固定时长把媒体切成一个个独立的分片比如 2 秒、4 秒、6 秒一个 Segment随后把分片信息写进 MPDMedia Presentation Description播放器定期去拉取 MPD发现新分片出现后再逐个下载分片、解码、渲染。这个流程里至少有四个环节在给延迟“加量”。第一打包器必须等分片内的媒体数据累积够时长才能完整生成一个 Segment第二播放器要等整个 Segment 下载完成确认 moov、moof、mdat 这些结构都拿到了才开始解析播放第三MPD 不是实时推送的播放器只能按轮询间隔去探测假设你的轮询周期是 1 秒中间又多了将近 1 秒的空档第四播放器为了保证流畅度往往会额外攒几秒的缓冲也就是常说的 target buffer防止网络抖动导致卡顿。把所有环节加起来传统 DASH 的端到端延迟通常落在 8 到 15 秒这个区间。你打开一个 OTT 直播网页看到画面比真实世界晚了十几秒大部分长度都耗在这几个地方。看录制好的点播内容还没什么感觉但一旦涉及体育赛事、电商直播、连麦互动用户对“慢半拍”的容忍度就非常低了。所以要降延迟无非是对症下药把 Segment 切得更小让播放器不用等整个文件把 MPD 的更新机制改得更灵敏把播放器端的缓冲策略收得更紧。DVB 和 DASH IF 两套低延时方案本质都是围绕这几个方向做文章只不过选择的手术刀不同。DVB 偏向在服务器侧做“分段可用”让播放器提前拿分片的一部分DASH IF 则更进一步让服务器像水龙头一样把一个分片的内容边生成边流式送给播放器。理解了这点后面所有细节就有脉络了。2. DVB 的 LL-DASH把分片“拆小”让播放器提前动手DVB 组织很早就关注低延时场景它提出的 LL-DASH 方案核心思路可以概括成一句话让那些本应完整生成才能下载的 Segment在还没生成完的时候就被播放器抢先拿到一部分。这套机制的关键不是把传输协议改得花里胡哨而是对媒体封装格式和 HTTP 行为做约束。2.1 核心机制SegmentBase Range 请求在 DVB 的方案里媒体文件通常采用 CMAF 进行封装也就是把 fMP4 格式进一步切成一个个 CMAF Chunk。每个 Chunk 都是一个完整的 moof mdat 单元可以独立解码播放但整个 Segment 又是多个 Chunk 按顺序组成的。服务器在生成 Segment 时每生成一个 Chunk这个 Chunk 对应的字节区间就可以被客户端访问了。MPD 里通过 SegmentBase 来描述分片信息其中的 Initialization 和 Media 的 Range 会告诉播放器哪些字节是初始化解码器用的哪些字节是当前要拉取的媒体数据。播放器拿到 MPD 后不需要等 Segment 全部写完而是直接用 HTTP Range 请求去打正在生成中的媒体文件。服务器按字节范围返回 206 Partial Content播放器拿到手一个 Chunk 就能先解一个 Chunk。这种模式对服务器非常友好不要求额外协议能力支持标准 Range 请求就行。CDN 层面也普遍成熟因为 Range 请求本身就是内容分发网络处理得最熟练的操作之一。2.2 MPD 中的关键字段availabilityTimeOffset 与 availabilityTimeComplete要在 MPD 里告诉播放器“你其实可以提前拉”必须引入两个容易被人忽略的字段availabilityTimeOffset和availabilityTimeComplete。默认情况下播放器认为只有到 MPD 里标注的 availabilityStartTimeSegment 才会开始可用。而 availabilityTimeOffset 允许你告诉播放器实际数据的可用时间点可以比 availabilityStartTime 提前多少秒。比如一个 4 秒的 Segment生成过程是边写边可用的你可以设一个 3 秒的 offset让播放器在 Segment 真正完整之前就开始发起 Range 请求。这时候播放器能不能拿到数据取决于媒体文件在服务器端是否已经暴露了那部分字节。配合好 availabilityTimeComplete 的取值播放器就能判断当前请求拿到的是完整文件还是部分内容从而决定要不要立刻进入解码流程。这两个字段在传统 DASH 里用得不多很多人第一次看到会觉得陌生。但低延时方案绕不开它们因为你要改变播放器的“时间预期”。我记得有次排查问题时明明服务器端已经支持部分可用但播放器就是稳定地等满一个 Segment 才开始播最后查来查去就是 MPD 里少了 availabilityTimeOffset 这个属性播放器回到了默认行为。这个字段加与不加延迟经常能差出 2 到 4 秒。2.3 延迟受什么控制Chunk 粒度是关键DVB 方案能压到什么程度很大程度上取决于 CMAF Chunk 切得多小。假设一个 Segment 是 4 秒里面切成 8 个 Chunk每个 500ms那播放器最早可以在 Segment 开始生成后的 500ms 就拿到第一个 Chunk。因为 Chunk 可以做 GOPGroup of Pictures对齐每个 Chunk 内部包含完整的关键帧信息播放器无需等待后面内容。实际项目中我见过把 Chunk 粒度设在 100ms 到 500ms 之间的做法。100ms 粒度理论上延迟控制最好但 HTTP 交互变得更加频繁服务器压力增加CDN 的缓存碎片也变多。500ms 粒度比较均衡延迟能做到 3 到 5 秒一般 OTT 直播够用。需要强调的是Chunk 粒度不是越小越好因为如果网络抖动一次播放器恢复缓冲消耗的时间可能会吞掉你辛辛苦苦省下的低延迟优势。比较稳妥的做法是先把 500ms 跑通再根据真实链路情况慢慢往 200ms 压。2.4 我看到的优点和限制DVB 这套 LLS 方案的优点很实际接入成本低服务器只要支持 Range播放器只要支持 partial Segment 解析很多现有的 DASH 链路不需要大改就能升级。CDN 兼容性也不错因为 Range 缓存是内容分发网络的基本功。但它的限制同样明显。播放器需要频繁发起 HTTP 请求不断去探测“下一个 Chunk 可用了没有”请求次数会明显上升。有些 CDN 在处理动态 origin 的 partial 内容时缓存刷新策略会出现偏差导致边缘节点上的字节一直停留在一个旧状态播放器拼命请求也拿不到新内容。另外从延迟上限来看DVB 方案做到 3 秒左右基本就是天花板想往亚秒级迈进单靠 Range 轮询的节奏不够快需要换一种更“流式”的思路。3. DASH IF 的 LL-DASH换一种“流式”的玩法DASH IF 的低延时方案走的完全是另一条路。DVB 的思路是“Segment 的 URL 固定可用字节范围动态变化靠播放器反复拉取”DASH IF 的思路则是“连接建立后服务器边生成数据边往播放器嘴里塞”大家熟知的 CMSChunked Media Streaming就是这条路线上的核心技术。它要解决的核心问题是如何让媒体数据的传输节奏和生成节奏完全同步减少播放器无谓的等待。3.1 核心机制CMAF Chunk 与分块传输DASH IF 的 LL-DASH 同样基于 CMAF 封装每个 Segment 被拆成多个 CMAF Chunk。区别在于传输方式。在 CMS 模式下服务器通过 HTTP/1.1 的 Chunked Transfer Encoding或者具备流式能力的 HTTP/2 数据流把 Segment 里生成好的 Chunk 逐个送给已经连接上的播放器。播放器不用等一个 Segment 完整也不用反复发起 Range 请求只需要维持连接、持续接收字节流每到一个 Chunk 就立刻解析并送进解码器。这种模式很像你喝水时直接用水杯对着水龙头接水而不是每次等水龙头放满一桶水再去抬桶。延迟的下降更直接因为省掉了连接建立、请求响应往返的时间。遇到控制得当的直播链路端到端延迟压进 1 到 3 秒是很正常的。3.2 SegmentTimeline、Part 与 UTU-Time 的作用DASH IF 方案对 MPD 的要求明显比 DVB 复杂。为了精确描述每个 Chunk 在时间轴上的位置MPD 中通常使用 SegmentTimeline并在其中描述 Part 的信息。Part 就是 CMAF Chunk 在 DASH 抽象层面的映射播放器据此能知道当前有哪些媒体分块可用、每个分块对应的时间范围是哪里。如果只描述 Segment 而忽略 Part播放器就没有办法在 Segment 内部做到精细调度。另一个容易踩坑的点是时间同步。低延迟场景对时间精度极度敏感如果播放器的墙钟和服务器不一致哪怕偏差只有几百毫秒都可能让播放器错误判断当前应播放哪个 Chunk出现卡顿或跳跃。DASH IF 为此引入了 UTU-Time 机制要求播放器和服务器都以 UTC 时间为基准协调整个直播的时间轴。落地时通常会配合 NTP 校准确保大家的“表”是对齐的。这也是它与 DVB 方案的一个隐性差异DVB 方案中时间同步的精度要求相对宽松而 DASH IF 路线想做到超低延迟时间校准几乎是个前置条件。3.3 对服务器和播放器的更高要求DASH IF 方案的“水龙头式”传输对服务器链路的要求比 DVB 高一个档次。源站必须真正支持 Chunked Transfer也就是在分片尚未完整时就持续向连接另一端写数据中间经过的 CDN 如果只是做简单缓存回源很可能无法保持这种流式行为要么把数据积攒到一定量再转发要么干脆退化成整文件交付。播放器端也有严格的解析要求要能对“还没结束的 MP4 流”持续解析说白了就是具备对 partial moof/mdat 的处理能力不是所有现成的 Web 播放器开箱就能支持。HTTP/2 刚兴起的时候大家还期待过利用服务器推送进一步压低延迟但实际工程中遇到的问题不少很多场景最后还是回到 HTTP/1.1 的 Chunked Transfer 来做。所以你现在去生产环境看DASH IF 方案很多落地案例用的还是 CMS 模式。3.4 优缺点上限高但代价也大DASH IF LL-DASH 最大的价值是它真正把 DASH 的延迟下限拉到了可以和同类低延迟传输协议掰手腕的水平接近甚至达到亚秒级体验适合体育赛事、电竞直播这类不能有一秒闪失的场景。传输效率也更高一次连接可以持续接收不用反复建连。代价就是复杂度。服务器要做 CMSCDN 要支持流式回源播放器要有更强的容错和解析能力。这些条件缺一个效果就容易大打折扣。在现有 CDN 不支持流式回源的情况下硬上 DASH IF 方案会让回源压力暴增边缘缓存也几乎报废。我见过一些团队在这条路上卡了几个月最后发现瓶颈不在打包器不在播放器而是中间层的 CDN 对 chunked 响应做了缓冲把流式传输硬生生又变回了批量下载。4. 两套规范的核心差异与选型逻辑两套方案讲完很多人会问那到底用 DVB 还是 DASH IF我的建议是先别急着二选一先看一张核心差异对比表再结合自己的链路现状做判断。对比维度DVB LL-DASHDASH IF LL-DASH核心机制SegmentBase HTTP Range 部分请求CMS 分块流式传输边生成边推送媒体封装基础CMAF / fMP4按 Chunk 切分CMAF / fMP4按 Part 切分并描述到 MPDMPD 关键字段availabilityTimeOffset、availabilityTimeComplete、SegmentBaseSegmentTimeline 与 Part 描述、UTU-Time、时钟同步相关字段服务器要求支持 Range 请求与部分字节返回支持 Chunked 流式输出最好有流式回源能力播放器要求支持 partial Segment 解析和 Range 轮询支持 Chunk 级流式解析与时间校准逻辑CDN 友好度较好Range 缓存机制成熟中等依赖 CDN 对 chunked 响应的支持延迟水平约 3 到 5 秒约 1 到 3 秒理想场景更低部署复杂度相对低相对高这几行字背后其实对应着完全不同的工程取舍。DVB 方案把复杂度集中在播放器侧服务器只要能吐部分字节剩下的都靠播放器频繁争取部署链路改动小很适合已经有成熟 DASH 基础设施、想快速把延迟从 10 秒降到 5 秒左右的团队。DASH IF 方案则是把重心转移到传输链路和服务器行为上想换取更好的延迟体验但前提是整个链路愿意为低延迟做出更多改造。我个人的看法是这两套规范不是替代关系在真实系统中甚至可以混用。比如先按 DVB 思路在 MPD 里加上 availabilityTimeOffset让播放器提前拉取部分 Segment如果链路允许再叠加 CMS 的支持能力让服务器用流式方式把后续 Chunk 补送给播放器。很多商业方案实际上就是这种混合形态既照顾了 CDN 兼容性又尽可能压低延迟。选择时还有一个容易被忽略的因素播放器的基线能力。如果你的目标播放环境是老式智能电视、低端机顶盒它们往往没有实现完善的 partial Segment 解析这时候谈 DASH IF 的 Chunk 级流式解析根本不现实。相反DVB 思路在 MPD 层面做改动播放器不认 availabilityTimeOffset 也可以退化成普通 DASH 行为不至于完全播不了兼容性容忍度高很多。5. 落地实操在现有 DASH 链路上叠加低延时能力理论讲再多最终都要落到工程实现。我在实际项目里总结了一套相对稳妥的落地流程从目标确认到参数调优你可以照着这个次序走一遍。5.1 第一步明确延迟目标动手改代码之前先想清楚要做 5 秒还是 1 秒。如果目标只是“别让用户觉得直播卡成 PPT”那 4 到 5 秒完全够用优先走 DVB 方向投入产出比最高。如果产品定位是体育赛事付费直播或者有连麦互动需求目标压到 2 秒以内那必须评估 DASH IF 所需的服务器和 CDN 条件。延迟目标决定了后面的所有技术选型这个步骤省不得。5.2 第二步确认打包器与 Chunk 粒度低延迟 DASH 需要打包器支持 CMAF 输出并且能够控制 Chunk 的切分粒度。建议先确认你的打包器能否把 Chunk 粒度控制在 100ms 到 500ms 范围内。Part 时长是个挺讲究的参数设太短弱网环境下会出现大量小传输单元缓存效率低反而增加卡顿概率设太长比如 1 秒以上低延迟优势被稀释跟传统 DASH 差别不大。我通常建议从 250ms 到 500ms 起步跑通后再微调。5.3 第三步修改 MPD 参数这一步是大多数 DVB 路线项目的核心动作。在 MPD 里给 Segment 增加 availabilityTimeOffset同时设置 availabilityTimeComplete 的取值。offset 的取值和 Segment 时长、Chunk 粒度有关基本原则是让播放器能够在第一个 Chunk 落到服务器时就具备发起请求的条件。避免把 offset 设得过大否则播放器提前请求时服务器还没有任何可用字节会产生大量 416 Requested Range Not Satisfiable 错误白白增加日志和开销。5.4 第四步确认服务器与 CDN 的真实行为配置改完之后一定要用真实链路验证服务器行为。如果是源站直连检查服务器是否按 Range 请求返回 206生成中的 Segment 是否可部分访问。如果流量走 CDN必须特别注意边缘节点对动态内容、Range 请求、Chunked 响应的处理策略。常见坑是源站已经支持部分可用但 CDN 因为缓存了旧的分片字节导致回源频率异常或边缘内容不更新。你可以在测试时对比直连源站与走 CDN 的延迟曲线如果差距大问题大概率出在 CDN 层。5.5 第五步播放器适配与配置播放器端要做两件事。第一确认播放器开启了低延迟模式或者使用了支持 partial Segment 解析的版本。很多开源播放器默认行为还是“等完整 Segment”需要显式开启相关配置或切换到低延迟特性分支。第二把播放器的启动缓冲和实时缓冲目标调小。传统播放器为了流畅会默认攒 3 到 5 秒缓冲如果不调前面在 MPD 和服务端省下的时间会在这里全吐回去。比较合理的起始配置是启动缓冲控制在 1 秒以内实时缓冲目标在 1 到 2 秒。5.6 参数速查与常见调优建议参数建议起始值调优方向Part/Chunk 时长250ms 到 500ms延迟偏高就减小卡顿增加就加大availabilityTimeOffsetSegment 时长减一个 Chunk 时长再略收紧出现 416 就放松延迟高就收紧播放器启动缓冲500ms 到 1s网络不稳就增加延迟要求高就减小播放器实时缓冲1s 到 2s优先级缓冲稳定性高于极限低延迟CDN 上的 Segment TTL2 到 5 秒太短会增加回源压力太长会放大延迟6. 常见问题与排查技巧实录低延迟 DASH 的排查比普通 DASH 麻烦因为问题经常出现在“时间的缝隙”里。我把项目里遇到过的高频问题整理成一份速查表希望你少走弯路。现象可能原因排查与处理思路播放器一直缓冲不进入播放播放器不支持 partial Segment 解析或 MPD 中 availabilityTimeComplete 被设置为等待完整先看播放器网络请求是否在持续请求 part确认播放器配置是否开启低延迟模式延迟始终在七八秒以上服务器没有真正输出部分可用Chunk 粒度太大播放器缓冲目标过高检查服务器返回是 200 完整响应还是 206 部分响应缩小 Part减小播放器缓冲请求大量返回 416availabilityTimeOffset 设置过大播放器请求早于服务器生成加大 offset 余量或让服务器端对未生成部分返回可重试的空响应CDN 缓存导致内容不更新边缘节点缓存了旧的 range 字节源站新 Chunk 无法透出缩小 CDN 对媒体分片的 TTL检查 CDN 是否支持按时间参数做缓存 key播放过程中频繁卡顿缓冲时高时低服务器推送间隔不稳定CDN 对 chunked 响应做了二次缓冲看抓包是否出现大量分段延迟找 CDN 确认对 chunked transfer 的处理方式时间轴漂移画面与声音不同步播放器和服务器时钟不一致UTU-Time 同步失败确认双方 NTP 校准检查 MPD 时间与系统时钟偏差实际排查时我有个习惯动作先打开浏览器开发者工具看网络面板。如果看到播放器每隔几百毫秒就发一个 Range 请求说明它在走 DVB 式轮询如果看到响应是 Chunked没有明确的 Content-Length那基本是在走 CMS。这两种行为的差距第一时间就能帮你判断当前处于哪个模式的链路。再看服务器日志统计 206 和 416 的比例如果 416 比例高多半是时间参数没对齐优先检查 availabilityTimeOffset 的设置。还有一个容易被忽视的坑不要把服务端生成的 Chunk 时长和 MPD 里的描述搞得不一致。打包器实际切成 300ms 一个 Chunk但 MPD 里 part 时长写成了 600ms播放器会按错误的节奏去判断数据可用性导致该省的时间全耗在等待上。这类问题用眼睛看代码很难发现最有效的办法是抓包对比实际数据到达时间和 MPD 中描述的时间轴是否吻合。最后再分享一点个人体会。我最初做低延迟改造的时候一上来就追求 1 秒以内的极限延迟结果在弱网环境和部分 CDN 链路上频繁翻车用户反馈的卡顿比原先 10 秒延迟时还多。后来学乖了把目标定为“稳定地做到 4 秒以内再逐步向 2 秒试探”整个链路的容错空间大了不少。低延迟是有价值的但直播这类场景里稳定永远比极限数值重要。如果团队刚刚接触低延时 DASH建议先从 DVB 方向的 MPD 参数和 Chunk 粒度入手把链路的基础行为摸透再评估要不要上 DASH IF 的流式方案。规范怎么选是第一步真正见功夫的是后续那些参数调优和问题排查的过程。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑