Start · Sprachen · JavaScript · Referenz · RTCVideoSourceStats.height

RTCVideoSourceStats.height

Eigenschaft

Gibt die Höhe des letzten Frames in Pixeln an, den eine lokale Videoquelle (Kamera, Bildschirm) an die <code>RTCPeerConnection</code> geliefert hat.

seit JavaScript Chrome 90+, Edge 90+, Safari 16.4+; in Firefox nic Kategorie: webapi

Signatur

RTCVideoSourceStats.height

Beschreibung

Die schreibgeschützte Eigenschaft height des Wörterbuchs RTCVideoSourceStats enthält die Höhe in Pixeln des zuletzt gelieferten Frames einer lokalen Videoquelle. Solche Statistikobjekte bekommst du über RTCPeerConnection.getStats() oder RTCRtpSender.getStats(). Du erkennst sie am Eintrag type === "media-source" zusammen mit kind === "video".

Der Wert beschreibt die Auflösung vor der Kodierung, also so, wie der MediaStreamTrack die Frames erzeugt. Das ist nicht unbedingt die Auflösung, die tatsächlich gesendet wird. Wenn der Encoder wegen knapper Bandbreite oder hoher CPU-Last herunterskaliert oder Simulcast nutzt, findest du die gesendete Höhe in RTCOutboundRtpStreamStats.frameHeight.

Typische Einsatzfälle sind die Diagnose von Kamera-Einschränkungen (etwa ob getUserMedia-Vorgaben wie height: 720 eingehalten werden), Qualitäts-Dashboards und der Vergleich zwischen Quell- und Sendeauflösung, um eine Herunterskalierung zu erkennen.

Rückgabewert

Typ
number | undefined
Beschreibung
Positive Ganzzahl mit der Höhe des letzten Quell-Frames in Pixeln. Der Wert ist undefined, solange noch kein Frame von der Quelle geliefert wurde.

Beispiele

Auflösung der lokalen Kamera auslesen

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ video: { height: 720 } });
stream.getTracks().forEach((track) => pc.addTrack(track, stream));

// Kurz warten, bis erste Frames geliefert wurden
await new Promise((r) => setTimeout(r, 1000));

const report = await pc.getStats();
report.forEach((stats) => {
  if (stats.type === 'media-source' && stats.kind === 'video') {
    console.log(`Quelle: ${stats.width}x${stats.height} @ ${stats.framesPerSecond} fps`);
  }
});
Quelle: 1280x720 @ 30 fps

Herunterskalierung durch den Encoder erkennen

const checkScaling = async (sender) => {
  const report = await sender.getStats();
  let source, outbound;
  report.forEach((s) => {
    if (s.type === 'media-source' && s.kind === 'video') source = s;
    if (s.type === 'outbound-rtp' && s.kind === 'video') outbound = s;
  });
  if (!source?.height || !outbound?.frameHeight) return;

  const ratio = outbound.frameHeight / source.height;
  if (ratio < 1) {
    console.warn(`Skaliert: ${source.height}p → ${outbound.frameHeight}p (Grund: ${outbound.qualityLimitationReason})`);
  }
};

const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
setInterval(() => checkScaling(videoSender), 2000);
Skaliert: 720p → 360p (Grund: bandwidth)

Wechsel der Quellauflösung überwachen (z. B. Bildschirmfreigabe)

let lastHeight;
const monitor = async (pc) => {
  const report = await pc.getStats();
  for (const s of report.values()) {
    if (s.type === 'media-source' && s.kind === 'video' && s.height !== lastHeight) {
      console.log(`Neue Quellhöhe: ${s.height ?? 'noch kein Frame'}`);
      lastHeight = s.height;
    }
  }
};
setInterval(() => monitor(pc), 1000);
Neue Quellhöhe: 1080

// Wichtig · Fallstricke

  • Nicht mit der gesendeten Auflösung verwechseln: height gibt die Auflösung der Quelle an. Was tatsächlich gesendet wird, steht in RTCOutboundRtpStreamStats.frameHeight, und die beiden Werte können sich unterscheiden.
  • Der Wert kann undefined sein, solange noch kein Frame geliefert wurde. Prüfe ihn deshalb vorher, zum Beispiel mit ?. oder ??.
  • Bei Bildschirmfreigabe oder gedrehten Mobilgeräten ändert sich die Höhe während der Verbindung. Frage den Wert deshalb regelmäßig ab, statt ihn nur einmal zu lesen.
  • Browser-Kompatibilität: Chromium-Browser und Safari unterstützen RTCVideoSourceStats. Firefox liefert bisher keine media-source-Einträge für Video. Prüfe also, ob die Eigenschaft vorhanden ist, bevor du sie auswertest.
  • Die Statistiken liegen nur für lokale Tracks vor, die über einen RTCRtpSender angebunden sind. Für empfangene Streams gibt es sie nicht.