HTML5 Видео-файл загрузки полное событие?
Мне нужно определить, когда видеофайл завершил загрузку. Я думаю, что должен использовать progress - > buffer, но в глубине души я помню, что читал, что это ненадежно. Есть ли лучший способ, или это безопасно?
Примечание, я буду держать кэш localStorage видео, которые были полностью загружены каждым пользователем, поэтому я буду знать заранее, если видео уже загружено, и, вероятно, может обойти прогресс - > буфер, если это прилипание точка.
спасибо заранее.
3 ответов
вы можете связать "буферизованное" событие, но (по крайней мере, в Chrome) это работает нормально, за исключением того, что он не вызывает последнее "буферизованное" событие (т. е. он обнаружит 90%...94%...98%... но не будет звонить на 100%).
Примечание: последние версии jQuery надо использовать .prop () вместо .attr ()
чтобы обойти это, я использовал setInterval () для проверки буфера каждые 500 мс (где $html5Video-ваш <video>
элемент:
var videoDuration = $html5Video.attr('duration');
var updateProgressBar = function(){
if ($html5Video.attr('readyState')) {
var buffered = $html5Video.attr("buffered").end(0);
var percent = 100 * buffered / videoDuration;
//Your code here
//If finished buffering buffering quit calling it
if (buffered >= videoDuration) {
clearInterval(this.watchBuffer);
}
}
};
var watchBuffer = setInterval(updateProgressBar, 500);
У меня была такая же проблема и использовать таймер, прикрепленный к событию прогресса. Это взлом, но я не видел других способов сделать это. (Я тестировал это на Chome 10-Windows).
var video = document.getElementById('#example-video-element');
var timer = 0;
video.addEventListener('progress', function (e) {
if (this.buffered.length > 0) {
if (timer != 0) {
clearTimeout(timer);
}
timer = setTimeout(function () {
if(parseInt(video.buffered.end() / video.duration * 100) == 100) {
// video has loaded....
};
}, 1500);
}
}, false);
это похоже на тип подхода, который вы думали принять, но решил, что я опубликую пример для тех анонимных пользователей, которые могут искать быстрый образец кода =p
GJ
вот конкретная реализация с MDC-web MDC-линейный-прогресс Google компонент пользовательского интерфейса.
var doc = document;
var bufferLengthDetector;
var linearProgress;
var mdc = window.mdc;
mdc.autoInit();
var video = doc.querySelector('video');
if(doc.getElementById("footer-progress")){
linearProgress = mdc.linearProgress.MDCLinearProgress.attachTo(doc.getElementById("footer-progress"));
}
if(video){
video.addEventListener('timeupdate', function() {
var percent = Math.floor((100 / video.duration) * video.currentTime);
linearProgress.progress = percent/100;
}, false);
video.addEventListener('progress', function() {
var duration = video.duration;
if (duration > 0) {
bufferLengthDetector = setInterval(readBuffer, 500);
}
});
}
function readBuffer(){
var percent = video.buffered.end(video.buffered.length - 1) / video.duration;
if (percent >= .9) {
linearProgress.buffer = 1;
clearInterval(bufferLengthDetector);
}
else {
linearProgress.buffer = percent;
}
}
html {
height:100%;
}
body{
margin: 0;
}
#footer-progress{
position: fixed;
bottom: 0;
width: 100%;
visibility: visible;
opacity: 1;
}
video {
position: fixed;
top: 50%;
left: 50%;
min-width: 100%;
min-height: 100%;
width: auto;
height: auto;
z-index: -100;
transform: translateX(-50%) translateY(-50%);
background: #212121;
background-size: cover;
transition: visibility 1s, opacity 1s linear;
visibility: visible;
opacity: 1;
}
<head>
<link rel="stylesheet" href="https://unpkg.com/material-components-web@latest/dist/material-components-web.min.css">
<script src="https://unpkg.com/material-components-web@latest/dist/material-components-web.min.js"></script>
</head>
<body>
<video class="bg-video" playsinline autoplay>
<source src="//rack.pub/media/do-not.webm" type="video/webm">
<source src="//rack.pub/media/do-not.mp4" type="video/mp4">
I'm sorry your browser doesn't support HTML5 video in WebM with VP8/VP9 or MP4 with H.264.
</video>
<div role="progressbar" class="mdc-linear-progress" data-buffer="true" id="footer-progress">
<div class="mdc-linear-progress__buffering-dots"></div>
<div class="mdc-linear-progress__buffer"></div>
<div class="mdc-linear-progress__bar mdc-linear-progress__primary-bar">
<span class="mdc-linear-progress__bar-inner"></span>
</div>
<div class="mdc-linear-progress__bar mdc-linear-progress__secondary-bar">
<span class="mdc-linear-progress__bar-inner"></span>
</div>
</div>
</body>