RTCRtpScriptTransformer: generateKeyFrame() Methode

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Die generateKeyFrame()-Methode der RTCRtpScriptTransformer-Schnittstelle veranlasst einen Video-Encoder, ein Schlüsselbild zu erzeugen.

Syntax

js
generateKeyFrame()
generateKeyFrame(rid)

Parameter

rid Optional

Ein String, der die "Einschränkungskennung" ("RID") des Streams/Encoders enthält, der das neue Schlüsselbild generieren muss.

Der Wert muss zwischen 1 und 255 Zeichen (einschließlich) haben und darf nur alphanumerische Zeichen, Unterstriche und Bindestriche (A-Z, a-z, 0-9, -, _) enthalten. RIDs sind groß-/kleinbuchstabensensitiv und müssen einzigartig für den Peer-Kommunikationskanal sein.

Der erste Encoder, der mit dem angegebenen rid übereinstimmt, wird verwendet. Wenn kein Encoder mit dem rid übereinstimmt, wird der erste Encoder verwendet und rid auf die Einschränkungen des Encoders gesetzt.

Rückgabewert

Ein Promise, das mit dem Zeitstempel des Rahmens erfüllt wird oder mit einem Ausnahmefehler abgelehnt wird.

Ausnahmen

InvalidStateError

Der Encoder verarbeitet keine Videoframes oder ist undefined.

TypeError

Der bereitgestellte rid entspricht nicht den Grammatikanforderungen.

NotFoundError

Es gibt keine Video-Encoder. Dies könnte auftreten, wenn der entsprechende RTCRtpSender nicht aktiv ist oder seine Spur beendet ist.

Beschreibung

Diese Methode kann von einem Transformer aufgerufen werden, der ausgehende kodierte Videoframes verarbeitet, um das Senden eines neuen vollständigen (Schlüssel-)Frames zu erzwingen. Es könnte von einem WebRTC Encoded Transform benötigt werden, das Frames verschlüsselt, um sicherzustellen, dass, wenn ein neuer Verschlüsselungsschlüssel hinzugefügt wird, ein mit diesem Schlüssel verschlüsselter Schlüsselrahmen so schnell wie möglich gesendet wird.

Der Sender kann eine RID (auch als "Einschränkungskennung" oder "RTP-Stream-ID" bezeichnet) angeben, um zu steuern, welcher Codec den neuen Schlüsselrahmen erzeugt. Ein Stream kann (Simulcast) mehrere Versionen derselben Quelle enthalten, jede mit unterschiedlichen Eigenschaften wie Auflösung und Bildrate. Die RID wird verwendet, um einen bestimmten RTP-Stream anzugeben und folglich den Encoder, der einen neuen Frame generieren muss. Beachten Sie, dass die verfügbaren RID-Werte festgelegt werden, wenn der von der Verbindung verwendete Transceiver erstellt wird. Die verwendeten RID-Werte können durch Aufruf von RTCRtpSender.getParameters() und Überprüfung der encodings-Eigenschaft des zurückgegebenen Werts abgefragt werden.

Das von der Methode zurückgegebene Versprechen wird unmittelbar vor der Einreihung des entsprechenden Schlüsselbildes in einen RTCRtpScriptTransformer-lesbaren gelöst.

Hinweis: Das Senden mehrerer Streams (RID) gleichzeitig wird "Simulcast" genannt. Diese Funktion bietet einer Middlebox denselben Stream in mehreren Videoqualitätsstufen und ermöglicht es ihr, die Bandbreite zu verwalten, indem selektiv geeignete Ebenen an Teilnehmer übertragen werden und die Auflösung schnell umgeschaltet wird (d. h. Umschalten auf Weiterleitung von niedrigqualitativem Video für alle außer dem aktiven Sprecher). Der Empfänger erhält immer nur einen Stream, weshalb die vergleichbare Empfängermethode RTCRtpScriptTransformer.sendKeyFrameRequest() nicht erfordert, dass ein RID angegeben wird.

Beispiele

Senden eines Schlüsselrahmens

Das folgende Beispiel zeigt, wie der Haupt-Thread möglicherweise einen Verschlüsselungsschlüssel an eine Sendertransformation übergibt und den Codec veranlasst, einen Schlüsselrahmen zu erzeugen.

Beachten Sie, dass der Haupt-Thread keinen direkten Zugriff auf das RTCRtpScriptTransformer-Objekt hat, daher muss er den Schlüssel und RID an den Worker übergeben. Hier tun wir das mit einem MessageChannel und übertragen den zweiten Port an den Transformer-Code, der im Worker läuft. Der Code geht davon aus, dass bereits eine Peer-Verbindung besteht und videoSender ein RTCRtpSender ist.

js
const worker = new Worker("worker.js");
const channel = new MessageChannel();

videoSender.transform = new RTCRtpScriptTransform(
  worker,
  { name: "senderTransform", port: channel.port2 },
  [channel.port2],
);

// Post RID and new key to the sender
channel.port1.start();
channel.port1.postMessage({
  rid: "1",
  key: "93ae0927a4f8e527f1gce6d10bc6ab6c",
});

Der rtctransform-Ereignishandler im Worker erhält den Port und verwendet ihn, um auf message-Ereignisse zu lauschen. Wenn ein Ereignis empfangen wird, holt es sich das rid und key und ruft dann generateKeyFrame() auf.

js
event.transformer.options.port.onmessage = (event) => {
  const { rid, key } = event.data;
  // key is used by the transformer to encrypt frames (not shown)

  // Get codec to generate a new key frame using the rid
  // Here 'rcEvent' is the rtctransform event.
  rcEvent.transformer.generateKeyFrame(rid);
};

Spezifikationen

Specification
WebRTC Encoded Transform
# dom-rtcrtpscripttransformer-generatekeyframe

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch