HTML5 视频 Play/Pause 问题

HTML5 Video Play/Pause issue

我正在尝试构建一个非常简单的 HTML5 视频播放器:

HTML

<div class="col-lg-12 video">
  <video id="format-video" width="100%" height="100%" loop="loop" preload="auto">
    <source src="Video-AOM.mp4" type="video/mp4" />
    <img src="images/fallback.jpg"  />
  </video>
  <img class="background" src="images/video-background.jpg" />
  <div class="video-run"></div>
  <div class="video-play-pause"></div>
</div>

打字

$(document).ready(function () {
   if ($('#format-video').length > 0) {
    var video = <HTMLVideoElement> document.getElementById('format-video');
    video.oncanplaythrough = function () {
        $('.video-run').fadeIn(200);
        $('.video-run').click(function () {
            $(".video .background").fadeOut(200);
            $('.video-run').fadeOut(200);
            $('.video-play-pause').fadeIn(200);
            $('.video-play-pause').on('click',function () {
                if (video.paused) {
                    video.play();
                }
                else {
                    video.pause();
                }
            })
            video.play();
        });
    }
});

所以当视频可以 "playthrough" 时,一个大的 "play" 按钮淡入,当点击时淡入,一个小的 pause/play 淡入。

如果我点击按钮 play/pause,暂停有效,但如果我再次点击它,它要么只播放几秒钟然后停止播放,要么什么也没有发生。

我正在 Chrome 40.0.2214.91 米进行测试。

我尝试按照那里的建议设置 preload="none" :HTML5 video controls - Cannot play after pause in chrome only 但没有成功。

不确定是否有解决方案。

这里 可能 发生的是,您可以堆叠多个点击处理程序,这些处理程序都是 运行 并相互争斗,因为 "canplaythrough" 事件可以 运行 多次。

如果网络有点慢,那么可能发生的情况是,一旦视频开始播放,它就会赶上缓冲的数量,直到暂停片刻。发生这种情况时,readyState 回落到较低的值。然后,一旦缓冲了更多视频,readyState 又回到 4 并且 "canplaythrough" 再次触发。

如果发生这种情况,那么您将开始 运行 遇到问题。首先,您会期望 '.video-run' 再次出现。然后,您将有第二个点击处理程序附加到它。如果您单击它,您还会将第二个单击处理程序附加到 '.video-play-pause'。因此,之后每次您单击该按钮时,视频都会播放,然后立即暂停。整个过程可以自己重复,每次都添加越来越多的点击处理程序。

我的建议是在一开始就设置一次所有的点击处理程序。如果您仍想使用 oncanplaythrough 淡入第一个按钮并单击大按钮淡入小按钮,那很好。但是您应该在第一次 运行 之后删除这些事件处理程序。

更新: 关于 "canplaythrough" 事件的注释。在有足够的数据缓冲到浏览器估计您可以直接播放整个视频而不会 运行 耗尽数据之前,不应触发此事件。这并不意味着您拥有所有数据 - 只是它的速度足够快,您可能无法赶上它。无法保证此事件会在您主动开始播放视频之前触发(如果有的话)。 Chrome 被认为是 aggressive with this event,几乎立即触发它,而其他浏览器等待更长时间。

所以我按照那里的建议通过设置 preload="none" 设法解决了这个问题:

HTML5 video controls - Cannot play after pause in chrome only

并清除 Google Chrome 的缓存(我在发布问题之前没有尝试过)。

试了几次,现在看起来不错。