Signatur
Beschreibung
Ruft man HTMLCanvasElement.captureStream() auf, entsteht ein MediaStream mit einem Video-Track vom Typ CanvasCaptureMediaStreamTrack. Über dessen Eigenschaft canvas kommt man jederzeit wieder an das Canvas-Element, das den Track mit Bildern versorgt.
Das ist vor allem dann nützlich, wenn nur der Track oder der Stream an andere Programmteile weitergegeben wird, z. B. an einen MediaRecorder, eine RTCPeerConnection oder eine Hilfsfunktion. Diese Stellen brauchen keinen eigenen Verweis auf das Canvas, um weiter darauf zu zeichnen, seine Größe abzufragen oder über requestFrame() gezielt einzelne Frames anzufordern.
Die Eigenschaft ist schreibgeschützt: Einen Track kann man nicht nachträglich an ein anderes Canvas hängen. Für eine andere Quelle ruft man captureStream() auf dem neuen Canvas auf.
Rückgabewert
captureStream() aufgerufen wurde.Beispiele
Canvas über den Track wiederfinden
const canvas = document.createElement('canvas');
canvas.width = 640;
canvas.height = 360;
const stream = canvas.captureStream(30);
const [track] = stream.getVideoTracks();
console.log(track.canvas === canvas);
console.log(`${track.canvas.width}x${track.canvas.height}`);
Hilfsfunktion zeichnet nur mit Hilfe des Tracks
// Die Funktion bekommt nur den Track, nicht das Canvas
const drawTimestamp = (track) => {
const ctx = track.canvas.getContext('2d');
ctx.fillStyle = '#000';
ctx.fillRect(0, 0, track.canvas.width, track.canvas.height);
ctx.fillStyle = '#0f0';
ctx.font = '24px monospace';
ctx.fillText(new Date().toLocaleTimeString('de-DE'), 20, 40);
};
const canvas = document.querySelector('#stage');
const [track] = canvas.captureStream(25).getVideoTracks();
setInterval(() => drawTimestamp(track), 1000);
Manuelle Frames bei captureStream(0) anfordern
const canvas = document.querySelector('#stage');
// Framerate 0: ein Frame wird nur auf Anforderung erfasst
const stream = canvas.captureStream(0);
const [track] = stream.getVideoTracks();
const recorder = new MediaRecorder(stream, { mimeType: 'video/webm' });
const chunks = [];
recorder.ondataavailable = (e) => chunks.push(e.data);
recorder.start();
const renderFrame = (i) => {
const ctx = track.canvas.getContext('2d');
ctx.fillStyle = `hsl(${i * 10}, 80%, 50%)`;
ctx.fillRect(0, 0, track.canvas.width, track.canvas.height);
track.requestFrame(); // aktuellen Inhalt als Frame übernehmen
};
let i = 0;
const timer = setInterval(() => {
renderFrame(i++);
if (i === 36) {
clearInterval(timer);
recorder.stop();
}
}, 100);
// Wichtig · Fallstricke
- Nur lesbar: Eine Zuweisung an
track.canvaswird ohne Fehler ignoriert, im Strict Mode wirft sie einenTypeError. - Typprüfung: Nur Tracks aus
captureStream()haben diese Eigenschaft. Bei Kamera- oder Bildschirm-Tracks (getUserMedia,getDisplayMedia) isttrack.canvasundefined. Deshalb vorher z. B. mit'canvas' in trackprüfen. - Firefox: Dort heißt die Schnittstelle
CanvasCaptureMediaStream, und die Eigenschaftcanvashängt am Stream, nicht am Track. Wer mehrere Browser unterstützt, sollte beide Fälle abfangen. - Tainted Canvas: Enthält das Canvas Bilder von fremden Ursprüngen ohne CORS-Freigabe, gibt der Stream keine brauchbaren Frames aus. Der Zugriff auf
canvasselbst klappt trotzdem. OffscreenCanvaswird nicht unterstützt:captureStream()gibt es nur aufHTMLCanvasElement.