检测 HTML5 视频元素是否正在播放

108

我查看了几个问题,想知道HTML5元素是否正在播放,但找不到答案。我查看了W3文档,其中有一个名为“playing”的事件,但似乎无法使用。

这是我的当前代码:

var stream = document.getElementsByTagName('video');

function pauseStream() {
  if (stream.playing) {
    for (var i = 0; i < stream.length; i++) {
      stream[i].pause();
      $("body > header").addClass("paused_note");
      $(".paused_note").text("Stream Paused");
      $('.paused_note').css("opacity", "1");
    }
  }
}

我对这方面完全没有经验,但你能从视频标签中获取信息来获得播放时间戳吗?你可以设置一个90毫秒的计时器,并跟踪视频的播放位置,如果时间戳在增加,那么你就知道视频正在播放。 - jcolebrand
17个回答

119

在我看来,你只需要检查!stream.paused即可。


23
!video.paused 或者 video.paused === false 并不一定意味着视频正在播放 - 它只告诉你 "video.play() 已经触发,但是视频仍然可以在加载或播放中"。为了检测它是否正在播放,使用 video.onplaying 事件来检测它是否已经加载并且正在播放,例如:video.onplaying = function() { console.log('视频现在已经加载并正在播放'); }。这个区别对于你的需求可能重要,也可能不重要。 - Jasdeep Khalsa

48

请查看我在如何判断 <video> 元素当前是否正在播放?的答案:

MediaElement没有指示它是否正在播放的属性。但是,您可以为其定义自定义属性。

Object.defineProperty(HTMLMediaElement.prototype, 'playing', {
    get: function(){
        return !!(this.currentTime > 0 && !this.paused && !this.ended && this.readyState > 2);
    }
})

现在您可以像这样在videoaudio元素中使用它:

if(document.querySelector('video').playing){
    // Do anything you want to
}

MDN说它应该继承自HTMLMediaElement,但我不得不将属性附加到HTMLVideoElement.prototype上。 - Marcus Pope

38

注意:此回答发布于2011年,请在进行操作前查看有关HTML5视频的更新文档。

如果您只想知道视频是否已暂停,请使用标志stream.paused

视频元素没有获取其播放状态的属性。但是有一个事件"playing",当它开始播放时会触发。还有一个名为"ended"的事件在停止播放时也将被触发。

因此解决方案如下:

  1. 声明一个变量videoStatus
  2. 为视频的不同事件添加事件处理程序。
  3. 使用事件处理程序更新videoStatus
  4. 使用videoStatus来识别视频的状态。

此页面将让您更好地了解视频事件。在此页面上播放视频并查看事件如何被触发。
http://www.w3.org/2010/05/video/mediaevents.html


21
jQuery(document).on('click', 'video', function(){
        if (this.paused) {
            this.play();
        } else {
            this.pause();
        }
});

17

为您的媒体元素添加事件监听器。可能触发的事件包括:音频和视频媒体事件

<!DOCTYPE html> 
<html> 
<head>  
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
<title>Html5 media events</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</head> 
<body >
    <div id="output"></div>
    <video id="myVideo" width="320" height="176" controls autoplay>
        <source src="http://www.w3schools.com/tags/mov_bbb.mp4" type="video/mp4">
        <source src="http://www.w3schools.com/tags/mov_bbb.ogg" type="video/ogg">
    </video>
    <script>
        var media = document.getElementById('myVideo');

        // Playing event
        media.addEventListener("playing", function() {
            $("#output").html("Playing event triggered");
        });
   
        // Pause event
        media.addEventListener("pause", function() { 
            $("#output").html("Pause event triggered"); 
        });

        // Seeking event
        media.addEventListener("seeking", function() { 
            $("#output").html("Seeking event triggered"); 
        });

        // Volume changed event
        media.addEventListener("volumechange", function(e) { 
            $("#output").html("Volumechange event triggered"); 
        });

    </script>   
</body> 
</html>


12

最佳方法:

function playPauseThisVideo(this_video_id) {

  var this_video = document.getElementById(this_video_id);

  if (this_video.paused) {

    console.log("VIDEO IS PAUSED");

  } else {

    console.log("VIDEO IS PLAYING");

  }

}

这并不完全正确...因为当它没有播放时,它也可能已经结束了,或者根本没有开始。从技术上讲,你的答案可能是正确的,哈哈;-) 请参见https://dev59.com/aGw15IYBdhLWcg3wCXKJ#6877530 - benzkji

4

我曾遇到类似的问题,即在播放器开始播放之前无法添加事件监听器,因此@Diode的方法不起作用。我的解决方案是检查播放器的“paused”属性是否设置为true。这个方法是可行的,因为“paused”在视频开始播放之前甚至结束后都被设置为true,而不仅仅是当用户点击“暂停”时。


1
通常我会在点击播放/暂停按钮的事件处理程序中使用这个:videoNode.paused ? videoNode.play() : videoNode.pause(); - bento

4

您可以使用“playing”事件监听器 =>

const video = document.querySelector('#myVideo');

video.addEventListener("playing", function () {
     // Write Your Code
});


3
这是我们在http://www.develop.com/webcasts使用的方法,以防止用户在视频播放或暂停时意外离开页面。请注意,我们保留了HTML标签。
$(document).ready(function() {

    var video = $("video#webcast_video");
    if (video.length <= 0) {
        return;
    }

    window.onbeforeunload = function () {
        var htmlVideo = video[0];
        if (htmlVideo.currentTime < 0.01 || htmlVideo.ended) {
            return null;
        }

        return "Leaving this page will stop your video.";
    };
}

2

一个例子

var audio = new Audio('https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3')

if (audio.paused) {
  audio.play()
} else {
  audio.pause()
}


这个问题是关于视频的,不是音频! - Kurt Van den Branden
1
@KurtVandenBranden 没有区别,它们都具有相同的事件处理程序。 - Brad
1
@Brad,我知道它们具有相同的事件处理程序,但可能大多数寻找此类信息的人并不知道,因此这个答案非常令人困惑。 - Kurt Van den Branden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接