Да, они приостанавливают приглушенное видео, добавленное к документу, когда его нет на экране.
Обратите внимание, что вообще не добавление этого видео в документ не приведет к такому поведению:
(()=>{
const vid = document.createElement('video');
const ctx = document.getElementById('can1')
.getContext('2d');
ctx.filter = 'sepia(100%)';
vid.muted = true;
vid.src = "http://grochtdreis.de/fuer-jsfiddle/video/sintel_trailer-480.mp4";
vid.play().then(anim);
function anim() {
requestAnimationFrame(anim);
ctx.drawImage(vid, 0, 0, 400, 224)
}
})();
<canvas id='can1' height=224px width=400px></canvas>
Так что, если вам действительно нужен этот видеоэлемент, вы можете передать исходный видеоэлемент MediaStream, снятый из закадрового видео, и сопоставить его элементы управления с этим закадровым видео.
visibleVid.srcObject = offscreenVid.captureStream();
visibleVid.onpause = e => offscreenVid.pause();
// ...
function begin() {
const visibleVid = document.getElementById('vid1');
const offscreenVid = visibleVid.cloneNode(true);
const can = document.getElementById('can1');
const ctx = can.getContext('2d');
ctx.filter = 'sepia(100%)';
visibleVid.onpause = e => offscreenVid.pause();
visibleVid.onplaying = e => offscreenVid.play();
offscreenVid.play().then(() => {
visibleVid.srcObject = offscreenVid.captureStream ?
offscreenVid.captureStream() :
offscreenVid.mozCaptureStream();
visibleVid.play();
anim();
});
function anim() {
requestAnimationFrame(anim);
ctx.drawImage(offscreenVid, 0, 0, 400, 224)
}
}
onload = begin;
html {
padding: 20px 0;
background-color: #efefef;
}
body {
width: 400px;
padding: 40px;
margin: 0 auto;
background: #fff;
box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.5);
}
video {
width: 400px;
display: block;
}
#can1 {
position: absolute;
top: calc( 100vh + 100px);
}
<canvas id='can1' height=224px width=400px></canvas>
<video autobuffer controls autoplay muted=true id='vid1' crossorigin="anonymous">
<!-- we need a crossorigin safe media -->
<source id="mp4" src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" type="video/mp4">
/9012682/canvas-drawimage-avtomaticheski-vosproizvodimogo-video-rabotaet-tolko-togda-kogda-viden-videoelement</video>
<br> Above is the Video element.
<br> Below is the Canvas
<br><br><br> Why does the canvas below stop when the video is scrolled out of view
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
Но это слишком много для браузера, и вы потеряете возможность поиска по этому элементу (так как теперь он представляет поток).
Поэтому, если вам это действительно нужно, вы можете также рассмотреть возможность создания собственных элементов управления над другим холстом.
И, наконец, они, очевидно, делают это только для приглушенных видео, поэтому, если вы согласны с потерей функции автозапуска, вы также можете просто удалить этот атрибут muted
и просто установить его громкость на 0
:
(() => {
let vid = document.getElementById('vid1');
let can = document.getElementById('can1');
let ctx = can.getContext('2d');
vid.volume = 0; // replace muted
vid.play()
.catch(() => {
// in case we're not allowed to play, wait for user approval
console.log('click anywhere to start playback');
addEventListener('click',
e => {console.clear();vid.play()},
{once:true}
)
});
anim();
function anim() {
requestAnimationFrame(anim);
ctx.drawImage(vid, 0, 0, 400, 224)
}
})();
html {
padding: 20px 0;
background-color: #efefef;
}
body {
width: 400px;
padding: 40px;
margin: 0 auto;
background: #fff;
box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.5);
}
video {
width: 400px;
display: block;
}
#can1 {
position: absolute;
top: calc( 100vh + 100px);
}
<canvas id='can1' height=224px width=400px></canvas>
<video autobuffer controls autoplay id='vid1'>
<source id="mp4" src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" type="video/mp4">
</video>
<br> Above is the Video element.
<br> Below is the Canvas
<br><br><br> Why does the canvas below stop when the video is scrolled out of view
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>