我正在尝试使用 MediaSource 播放两个单独的流(音频和视频)。我已经成功地按任意大小的顺序附加了它们的缓冲区(通过 XHR 检索的 ArrayBuffer 类型):
- 大小相同的 XXX 字节 block
- 随机大小的 XXX 字节 block
- 转换为字节的 XXX 秒 block
视频和音频播放完美且同步,所有范围均已正确翻译。对于这些测试,我使用我收藏的 YouTube 编码视频、webm 格式和 vp9 编解码器。
然而,问题来自于在加载片段之前搜索播放器的搜索场景,我想从该点或该点之后附近加载它们,而不是这个新片段与任何先前附加的缓冲区顺序排列。
我尝试了一个明显的想法,即简单地假设 MediaSource 会识别新缓冲区应附加到的段位置,因此我的尝试只是获取与查找的时间间隔相关的流数据并将其附加到缓冲区,但是它不起作用并出现以下错误:
Uncaught InvalidStateError: Failed to execute 'appendBuffer' on 'SourceBuffer':
The HTMLMediaElement.error attribute is not null.
我一直在尝试为此寻找解决方案,尝试了 timestampOffset
和 appendWindowStart
+ appendWindowEnd
无济于事。
我在文档中找不到如何将缓冲区附加到顺序顺序以外的位置,我将不胜感激任何帮助,如果可能的话,我将不胜感激对过程本身的简短解释。
最佳答案
似乎我想做的事是可能的,但不是我做事的方式。正确编码的 DASH 流媒体文件应包含 SIDX(片段索引框)信息,这基本上是视频片段详细信息,存在于视频(或音频)本身的文件开头/标题处,或列在独立的 .mpd 文件中以 xml 格式。这些片段中的每一个都包含允许 MSE(MediaSource 扩展)播放未链接到先前附加缓冲区的附加片段的正确信息。
关于javascript - 不同位置的 MediaSource appendBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37106210/