Это, скорее всего, из-за ошибки [функция] Chrome , из-за которой отключается <video>
, как только они выходят из области просмотра.
Если это действительно так, это не имеет ничего общего с MediaStream, и уже происходит в операции рисование на холст :
var ctx = canvas.getContext('2d');
if ((videoin.buffered && !videoin.buffered.length) || videoin.paused) {
videoin.onloadedmetadata = videoin.onplaying = begin;
} else {
begin();
}
function begin() {
videoin.onloadedmetadata = videoin.onplaying = null;
canvas.width = videoin.videoWidth;
canvas.height = videoin.videoHeight;
drawToCanvas();
}
function drawToCanvas() {
ctx.drawImage(videoin, 0, 0);
requestAnimationFrame(drawToCanvas);
}
body {
margin-bottom: 100vh;
}
<p>
Scroll down until the <video> element be out.
</p>
<video crossorigin id="videoin" src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" muted autoplay></video>
<canvas id="canvas"></canvas>
Так что, если вы не установите свойство muted
, оно будет работать:
var ctx = canvas.getContext('2d');
if ((videoin.buffered && !videoin.buffered.length) || videoin.paused) {
videoin.onloadedmetadata = videoin.onplaying = begin;
} else {
begin();
}
function begin() {
videoin.volume = 0; // does the same you'd say?
videoin.onloadedmetadata = videoin.onplaying = null;
canvas.width = videoin.videoWidth;
canvas.height = videoin.videoHeight;
drawToCanvas();
}
function drawToCanvas() {
ctx.drawImage(videoin, 0, 0);
requestAnimationFrame(drawToCanvas);
}
body {
margin-bottom: 100vh;
}
<p>
Scroll down until the <video> element be out.
</p>
<video crossorigin id="videoin" src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" autoplay></video>
<canvas id="canvas"></canvas>
Или даже, если вы не добавили его в документ, это также сработало бы (после пользовательского жеста ..).
var ctx = canvas.getContext('2d');
var videoin = document.createElement('video');
videoin.onloadedmetadata = videoin.onplaying = begin;
videoin.muted = true; // even if 'muted'
videoin.src = 'https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm';
function begin() {
videoin.onplay = null;
canvas.width = videoin.videoWidth;
canvas.height = videoin.videoHeight;
drawToCanvas();
}
function drawToCanvas() {
ctx.drawImage(videoin, 0, 0);
requestAnimationFrame(drawToCanvas);
}
play_btn.onclick = e => {
videoin.play();
}
<button id="play_btn">click to start playing the video</button>
<p>
This contains only the canvas element
</p>
<canvas id="canvas"></canvas>
Теперь я не могу не сказать в этом ответе, что вы должны уже инициализировали свой контекст холста (и даже, возможно, имеетеуже нарисовано на нем) перед вызовом метода captureStream
.Невыполнение этого требования приведет к исключению NS в Firefox, и IIRC соответствует спецификациям.