MSE seeking
kelvin 发布于 2024-01-01

当用户代理被要求在媒体资源中寻找特定的新播放位置时,可选地设置了近似速度标志,这意味着用户代理必须运行以下步骤。该算法与事件循环机制密切交互;特别是,它有一个同步部分(作为事件循环算法的一部分触发)。该部分中的步骤用⌛标记。

将媒体元素的节目海报标志设置为false。

如果媒体元素的readyState为HAVE_NOTHING,则返回。

如果元素的seeking IDL属性为true,则该算法的另一个实例已经在运行。中止算法的另一个实例,而无需等待它正在运行的步骤完成。

将seeking IDL属性设置为true。

如果查找是对DOM方法调用或IDL属性设置的响应,则继续执行脚本。这些步骤的其余部分必须并行运行。除了用⌛标记的步骤外,它们可以随时被调用的该算法的另一个实例中止。

如果新的播放位置晚于媒体资源的末尾,则让它成为媒体资源的结尾。

如果新的播放位置小于最早可能的位置,则改为该位置。

如果(现在可能已更改)新播放位置不在可查找属性中给定的范围之一中,则将其设为最接近新播放位置的可查找属性给定范围之一中的位置。如果两个位置都满足该约束(即,新的回放位置正好位于可查找属性中两个范围之间的中间),则使用关闭的位置

如果设置了近似速度标志,则将新的播放位置调整为允许立即恢复播放的值。如果此步骤之前的新播放位置在当前播放位置之前,则调整后的新播放定位也必须在当前播放定位之前。类似地,如果此步骤之前的新播放位置在当前播放位置之后,则调整后的新播放定位也必须在当前播放定位之后。

例如,用户代理可以捕捉到附近的关键帧,这样它就不必在恢复播放之前花费时间解码然后丢弃中间帧。

将给定媒体元素的媒体元素任务排队,以在该元素处激发名为“seeking”的事件。

将当前播放位置设置为新的播放位置。

如果媒体元素在开始查找之前可能正在播放,但查找导致其readyState属性更改为低于HAVE_FUETURE_DATA的值,则会在该元素处触发等待事件。

此步骤设置当前播放位置,因此可以立即触发其他条件,例如关于何时播放“到达媒体资源的末尾”(处理循环的逻辑的一部分)的规则,甚至在用户代理实际能够呈现该位置的媒体数据之前(如下一步所确定的)。

currentTime属性返回官方播放位置,而不是当前播放位置,因此会在脚本执行之前更新,与此算法无关。

等待,直到用户代理已经确定新播放位置的媒体数据是否可用,如果可用,直到它已经解码了足够的数据来播放该位置。

等待一个稳定的状态。同步部分由该算法的所有剩余步骤组成。(同步段中的步骤用⌛标记。)

⌛将查找IDL属性设置为false。

⌛在台阶上进行时间行军。

⌛对给定媒体元素的媒体元素任务进行排队,以便在该元素处激发名为timeupdate的事件。

 

⌛对给定媒体元素的媒体元素任务进行排队,以在元素处激发名为seeked的事件。

可查找属性必须返回一个新的静态规范化TimeRanges对象,该对象表示用户代理在评估该属性时能够查找的媒体资源的范围(如果有的话)。

如果用户代理可以搜索媒体资源中的任何位置,例如因为它是一个简单的电影文件,并且用户代理和服务器支持HTTP范围请求,那么该属性将返回一个具有一个范围的对象,其开始是第一帧的时间(最早可能的位置,通常为零),并且其结束与第一帧的时间加上持续时间属性的值相同(该值将等于最后一帧的时间,并且可能是正无穷大)。

范围可能不断变化,例如,如果用户代理正在缓冲无限流上的滑动窗口。例如,DVR在观看电视直播时就会出现这种行为。

每次返回一个新对象对于属性getter来说是一种糟糕的模式,并且只会在这里体现出来

媒体资源可能是内部脚本或交互式的。因此,媒体元素可以以非线性的方式发挥作用。如果发生这种情况,当当前播放位置以不连续的方式发生变化时,用户代理必须表现得好像使用了搜索算法一样(从而触发相关事件)。

kelvin
关注 私信
文章
92
关注
0
粉丝
0