4

我正在尝试使用 MediaSource 播放两个单独的流(音频和视频)。我已经成功地以任意大小的顺序附加了它们的缓冲区(通过 XHR 检索的 ArrayBuffer 类型):

  • 大小相等的 XXX 字节块
  • 随机大小的 XXX 字节块
  • 将 XXX 秒的块转换为字节

视频和音频完美同步播放,所有范围都正确翻译。对于这些测试,我使用我收藏的 YouTube 编码视频、webm 格式和 vp9 编解码器。

然而,问题出现在寻找播放器的场景中,在该场景中,玩家在加载的段之前被寻找,我想从该点或该点之后的附近加载它们,而这个新段与任何先前附加的缓冲区没有顺序。

我尝试了一个明显的想法,即简单地假设 MediaSource 会识别应该附加新缓冲区的段位置,所以我的尝试只是获取与所寻找的时间间隔相关的流数据并将其附加到缓冲区,但它没有工作并发生以下错误:

Uncaught InvalidStateError: Failed to execute 'appendBuffer' on 'SourceBuffer':
The HTMLMediaElement.error attribute is not null.

我一直在尝试为此找到解决方案,尝试过timestampOffsetappendWindowStart无济于事appendWindowEnd

我在文档中找不到如何将缓冲区附加到顺序以外的位置,我将不胜感激任何帮助,如果可能的话,对过程本身进行一个小的解释。

4

1 回答 1

3

看起来我想做的事情是可能的,但不是我做的方式。DASH 流的正确编码文件应包含 SIDX(片段索引框)信息,这基本上是视频片段详细信息,这些详细信息存在于文件开头/标题处的视频(或音频)本身内部,或列在独立的 .mpd 文件中用xml格式。这些段中的每一个都包含允许 MSE(MediaSource 扩展)播放未链接到先前附加缓冲区的附加段的正确信息。

于 2016-05-14T17:59:02.003 回答