2015-09-25 277 views
0

我使用视频标签在我的HTML页面中嵌入了4秒长的视频。我需要首先暂停视频2秒,分别为2.99s,3.44s和4.00s。为了实现这一点,视频需要从以前的实例恢复。如何暂停HTML视频并通过循环自动恢复?

但经过长时间的努力,我一直无法找到解决方案。到目前为止,我刚刚能够让视频暂停> = 2.99s,但即使在使用setInterval函数后也不会恢复。

下面是代码:

var vTag = document.getElementById('video'); 

setInterval(function() { pVideo();}, 2000); 

function pVideo() { 
     vTag.ontimeupdate = function(e) { 
     cTime = vTag.currentTime; 
     (cTime >= 2.9 || cTime >= 3.44 || cTime >= 4.00) ? vTag.pause(): vTag.play(); 
}; 
}; 

PS:视频被用作标题部分中的背景的视频。

+0

什么做es控制台日志'cTime'为? (不知道为什么这个问题是downvoted ..它清晰简洁..)另外,就像一个节点,你可以'setInterval(pVideo,2000);'减少代码混乱。没有参数意味着你只能传递一个函数引用。 –

+0

@SterlingArcher感谢您的回复。我不知道相同!如预期的cTime以秒为单位输出时间值。 –

+0

我想我明白了为什么。在你的if语句中,所有条件在2.9秒后总是成立。 –

回答

2

试试这个..这是一个完全工作代码

HTML

<video id="video" autoplay muted loop> 
    <source src="http://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4"> 
    <source src="http://www.w3schools.com/html/mov_bbb.ogg" type="video/ogg"> 
    Your browser does not support HTML5 video. 
</video> 

JS

var vTag = document.getElementById('video'); 
vTag.play(); 
var wasPausedBefore1 = 0; 
var wasPausedBefore2 = 0; 
var wasPausedBefore3 = 0; 

vTag.ontimeupdate = function(e) { 
    cTime = vTag.currentTime; 
    if (cTime < 1) { 
     wasPausedBefore1 = 0; 
     wasPausedBefore2 = 0; 
     wasPausedBefore3 = 0; 
    } else if (cTime > 2.8 && cTime < 3.1 && wasPausedBefore1 == 0) { 
     vTag.pause(); 
     wasPausedBefore1 = 1; 
     setTimeout(function() { 
      vTag.play(); 
     }, 4000); 
    } else if(cTime > 3.3 && cTime < 3.6 && wasPausedBefore2 == 0){ 
     vTag.pause(); 
     wasPausedBefore2 = 1; 
     setTimeout(function() { 
      vTag.play(); 
     }, 4000); 
    } else if(cTime > 3.8 && cTime < 4.0 && wasPausedBefore3 == 0){ 
     vTag.pause(); 
     wasPausedBefore3 = 1; 
     setTimeout(function() { 
      vTag.play(); 
     }, 4000); 
    } 
}; 

这里是工作提琴:https://jsfiddle.net/o9mknsx0/1/

+0

嘿真棒!这工作得很好。谢谢。 –

0

使用setTimeout而不是setInterval

我不知道,如果你能赶上需要使用timeupdate,因为它激发每200ms或250ms的任一时间,但我会做到这一点,像这样:

var vTag = document.getElementById('video'); 

vTag.addEventListener('timeupdate', function() { 
    var cTime = vTag.currentTime; 
    if(cTime === 2.99 || cTime === 3.44 || cTime === 4)) { 
     vTag.pause(); 
     setTimeout(function() { 
      vTag.play(); 
     }, 2000); 
    } 
}); 

为了使它赶上你的时间,如2.993.44,那么你需要使用setInterval10ms轮询它。

setInterval(function() { 
    var cTime = vTag.currentTime; 
    if(cTime === 2.99 || cTime === 3.44 || cTime === 4) { 
     vTag.pause(); 
     setTimeout(function() { 
      vTag.play(); 
     }, 2000); 
    } 
}, 10); 
+0

谢谢,但我已经试过这段代码(再次试图加倍确定!)。这种方法的问题是,这甚至不会暂停视频! 此外,我不能期望'==='工作,因为我每读250ms读取timeupdate事件触发器 –

+0

@unclesam我已经使用'setTimeout'添加了另一种方法。 –

+0

试过了!没有工作!有一件事是肯定的,你永远无法赶上确切的时间,你可能不得不使用一个范围。试过了,没有工作! –

0

你需要更新你的if语句以某种方式跟踪暂停值,否则您的视频无法播放,因为后2.9秒,如果将永远为所有这些条件返回true。

var vTag = document.getElementById('video'); 

setInterval(pVideo, 2000); //function reference 

var nextPause = [2.9, 3.44, 4.00]; 
var pauseIndex = 0; 
function pVideo() { 
    vTag.ontimeupdate = function(e) { 
     cTime = vTag.currentTime; 
     var pauseTime = nextPause[pauseIndex]; 
     if (cTime >= pauseTime) { 
      vTag.pause(); 
      setTimeout(vTag.play, 2000); //unpause after 2 seconds 
      if (++index <= nextPause.length) index++ 
      else index = 0; 
     } 
    } 
}; 

这是未经测试的,我的逻辑可能有缺陷,但我觉得这个概念是有声的。

将所有暂停时间放入数组中,并跟踪上次使用的索引(如果需要,也可以重置(循环视频))。然后,如果if语句匹配,请暂停视频并运行超时2秒钟以再次播放视频。

+0

只是试过了!与原来的结果相同! 2.9秒后暂停,但从未恢复。我相信代码永远不会执行setTimeout函数,或者我试图实现一些不可能的事情!顺便说一句,如果我们以任何方式操作帧,那么有没有办法? –

+0

这部分我不确定。尝试做一些日志记录,我把它放入if语句,看看它是否执行 –

+0

我试过这个: 'setInterval(pVideo,2000); //函数参考 var nextPause = [2.9,3.44,4.00]; var pauseIndex = 0; var index = 0; function pVideo(){ vTag.ontimeupdate = function(e){ cTime = vTag.currentTime; var pauseTime = nextPause [pauseIndex]; (cTime> = pauseTime){ vTag.pause(); console.log(cTime); setTimeout(vTag.play,2000); // 2秒后取消暂停 console.log(cTime); (++ index <= nextPause.length)index ++ else index = 0;如果(++ index <= nextPause.length)index ++ else index = 0; } } };' –