¿Cómo saber si se está reproduciendo un elemento <video>?

84

Veo que los MediaElement expone la interfaz de atributos como paused, seeking, y ended. Sin embargo, falta en la lista playing.

Sé que hay playingeventos que se activan cuando un elemento comienza a reproducirse y timeupdateeventos de eventos periódicamente durante la reproducción, pero estoy buscando una manera de determinar si un video se está reproduciendo en este momento . ¿Existe una manera fácil de determinar esto?

Lo más cercano que tengo es:

!(video.paused || video.ended || video.seeking || video.readyState < video.HAVE_FUTURE_DATA)
Evan Krall
fuente

Respuestas:

86

Ha pasado mucho tiempo, pero aquí hay un gran consejo. Puede definir .playingcomo una propiedad personalizada para todos los elementos multimedia y acceder a ella cuando sea necesario. Aquí es cómo:

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

Ahora puedes usarlo en <video>o <audio>elementos como esto:

if(document.querySelector('video').playing){ // checks if element is playing right now
    // Do anything you want to
}
Raees Iqbal
fuente
83

No hay un atributo específico que revele si MediaElementse está reproduciendo actualmente. Sin embargo, puede deducir esto del estado de los otros atributos. Si:

  • currentTime es mayor que cero, y
  • paused es falso, y
  • ended Es falso

entonces el elemento se está reproduciendo actualmente.

También es posible que deba verificar readyStatesi el medio se detuvo debido a errores. Quizás algo así:

const isVideoPlaying = video => !!(video.currentTime > 0 && !video.paused && !video.ended && video.readyState > 2);
George Cummins
fuente
Esta suposición no parece ser válida en IE. Mientras el usuario está buscando (y por lo tanto el video no se está reproduciendo en este momento), currentTime puede ser mayor que 0 y paused = finalizado = falso al mismo tiempo.
Bjarke
currentTime me da la duración del video en segundos como flotante en Safari si el video aún no ha comenzado a reproducirse.
Q Caron
9
var video = $('selector').children('video');

var videoElement = video.get(0);

if (!videoElement.paused) {} 

Una forma de hacerlo usando Jquery

Luke Robertson
fuente
1

Estaba enfrentando el mismo problema. La solución es muy simple y directa:

// if video status is changed to "ended", then change control button to "Play Again"
video.onended = function() {
    $("#play_control_button").text("Play Again");
};

// if video status is changed to "paused", then change control button to "Continue Play"
video.onpause = function() {
    $("#play_control_button").text("Continue Play");
};

// if video status is changed to "playing", then change control button to "Stop"
video.onplaying = function() {
    $("#play_control_button").text("Stop");
};
Haolin Zhang
fuente
¿Puede vincular a la documentación de estas propiedades?
brasofilo
@brasofilo Creo que el siguiente enlace proporcionará suficiente información para controlar el video con JavaScript: w3schools.com/tags/ref_av_dom.asp
Haolin Zhang