从 mediasource sourcebuffer 中动态附加和删除 mpeg-dash 片段
Dynamically append and remove mpeg-dash segments from mediasource sourcebuffer
我正在使用 HTML5 视频元素编写一个简单的 mpeg-dash 流媒体播放器。
我正在创建 MediaSource
并向其附加 SourceBuffer
。然后我将破折号片段附加到这个 sourcebuffer 中,一切正常。
现在,我想做的是,我想根据媒体元素的当前时间动态预取这些片段。
这样做有很多疑问,MediaSource 文档没有回答。
是否可以知道sourceBuffer一次可以支持多少数据?如果我有一个非常大的视频并将所有片段附加到 sourcebuffer 中,它会容纳所有片段或导致错误还是会降低我的浏览器速度?
如何计算源缓冲区中的片段数?
如何计算SourceBuffer
中最后一段的呈现时间或结束时间?
我们如何从 SourceBuffer
中仅删除特定的片段集并用其他分辨率的片段替换它们? (我想做的是支持自适应分辨率切换运行次。)
谢谢。
sourceBuffer 可以支持的数据量取决于 MSE 实现,因此取决于浏览器供应商。一旦达到最大值,这当然会导致错误。
无法直接获取SourceBuffer中的段数,但可以获取实际缓冲的时间。结合片段的持续时间,您可以计算出它。
我建议看看 dashjs or ExoPlayer, which implement all your desired functionalities. Or maybe even use a commercial solution like bitdash 等开源 DASH 播放器项目。
最大缓冲数据量是一个实现细节,不会以任何方式向开发人员公开 AFAIK。 According to the spec, when appending new data the browser will execute the coded frame eviction algorithm which removes any buffered data deemed unnecessary by the browser. Browsers tend to remove any part of the stream that has already been played and don't remove parts of the stream that are in the future relative to current time. This means that if the stream is very large and the dash player downloads it very quickly, faster than the MSE can play it, then there will be a lot of the stream that cannot be remove by the coded frame eviction algorithm and this may cause the append buffer method to throw a QuotaExceededError. Of course a good dash player should monitor the buffered 量而不是下载过多的数据。
纯文本:您无需担心,除非您的播放器尽快下载所有流而不考虑当前的 buffered 数量。
MSE API 处理数据流(音频或视频)。它不知道段。理论上,您可以获得 buffered 时间范围并使用 MPD 中提供的计时数据映射到一对段。但恕我直言,这是脆弱的。更好的办法是跟踪下载和馈送的段。
看看buffered属性。以秒为单位获取最后附加段的结束时间的最简单方法很简单:videoElement.buffered.end(0)
如果 presentation time
你指的是最后一个缓冲帧的 Presentation TimeStamp
那么除了解析流本身之外别无他法。
要删除缓冲数据,您可以使用 remove 方法。
Quality switching
实际上很简单,尽管规范没有说明太多。要切换品质,您唯一需要做的就是 append 将新品质的初始化 header 更改为 SourceBuffer
。之后,您可以像往常一样附加新质量的片段。
我个人认为 youtube dash mse test player 是学习的好地方。
我正在使用 HTML5 视频元素编写一个简单的 mpeg-dash 流媒体播放器。
我正在创建 MediaSource
并向其附加 SourceBuffer
。然后我将破折号片段附加到这个 sourcebuffer 中,一切正常。
现在,我想做的是,我想根据媒体元素的当前时间动态预取这些片段。 这样做有很多疑问,MediaSource 文档没有回答。
是否可以知道sourceBuffer一次可以支持多少数据?如果我有一个非常大的视频并将所有片段附加到 sourcebuffer 中,它会容纳所有片段或导致错误还是会降低我的浏览器速度?
如何计算源缓冲区中的片段数?
如何计算
SourceBuffer
中最后一段的呈现时间或结束时间?我们如何从
SourceBuffer
中仅删除特定的片段集并用其他分辨率的片段替换它们? (我想做的是支持自适应分辨率切换运行次。)
谢谢。
sourceBuffer 可以支持的数据量取决于 MSE 实现,因此取决于浏览器供应商。一旦达到最大值,这当然会导致错误。
无法直接获取SourceBuffer中的段数,但可以获取实际缓冲的时间。结合片段的持续时间,您可以计算出它。
我建议看看 dashjs or ExoPlayer, which implement all your desired functionalities. Or maybe even use a commercial solution like bitdash 等开源 DASH 播放器项目。
最大缓冲数据量是一个实现细节,不会以任何方式向开发人员公开 AFAIK。 According to the spec, when appending new data the browser will execute the coded frame eviction algorithm which removes any buffered data deemed unnecessary by the browser. Browsers tend to remove any part of the stream that has already been played and don't remove parts of the stream that are in the future relative to current time. This means that if the stream is very large and the dash player downloads it very quickly, faster than the MSE can play it, then there will be a lot of the stream that cannot be remove by the coded frame eviction algorithm and this may cause the append buffer method to throw a QuotaExceededError. Of course a good dash player should monitor the buffered 量而不是下载过多的数据。
纯文本:您无需担心,除非您的播放器尽快下载所有流而不考虑当前的 buffered 数量。
MSE API 处理数据流(音频或视频)。它不知道段。理论上,您可以获得 buffered 时间范围并使用 MPD 中提供的计时数据映射到一对段。但恕我直言,这是脆弱的。更好的办法是跟踪下载和馈送的段。
看看buffered属性。以秒为单位获取最后附加段的结束时间的最简单方法很简单:
videoElement.buffered.end(0)
如果
presentation time
你指的是最后一个缓冲帧的Presentation TimeStamp
那么除了解析流本身之外别无他法。要删除缓冲数据,您可以使用 remove 方法。
Quality switching
实际上很简单,尽管规范没有说明太多。要切换品质,您唯一需要做的就是 append 将新品质的初始化 header 更改为SourceBuffer
。之后,您可以像往常一样附加新质量的片段。
我个人认为 youtube dash mse test player 是学习的好地方。