如何区分两个“暂停”事件-由单击“暂停”按钮引起,还是由到达媒体片段末尾引起?

问题描述 投票:5回答:2

[如果用户想停止HTML5媒体,例如通过单击“暂停”本机控制按钮,我们将收到“ onpause”事件。同时,如果媒体元素到达指定片段的末尾,它将自动触发相同的“ onpause”事件。是否可以将一个彼此分开?在JQuery样式中,

<video id="video1" src="url/video.webm#t=10,20" controls></video>

<script type="text/javascript">
  $(window).load(function () { 
    $('#video1').on("manualpause", function () {
      alert("you paused this media manually!");
    });
    $('#video1').on("fragmentend", function () {
      alert("you've reached the end of the fragment! your media is now paused automatically!");
    });
  });
</script>

我试图利用“ ontimeupdate”事件,但拒绝了:我想在发生自动暂停(由于到达片段末尾而引起的确切反应)。

javascript html5 html5-video html5-audio
2个回答
2
投票

只有完整的曲目结束时才会发出结束事件。当您播放片段时,由于音轨本身尚未结束(除非片段的结束时间也恰好是结束),所以它只会在片段的结尾暂停曲目。

媒体元素被暂停,当用户对其进行交互时paused属性为false,readyState属性为HAVE_FUTURE_DATA或HAVE_ENOUGH_DATA,并且用户代理已达到用户必须在媒体资源中进行选择的位置资源继续。

仅在以下情况下才会发生结束事件:

媒体元素在以下情况下已结束播放:

元素的readyState属性为HAVE_METADATA或更大,并且

任何一个:

  • 当前播放位置是媒体资源的结尾,并且
  • 播放方向是向前,
  • 要么media元素没有指定循环属性,要么media元素具有当前的媒体控制器。
  • 或:
    • 当前播放位置是最早的位置,并且
  • 播放方向向后。

Source

要检测暂停事件是否是由于片段结束而触发的,您可以将currentTime与片段结束时间进行比较(是的,理论上,您也有可能在此时恰好按下暂停按钮,但是除非事件本身具有一个秘密的属性以显示暂停的源,而我不知道,否则它将与您使用audio元素所获得的接近。]

由于我们正在处理浮点值,因此需要使用epsilon比较时间。假设您parse或其他明智的方法可以获取片段的结束时间,则可以执行以下操作:

function onPauseHandler(e) {
    var fragmentEndTime = ...;   // get/parse end-fragment into this var
    if (isEqual(this.currentTime, fragmentEndTime)) {
      // likely that fragment ended
    }
    else {
      // a manual pause
    }
}

function isEqual(n1, n2) {
   return Math.abs(n1 - n2) < 0.00001
}

0
投票

今天,当我搜索“为什么发生暂停时为什么会暂停时也会出现这种情况”。

© www.soinside.com 2019 - 2024. All rights reserved.