从mediasource sourcebuffer动态附加和删除mpeg-dash段

时间:2015-04-01 06:08:45

标签: javascript media-source mpeg-dash

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

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

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

  2. 如何计算sourcebuffer中的片段数量?

  3. 如何计算SourceBuffer中最后一段的展示时间或结束时间?

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

  5. 感谢。

2 个答案:

答案 0 :(得分:4)

  1. 缓冲数据的最大数量是实现细节,不会以任何方式向开发人员公开AFAIK。 According to the spec,当附加新数据时,浏览器将执行coded frame eviction algorithm,删除浏览器认为不必要的任何缓冲数据。浏览器倾向于删除已经播放的流的任何部分,并且不会删除将来相对于current time的部分流。这意味着如果流非常大并且破折号播放器以非常快的速度下载它,比MSE可以更快地播放它,那么coded frame eviction algorithm将会有很多无法删除的流,这可能会导致抛出append bufferQuotaExceededError方法。当然,优秀的破折号玩家应该监控buffered金额,而不是下载过多的数据。

    明文:您无需担心,除非您的播放器尽快下载所有流,而不考虑当前的buffered金额。

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

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

    如果presentation time表示最后一个缓冲帧的Presentation TimeStamp,那么除了解析流本身之外无法做到这一点。

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

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

  5. 我个人认为youtube dash mse test player是一个值得学习的好地方。

答案 1 :(得分:0)

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

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

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