Java mp4parser生成MPEG-DASH m4s片段出现序列不连续错误
错误原因
- MPEG-DASH规范默认要求,与初始化分段(xxx-IS.mp4)配套的首个媒体分片的序列编号必须从0开始,你当前首个.m4s分片的内置序列编号为163497124,和播放器默认预期的起始值0不匹配,因此触发序列不连续报错。
- 你把初始化分段和所有.m4s分片拼接成完整文件能正常播放,是因为拼接后的文件是标准的fMP4格式,播放器不需要校验分片序列的连续性,直接读取整体文件的索引信息即可播放;但在DASH流媒体场景下,播放器是按需拉取单个分片,会严格校验每个分片moof盒子内的sequence_number字段与MPD清单声明的起始序号是否匹配,不一致就会抛出该错误。
- 还有一种可能是你的MPD清单中对应音轨的分片配置没有显式设置startNumber属性,默认采用0作为起始值,和你实际分片的序列起始值不匹配。
修复方案
你可以根据业务需求选择以下任意一种方案:
方案一:对齐规范默认值
调整自定义分片构建类的序列编号生成逻辑即可。你当前代码中传入ChunkFragmentM4sBuilder构造函数的seqNum参数,就是对应分片内置的sequence_number值,修改为首个分片传0,后续分片依次递加1,让分片内置序列编号和DASH规范默认的起始值对齐。
方案二:修改MPD配置适配现有分片
如果你的业务场景需要保留当前的大序列编号(比如用时间戳作为分片序号方便去重、定位),不需要修改分片生成逻辑,只需要修改MPD清单中对应AdaptationSet节点下的startNumber属性,将值设置为你首个分片的实际序列编号163497124,告知播放器不需要从0开始校验序列即可。
验证方法
你可以用mp4info工具查看每个.m4s分片moof盒子内的sequence_number字段值,确认和你传入的seqNum一致,同时核对MPD内的startNumber值与首个分片的sequence_number值相等,调整完成后再用VLC播放即可消除该报错。
内容的提问来源于stack exchange,提问作者Nick Charney Kaye
相关产品推荐
相关产品推荐

