Нет, ни в одном из Canvas API нет ничего, что могло бы потреблять MediaStream.
API-интерфейсы холста работают только с необработанными пикселями и не содержат никаких декодеров. Вы должны использовать либо объекты javascript, которые могут выполнять это декодирование (например, ImageBitmap), либо HTMLElements.
Таким образом, в случае MediaStream в настоящее время единственным объектом, способным декодировать его видеоконтент, будет HTMLVideoElement, который вы сможете легко рисовать на холсте.
обновление 2021 г.
WebCodecs API в последнее время значительно продвинулся вперед и становится все более и более зрелым, поэтому стоит упомянуть его. как решение.
Этот API предлагает новый интерфейс под названием VideoFrame, который будет скоро станет частью CanvasImageSource, что означает, что мы можем использовать его непосредственно с drawImage
, texImage2D
и везде, где может использоваться такой CanvasImageSource.
href="https://github.com/w3c/mediacapture-transform" rel="nofollow noreferrer">MediaCapture Transform группа W3C разработала MediaStreamTrackProcessor, который возвращает такие видеокадры из видео MediaStreamTrack.
Итак, теперь у нас есть более прямой способ рендеринга MediaStream на холст, который в настоящее время работает только в браузере Chrome с включенным флагом #enable-experimental-web-platform-features
...
if( window.MediaStreamTrackProcessor ) {
const canvas = document.querySelector("canvas");
const ctx = canvas.getContext("2d");
const track = getCanvasTrack(); // MediaStream.getVideoTracks()[0]
const processor = new MediaStreamTrackProcessor( track );
const reader = processor.readable.getReader();
readChunk();
function readChunk() {
reader.read().then( ({ done, value }) => {
// the MediaStream video can have dynamic size
if( canvas.width !== value.displayWidth || canvas.height !== value.displayHeight ) {
canvas.width = value.displayWidth;
canvas.height = value.displayHeight;
}
ctx.clearRect( 0, 0, canvas.width, canvas.height );
// value is a VideoFrame
ctx.drawImage( value, 0, 0 );
value.close(); // close the VideoFrame when we're done with it
if( !done ) {
readChunk();
}
});
}
}
else {
console.error("Your browser doesn't support this API yet");
}
// We can't use getUserMedia in StackSnippets
// So here we use a simple canvas as source
// for our MediaStream.
function getCanvasTrack() {
// just some noise...
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
const img = new ImageData(300, 150);
const data = new Uint32Array(img.data.buffer);
const track = canvas.captureStream().getVideoTracks()[0];
anim();
return track;
function anim() {
for( let i=0; i<data.length;i++ ) {
data[i] = Math.random() * 0xFFFFFF + 0xFF000000;
}
ctx.putImageData(img, 0, 0);
if( track.readyState === "live" ) {
requestAnimationFrame(anim);
}
}
}
<canvas></canvas>
Как глючный проект (источник), используя камеру в качестве источника.
person
Kaiido
schedule
12.05.2019