Это потому, что зацикливание MediaElement никогда не бывает бесшовной операцией.Это особенно слышно, когда зацикливает аудио мультимедиа .
Обычно, когда воспроизводится в , мы не видим его, потому что браузер просто приостанавливает рендеринг видео на этот короткий промежуток времени.и наш мозг просто игнорирует те несколько кадров, которые приостановлены и концентрируются скорее на всех тех, которые действительно движутся.
Тем не менее, в вашем случае он становится очень заметным, потому что вы все равно очищаете холст, но поверх него нет рамки для рисования.Таким образом, это вызывает большую белую вспышку.
Простое исправление - проверить, является ли currentTime
значение 0
и не перерисовывать в течение этого времени:
let canvas = document.querySelector("canvas");
let ctx = canvas.getContext("2d");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
let src = "https://i.imgur.com/5ZiAeSX.mp4";
let video = document.createElement("video");
video.src = src;
video.muted = true;
video.play();
let missed_frames = 0; // only for demo
video.onended = () => {
video.play();
// only for demo
setTimeout(() => {
_log.textContent = 'missed ' + missed_frames +' frames while looping';
missed_frames = 0;
}, 200);
};
function render() {
if(video.currentTime) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
}
// only for demo
else {
missed_frames++;
}
requestAnimationFrame(render);
}
render();
#_log { color: white; position: absolute; }
Более сложное решение, если вам действительно нужно выполнить цикл без шва, - это использовать MediaSource объект, но если он действительно не нужен, установить его немного громоздко.