Start · Sprachen · JavaScript · Referenz · VideoColorSpace.matrix

VideoColorSpace.matrix

Eigenschaft

Die schreibgeschützte Eigenschaft <code>matrix</code> gibt die Matrixkoeffizienten zurück, mit denen ein Video von YUV nach RGB umgerechnet wird, oder <code>null</code>.

seit JavaScript WebCodecs API – Chrome/Edge 94+, Safari 16.4+, Fir Kategorie: webapi

Signatur

get VideoColorSpace.matrix

Beschreibung

Die Eigenschaft matrix eines VideoColorSpace-Objekts gibt an, mit welchen Matrixkoeffizienten die Luma- und Chroma-Werte (Y, U, V) eines Videobilds in RGB-Werte umgerechnet werden. Die Koeffizienten stammen aus Standards wie ITU-R BT.709 (HD), BT.601 (SD, hier "bt470bg" bzw. "smpte170m") oder BT.2020 (UHD/HDR).

Mögliche Werte sind:

  • "rgb" – Identitätsmatrix, die Daten liegen schon als RGB vor
  • "bt709" – ITU-R BT.709, üblich bei HD-Video
  • "bt470bg" – ITU-R BT.470 System B/G (entspricht BT.601 für PAL/SECAM)
  • "smpte170m" – SMPTE 170M (entspricht BT.601 für NTSC)
  • "bt2020-ncl" – ITU-R BT.2020, nicht konstante Luminanz (UHD/HDR)
  • null – nicht angegeben oder unbekannt

Du brauchst die Eigenschaft vor allem, wenn du mit der WebCodecs API dekodierte VideoFrame-Objekte selbst weiterverarbeitest – etwa in einem WebGL- oder WebGPU-Shader, der YUV-Ebenen manuell nach RGB konvertiert. Mit falschen Koeffizienten bekommst du leichte, aber sichtbare Farbstiche, typischerweise zu grüne oder zu rote Hauttöne.

Der Wert wird beim Erzeugen über das Konstruktor-Dictionary festgelegt (new VideoColorSpace({ matrix: "bt709" })) oder vom Decoder aus den Metadaten des Bitstroms übernommen. Danach kannst du ihn nicht mehr ändern.

Rückgabewert

Typ
"rgb" | "bt709" | "bt470bg" | "smpte170m" | "bt2020-ncl" | null
Beschreibung
Ein String, der die Matrixkoeffizienten angibt, oder null, wenn sie nicht festgelegt sind.

Beispiele

Farbraum erstellen und Matrix auslesen

const colorSpace = new VideoColorSpace({
  primaries: 'bt709',
  transfer: 'bt709',
  matrix: 'bt709',
  fullRange: false
});

console.log(colorSpace.matrix);
console.log(colorSpace.toJSON());

// Ohne Angabe ist der Wert null
console.log(new VideoColorSpace().matrix);
bt709 { primaries: 'bt709', transfer: 'bt709', matrix: 'bt709', fullRange: false } null

Matrix eines dekodierten VideoFrame prüfen

const decoder = new VideoDecoder({
  output: (frame) => {
    const { matrix, fullRange } = frame.colorSpace;
    console.log(`Matrix: ${matrix ?? 'unbekannt'}, Full Range: ${fullRange}`);
    frame.close(); // Speicher sofort freigeben
  },
  error: (err) => console.error('Decoder-Fehler:', err)
});

decoder.configure({
  codec: 'avc1.64001f',
  codedWidth: 1280,
  codedHeight: 720
});
// Danach: decoder.decode(new EncodedVideoChunk({ ... }))
Matrix: bt709, Full Range: false

YUV→RGB-Koeffizienten für einen Shader wählen

// Kr- und Kb-Werte der jeweiligen Standards
const LUMA_COEFFS = {
  bt709: { kr: 0.2126, kb: 0.0722 },
  bt470bg: { kr: 0.299, kb: 0.114 },
  smpte170m: { kr: 0.299, kb: 0.114 },
  'bt2020-ncl': { kr: 0.2627, kb: 0.0593 }
};

const getCoefficients = (colorSpace, height) => {
  let matrix = colorSpace.matrix;
  if (matrix === 'rgb') return null; // keine Umrechnung nötig
  // Heuristik bei fehlender Angabe: HD -> BT.709, SD -> BT.601
  if (matrix === null) matrix = height >= 720 ? 'bt709' : 'smpte170m';
  return LUMA_COEFFS[matrix];
};

const cs = new VideoColorSpace({ matrix: 'bt2020-ncl' });
console.log(getCoefficients(cs, 2160));
console.log(getCoefficients(new VideoColorSpace(), 480));
{ kr: 0.2627, kb: 0.0593 } { kr: 0.299, kb: 0.114 }

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie colorSpace.matrix = 'bt709' hat keine Wirkung und wirft im Strict Mode einen TypeError. Wenn du einen anderen Wert brauchst, erzeuge ein neues VideoColorSpace-Objekt.
  • null immer abfangen: Viele Streams geben keine Farbmetadaten mit. Lege dann selbst einen Standardwert fest, üblich ist BT.709 bei HD und BT.601 bei SD.
  • Ungültige Werte: Ein unbekannter String im Konstruktor-Dictionary führt zu einem TypeError, weil der Wert ein WebIDL-Enum ist.
  • Nicht mit primaries verwechseln: matrix legt nur die YUV→RGB-Umrechnung fest. Den Farbumfang bestimmt primaries, die Gammakurve transfer. Ob der Wertebereich begrenzt (16–235) oder voll ist, steht in fullRange.
  • Kompatibilität: Die Eigenschaft gehört zur WebCodecs API. Diese gibt es nur in sicheren Kontexten (HTTPS), und zwar im Fenster und in Dedicated Workern. Chromium-Browser unterstützen sie ab Version 94, Safari ab 16.4 und Firefox erst seit neueren Versionen (ab 130). Prüfe die Unterstützung vorher mit 'VideoColorSpace' in globalThis.