Làm cách nào để biết phần tử <video> hiện đang phát?


82

Tôi thấy rằng MediaElement phơi bày giao diện thuộc tính như paused, seeking, và ended. Tuy nhiên, bị thiếu trong danh sách playing.

Tôi biết có những playingsự kiện kích hoạt khi một phần tử bắt đầu pháttimeupdatesự kiện sự kiện định kỳ trong khi phát, nhưng tôi đang tìm cách xác định xem video có đang phát ngay bây giờ hay không . Có cách nào dễ dàng để xác định điều này không?

Gần nhất tôi có là:

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

Câu trả lời:


86

Nó đã được một thời gian dài nhưng đây là một mẹo hay. Bạn có thể xác định .playingnhư một thuộc tính tùy chỉnh cho tất cả các phần tử phương tiện và truy cập nó khi cần thiết. Đây là cách:

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

Bây giờ bạn có thể sử dụng nó trên <video>hoặc <audio>các phần tử như sau:

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

82

Không có một thuộc tính cụ thể nào cho biết liệu a MediaElementcó đang phát hay không . Tuy nhiên, bạn có thể suy ra điều này từ trạng thái của các thuộc tính khác. Nếu:

  • currentTime lớn hơn 0 và
  • paused là sai, và
  • ended là sai

thì phần tử hiện đang phát.

Bạn cũng có thể cần phải kiểm tra readyStatexem phương tiện có bị dừng do lỗi hay không. Có thể như thế:

const isVideoPlaying = video => !!(video.currentTime > 0 && !video.paused && !video.ended && video.readyState > 2);

Giả định này dường như không phù hợp với IE. Trong khi người dùng đang tìm kiếm (và do đó video không phát ngay bây giờ), currentTime có thể lớn hơn 0 và tạm dừng = kết thúc = false cùng lúc.
Bjarke

currentTime cung cấp cho tôi thời lượng video tính bằng giây dưới dạng phao trong Safari nếu video chưa bắt đầu phát.
Q Caron

9
var video = $('selector').children('video');

var videoElement = video.get(0);

if (!videoElement.paused) {} 

Một cách để làm điều đó bằng cách sử dụng Jquery



1

Tôi đã phải đối mặt với cùng một vấn đề. Giải pháp rất đơn giản và dễ hiểu:

// 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");
};

Bạn có thể liên kết đến tài liệu của các thuộc tính này không?
brasofilo

@brasofilo Tôi nghĩ rằng bên dưới liên kết sẽ cung cấp đầy đủ thông tin để kiểm soát video với JavaScript: w3schools.com/tags/ref_av_dom.asp
Haolin Zhang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.