设置currentTime是否总是触发canplay?

时间:2015-11-20 16:12:22

标签: html5-video

我无法在线找到确切的答案。我得到的最接近的是canplay事件的description

  

用户代理可以恢复媒体数据的播放,但估计如果现在要开始播放,则媒体资源无法以当前播放速率呈现直至其结束而不必停止进一步缓冲内容。

这是我的代码

// fyi at this point i just loaded the video from an <input>. the currentTime is 0.
var posterFrame = 3;
var longEnough = vid.duration >= posterFrame;

vid.oncanplay = function () { getThumb.apply(self); }
vid.currentTime = longEnough ? posterFrame : 0;

它适用于我,但我担心有时设置currentTime不会触发oncanplay,整个事情就会停止。

1 个答案:

答案 0 :(得分:1)

在编写自己的html5视频播放器时,我遇到了同样的问题。进一步搜索引导我看到这个错误报告:

https://bugzilla.mozilla.org/show_bug.cgi?id=773885

这表明这种行为是对错误报告664842的欺骗行为。虽然664842是针对相关的“canplaythrough&#39;”,但Mozilla开发者还是有相关的讨论:

  

规范说:当&#34; readyState新近等于HAVE_ENOUGH_DATA时,canplaythrough会触发。&#34;。

     

在其他地方它说&#34;当networkState不是NETWORK_EMPTY的媒体元素的就绪状态发生变化时,用户代理必须遵循下面给出的步骤:[...]如果新的就绪状态是HAVE_ENOUGH_DATA [.. 。]用户代理必须最终对任务进行排队,以触发名为canplaythrough的简单事件。&#34;

有一个后续请求,以使canplay&amp;可以在这里播放一次事件:

https://www.w3.org/Bugs/Public/show_bug.cgi?id=12982

表示行为不会被改变。

  

Firefox将规范解释为允许canplay / canplaythrough在readyState更改允许的情况下多次触发。这种解释很有用,因为可以根据估计的传输完成时间乐观地激发canplaythrough。例如,如果网络条件或媒体的比特率发生变化,则该估计可能变得无效。通过在条件发生变化时移入和移出HAVE_ENOUGH_DATA(以及触发相关事件)来发出状态变化是很有用的。

     如果搜索位置位于需要新网络请求传输或重要解码工作的媒体的无缓冲段中,则寻求媒体中的新位置可能导致先前的可玩性估计变为无效。如果在寻找已经缓冲的范围时也触发了这些事件,那么它变得更加一致(因此更容易编码)。

虽然该讨论是从2011年开始的,但考虑到行为似乎仍在实施,我认为可以肯定地说,是的,它应该总是触发它,只要你不通过它任何奇怪的空媒体。