Javascript 从mediasource sourcebuffer动态附加和删除mpeg短划线段

Javascript 从mediasource sourcebuffer动态附加和删除mpeg短划线段,javascript,media-source,mpeg-dash,Javascript,Media Source,Mpeg Dash,我正在使用HTML5视频元素编写一个简单的mpeg dash流媒体播放器。 我正在创建MediaSource,并在其中附加SourceBuffer。然后我将破折号片段添加到这个sourcebuffer中,一切都正常工作 现在,我想做的是,我想根据媒体元素的当前时间动态地预取这些片段。 在这样做的过程中,有很多疑问,这些疑问没有得到文件的回答 是否有可能知道sourceBuffer一次可以支持多少数据?如果我有一个非常大的视频,并将所有片段附加到sourcebuffer中,它会容纳所有片段还是会导

我正在使用HTML5视频元素编写一个简单的mpeg dash流媒体播放器。 我正在创建
MediaSource
,并在其中附加
SourceBuffer
。然后我将破折号片段添加到这个sourcebuffer中,一切都正常工作

现在,我想做的是,我想根据媒体元素的当前时间动态地预取这些片段。 在这样做的过程中,有很多疑问,这些疑问没有得到文件的回答

  • 是否有可能知道sourceBuffer一次可以支持多少数据?如果我有一个非常大的视频,并将所有片段附加到sourcebuffer中,它会容纳所有片段还是会导致错误,或者会降低我的浏览器速度

  • 如何计算sourcebuffer中的片段数

  • 如何计算
    SourceBuffer
    中最后一段的显示时间或结束时间

  • 如何仅从
    SourceBuffer
    中删除特定的片段集,并用具有其他分辨率的片段替换它们?(我想这样做是为了支持自适应分辨率切换运行时。)


  • 谢谢。

    sourceBuffer可以支持的数据量取决于MSE实现,因此取决于浏览器供应商。一旦达到最大值,这当然会导致错误

    无法直接获取SourceBuffer中的段数,但可以获取实际的缓冲时间。结合分段的持续时间,您可以计算它

    我建议您看看开放源码的DASH player项目,比如or,它实现了您想要的所有功能。或者甚至可以使用商业解决方案,如

  • 缓冲数据的最大数量是一个实现细节,不会以任何方式公开给开发人员,附加新数据时,浏览器将执行,删除浏览器认为不必要的任何缓冲数据。浏览器倾向于删除已经播放过的流的任何部分,而不删除将来与播放相关的流的任何部分。这意味着,如果流非常大,dash player下载它的速度非常快,超过MSE的播放速度,那么将有大量流无法被删除,这可能会导致方法抛出错误。当然,一个优秀的短跑运动员应该监控数据量,而不是下载过多的数据

    纯文本:你没有什么可担心的,除非你的播放器在不考虑当前数量的情况下尽快下载所有流

  • MSE API使用数据流(音频或视频)。它不了解分段。理论上,您可以使用MPD中提供的计时数据获取时间范围并映射到一对段。但这是脆弱的。更好的方法是跟踪下载和反馈的片段

  • 看看这房子。获取最后附加段的结束时间(以秒为单位)的最简单方法是:
    videoElement.buffered.end(0)

    如果
    表示时间
    指的是最后一个缓冲帧的时间,那么除了解析流本身之外,没有其他方法可以做到这一点

  • 要删除缓冲数据,可以使用以下方法

    质量切换
    实际上相当容易,尽管规范没有对此做太多说明。要切换质量,您只需将新质量的init头添加到
    SourceBuffer
    。之后,您可以像往常一样附加新质量的段


  • 我个人认为这是一个学习的好地方。

    关于第1点:这就是用户代理应该做的,但是在目前,他们似乎做得并不好。其中,我从来没有在Chrome中看到过
    quotaExceedeError
    ,你甚至可以看到
    throw
    异常在中被注释掉。目前,您可能需要实现自己的缓冲区管理。我在Electron 3.0.4(铬衍生物)中遇到了
    quotaExceedeError