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

时间:2015-05-18 07:39:57

标签: javascript html5 html5-video html5-audio

如果用户想要停止HTML5媒体,例如通过单击“暂停”本机控制按钮,我们会收到“暂停”事件。 同时,如果media元素到达指定片段的末尾,它会自动触发相同的“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”事件,但拒绝了:我想在自动暂停(由到达片段末尾引起)发生时做出反应。

2 个答案:

答案 0 :(得分:2)

只有在完整曲目结束后才会发出已结束的事件。当你播放一个片段时,它只会暂停片段末尾的音轨,因为音轨本身还没有结束(除非片段的结束时间恰好也是结束)。

  

据说媒体元素在用户交互时暂停了   paused属性为false,readyState属性为   HAVE_FUTURE_DATA或HAVE_ENOUGH_DATA且用户代理已达到   指向用户必须进行选择的媒体资源   资源继续。

结束的事件只会在以下情况下发生:

  

据说媒体元素在以下时间结束播放:

     

元素的readyState属性是HAVE_METADATA或更高,

     

或者:

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

<强> Source

要检测暂停事件是否由于片段结束而被触发,您可以将currentTime与片段结束时间进行比较(是的,理论上你可以在这个时候点击暂停按钮,但是这将与你使用音频元素一样接近,除非事件本身有一个揭示暂停源的秘密属性,我不知道这一点。

由于我们处理浮点值,您需要使用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
}

答案 1 :(得分:0)

今天,当我搜索“为什么在发生暂停时也会暂停时触发”的问题就出现了。

我不想在发生意外事件时触发onpause事件处理程序。

这是我(正在工作)的目标:

videoRef.onpause = (e) => {
  if(e.target.currentTime != e.target.duration) {
    doPauseRelatedStuff()
  }
}

我同时注册了onpause和onended处理程序。上面的代码使doPauseRelatedStuff()仅在手动停止视频时执行。