为什么MPEG-DASH播放请求的段编号是SegmentTemplate的startNumber的2倍
问题原因分析
- 核心触发点:你使用的是
type="dynamic"的直播类DASH流,遵循isoff-live:2011配置规范,这类MPD强制要求配置availabilityStartTime属性,用于告知播放器流的起始时间基准,从而正确计算当前可请求的段号。你当前的MPD未配置该属性,VLC的DASH解析模块在无有效时间基准的 fallback 逻辑中,错误将你配置的startNumber值翻倍作为初始段的请求编号,刚好匹配你观测到的现象。 - 次要诱因:你配置的
SegmentTemplate时间刻度不符合常规规范,将timescale设为1、duration设为10来表示单段10秒,虽然语法上没有错误,但音频流的timescale通常和采样率48000对齐,duration对应设为480000表示10秒时长,你当前的配置放大了不同播放器的解析兼容风险,也是触发VLC计算错误的重要原因。
修复方案
- 在
<MPD>根标签中添加availabilityStartTime属性,取值为你的流第一个片段生成的UTC时间,格式为ISO8601,示例如下:
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" ... availabilityStartTime="2024-05-01T12:00:00Z">
- 补充动态DASH必填的其他属性:
publishTime(当前MPD发布的UTC时间)、timeShiftBufferDepth(时移缓冲区时长,比如PT300S表示支持5分钟时移),完全符合isoff-live规范要求。 - 调整
SegmentTemplate配置消除时间单位歧义,将timescale改为和音频采样率一致的48000,duration改为480000(对应10秒单段时长),避免播放器做时间单位转换时出错。 - 如果你使用的是VLC 3.0.x稳定版,也可以尝试升级到4.x预览版验证,该版本已经修复了部分低timescale场景下的段号计算bug。
内容的提问来源于stack exchange,提问作者Nick Charney Kaye
相关产品推荐
相关产品推荐

