3

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

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

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

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

  3. 如何计算最后一段的呈现时间或结束时间SourceBuffer

  4. 我们如何只删除特定的片段集SourceBuffer并用其他分辨率的片段替换它们?(我想做它来支持自适应分辨率切换运行时间。)

谢谢。

4

2 回答 2

5
  1. 缓冲数据的最大数量是一个实现细节,不会以任何方式向开发人员公开 AFAIK。根据规范,当添加新数据时,浏览器将执行编码帧驱逐算法,该算法会删除浏览器认为不必要的任何缓冲数据。浏览器倾向于删除流中已经播放的任何部分,并且不删除流中相对于当前时间在未来的部分。这意味着如果流非常大,并且 dash 播放器下载它的速度非常快,比 MSE 播放它的速度快,那么就会有很多流无法被编码帧驱逐算法删除,这可能会导致附加缓冲区抛出QuotaExceededError的方法。当然,一个好的仪表板播放器应该监控缓冲量,而不是下载过多的数据。

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

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

  3. 查看缓冲属性。以秒为单位获取最后附加段的结束时间的最简单方法是:videoElement.buffered.end(0)

    如果presentation time你的意思是Presentation TimeStamp最后一个缓冲的帧,那么除了解析流本身之外没有办法做到这一点。

  4. 要删除缓冲数据,您可以使用remove方法。

    Quality switching实际上很容易,尽管规范并没有说太多。要切换质量,您唯一需要做的就是将新质量的 init 标头附加SourceBuffer到. 之后,您可以像往常一样附加新质量的段。

我个人认为youtube dash mse 测试播放器是一个学习的好地方。

于 2015-04-14T16:55:41.037 回答
0

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

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

我建议查看开源 DASH 播放器项目,如dashjsExoPlayer,它们实现了您所需的所有功能。或者甚至可以使用像bitdash这样的商业解决方案。

于 2015-04-03T12:31:59.730 回答