从媒体源源缓冲区动态追加和删除 mpeg-dash 片段

问题描述 投票:0回答:2

我正在使用 HTML5 视频元素编写一个简单的 mpeg-dash 流播放器。 我正在创建

MediaSource
并在其上附加
SourceBuffer
。然后我将破折号片段附加到这个源缓冲区中,一切正常。

现在,我想做的是,我想根据媒体元素的当前时间动态预取这些片段。 在这样做的同时,存在很多疑问,并且 MediaSource 文档没有解答这些疑问。

  1. 是否可以知道SourceBuffer一次可以支持多少数据?如果我有一个非常大的视频并将所有片段附加到源缓冲区中,它会容纳所有片段或导致错误或会减慢我的浏览器速度吗?

  2. 如何计算源缓冲区中的片段数量?

  3. 如何计算

    SourceBuffer
    中最后一段的呈现时间或结束时间?

  4. 我们如何从

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

谢谢。

javascript media-source mpeg-dash
2个回答
6
投票
  1. 最大缓冲数据量是一个实现细节,据我所知,不会以任何方式向开发人员公开。 根据规范,当附加新数据时,浏览器将执行编码帧驱逐算法,该算法会删除浏览器认为不必要的任何缓冲数据。浏览器倾向于删除已经播放过的流的任何部分,并且不会删除相对于当前时间未来的流部分。这意味着,如果流非常大,并且 dash 播放器下载它的速度非常快,比 MSE 播放它的速度快,那么将会有很多流无法通过 编码帧逐出算法 删除,这可能导致 append buffer 方法抛出 QuotaExceededError。当然,一个好的破折号播放器应该监控缓冲量并且不要下载过多的数据。

    纯文本:您无需担心,除非您的播放器在不考虑当前缓冲量的情况下尽快下载所有流。

  2. MSE API 使用数据流(音频或视频)。它不了解分段。理论上,您可以使用 MPD 中提供的计时数据获取“缓冲”时间范围并映射到一对段。但这是脆弱的恕我直言。更好的是跟踪下载和馈送的片段。

  3. 查看
  4. buffered

    属性。获取最后附加片段的结束时间(以秒为单位)的最简单方法很简单:videoElement.buffered.end(0)

    如果 

    presentation time

    指的是最后一个缓冲帧的

    Presentation TimeStamp
    ,那么除了解析流本身之外,没有其他方法可以做到这一点。

  5. 要删除缓冲数据,您可以使用
  6. remove

    方法。

    Quality switching

    实际上非常简单,尽管规范并没有对此说太多。要切换质量,您唯一要做的就是将新质量的初始化标头

    附加
    SourceBuffer。之后,您可以照常附加新质量的片段。
    
    

  7. 我个人认为
youtube dash mse测试播放器

是一个学习的好地方。


0
投票

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

我建议查看开源 DASH 播放器项目,例如

dashjs

ExoPlayer,它们实现了您想要的所有功能。或者甚至可以使用像 bitdash 这样的商业解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.