RTCRtpScriptTransformer

Limited availability

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

Das RTCRtpScriptTransformer-Interface der WebRTC API bietet eine Worker-seitige Stream API Schnittstelle, die ein WebRTC Encoded Transform verwenden kann, um kodierte Medienrahmen in den eingehenden und ausgehenden WebRTC-Pipelines zu modifizieren.

Hinweis: Diese Funktion ist in Dedicated Web Workers verfügbar.

Instanz-Eigenschaften

RTCRtpScriptTransformer.readable Nur lesbar

Ein ReadableStream, auf dem kodierte Rahmen aus den WebRTC-Sender- oder -Empfängerpipelines eingereiht werden können.

RTCRtpScriptTransformer.writable Nur lesbar

Ein WritableStream, dem kodierte Rahmen zugeführt werden sollen.

RTCRtpScriptTransformer.options Nur lesbar

Optionen, die vom RTCRtpScriptTransform Konstruktor übergeben werden, um den Transformationscode basierend darauf zu konfigurieren, ob eingehende oder ausgehende Rahmen verarbeitet werden.

Instanz-Methoden

RTCRtpScriptTransformer.generateKeyFrame()

Fordert an, dass ein Video-Encoder einen Schlüsselrahmen generiert. Kann von einem Transformator in der Sender-Pipeline aufgerufen werden, wenn ausgehende Rahmen verarbeitet werden.

RTCRtpScriptTransformer.sendKeyFrameRequest()

Fordert an, dass der Sender einen Schlüsselrahmen sendet. Kann von einem Transformator in der Empfänger-Pipeline aufgerufen werden, wenn eingehende kodierte Videorahmen verarbeitet werden.

Beschreibung

Eine RTCRtpScriptTransformer-Instanz wird als Teil der Konstruktion eines zugehörigen RTCRtpScriptTransform erstellt, das den Worker bestimmt, in dem der Transformator erstellt wird, und die Optionen, die an ihn übergeben werden.

Der Transformator wird einem Worker durch das rtctransform-Ereignis transformer-Eigenschaft zur Verfügung gestellt. Dieses Ereignis wird bei der Konstruktion des zugehörigen RTCRtpScriptTransform ausgelöst und wenn ein kodierter Rahmen von einem Codec (ausgehend) oder vom Paketierer (eingehend) auf dem RTCRtpScriptTransformer.readable eingereiht wird.

Der Transformator stellt dem Worker einen readable und einen writable Stream sowie ein options Objekt zur Verfügung, das bei der Konstruktion an das RTCRtpScriptTransform übergeben wurde. Wenn das zugehörige RTCRtpScriptTransform einem RTCRtpSender oder RTCRtpReceiver zugewiesen wird, werden kodierte Medienrahmen aus den WebRTC-Sender- oder -Empfängerpipelines auf dem readable Stream eingereiht.

Ein WebRTC Encoded Transform muss kodierte Rahmen von transformer.readable lesen, sie nach Bedarf modifizieren und sie in derselben Reihenfolge und ohne Duplikation auf transformer.writable zurückschreiben. Die transformer.options ermöglichen die Verwendung einer geeigneten Transformationsfunktion, basierend darauf, ob die kodierten Medienrahmen eingehend oder ausgehend sind. Die Transformation wird üblicherweise implementiert, indem Rahmen vom readable durch eine oder mehrere TransformStream-Instanzen an den writable geleitet und nach Bedarf transformiert werden.

Das Interface bietet auch Methoden für einen Sender, um einen Video-Encoder anzuweisen, einen neuen Schlüsselrahmen zu generieren, oder für einen Empfänger, um einen neuen Schlüsselrahmen vom Encoder des Senders anzufordern (Video-Encoder senden häufig einen Schlüsselrahmen, der alle notwendigen Informationen zur Konstruktion eines Bildes enthält, und senden anschließend Delta-Rahmen, die nur die Informationen enthalten, die sich seit dem vorherigen Rahmen geändert haben).

Diese Methoden sind erforderlich, wenn ein Empfänger die eingehenden Rahmen nicht dekodieren könnte, bis er einen neuen Schlüsselrahmen erhält. Zum Beispiel wird ein neuer Teilnehmer eines Konferenzgesprächs das Video nicht sehen können, bis er einen neuen Schlüsselrahmen erhalten hat, da Delta-Rahmen nur dekodiert werden können, wenn man den letzten Schlüsselrahmen und alle darauf folgenden Delta-Rahmen hat. Ähnlich wird ein Empfänger, wenn Rahmen für ihn verschlüsselt sind, die Rahmen erst dekodieren können, wenn er seinen ersten verschlüsselten Schlüsselrahmen erhalten hat.

Beispiele

Dieses Beispiel zeigt den Code für eine WebRTC Encoded Transform, die in einem Worker läuft.

Der Code verwendet addEventListener(), um eine Handler-Funktion für das rtctransform-Ereignis zu registrieren, das den RTCRtpScriptTransformer als event.transformer verfügbar macht.

Der Handler erstellt einen TransformStream und leitet die Rahmen von event.transformer.readable durch ihn zu event.transformer.writable. Die Implementierung des transform() in diesem Transform-Stream wird für jeden kodierten Rahmen aufgerufen, der in die Warteschlange des Streams gestellt wird: Sie kann die Daten aus dem Rahmen lesen und in diesem Fall die Bytes negieren und den modifizierbaren Rahmen in die Warteschlange des Streams einreihen.

js
addEventListener("rtctransform", (event) => {
  const transform = new TransformStream({
    start() {}, // Called on startup.
    flush() {}, // Called when the stream is about to be closed.
    async transform(encodedFrame, controller) {
      // Reconstruct the original frame.
      const view = new DataView(encodedFrame.data);

      // Construct a new buffer
      const newData = new ArrayBuffer(encodedFrame.data.byteLength);
      const newView = new DataView(newData);

      // Negate all bits in the incoming frame
      for (let i = 0; i < encodedFrame.data.byteLength; ++i) {
        newView.setInt8(i, ~view.getInt8(i));
      }

      encodedFrame.data = newData;
      controller.enqueue(encodedFrame);
    },
  });
  event.transformer.readable
    .pipeThrough(transform)
    .pipeTo(event.transformer.writable);
});

Die einzigen besonderen Aspekte des oben erwähnten TransformStream sind, dass er kodierte Medienrahmen (RTCEncodedVideoFrame oder RTCEncodedAudioFrame) anstelle von beliebigen "Chunks" einreiht, und dass writableStrategy und readableStrategy Eigenschaften nicht definiert sind (weil die Einreihungsstrategie vollständig vom Benutzer-Agent verwaltet wird).

Eine Transformation kann entweder in den eingehenden oder ausgehenden WebRTC-Pipelines laufen. Dies spielt im obigen Code keine Rolle, da der gleiche Algorithmus im Sender verwendet werden könnte, um die Rahmen zu negieren, und im Empfänger, um sie wiederherzustellen. Wenn die Sender- und Empfängerpipelines einen anderen Transformationsalgorithmus anwenden müssen, muss die Information über die aktuelle Pipeline vom Hauptthread übergeben werden. Dies geschieht durch Setzen eines options-Arguments im entsprechenden RTCRtpScriptTransform Konstruktor, das dann im Worker in RTCRtpScriptTransformer.options verfügbar gemacht wird.

Unten verwenden wir die transformer.options, um entweder eine Sender- oder Empfängertransformation auszuwählen. Beachten Sie, dass die Eigenschaften des Objekts beliebig sind (solange die Werte serialisiert werden können), und dass es auch möglich ist, ein MessageChannel zu übertragen und es zu verwenden, um zur Laufzeit mit einer Transformation zu kommunizieren, um beispielsweise Verschlüsselungsschlüssel zu teilen.

js
// Code to instantiate transform and attach them to sender/receiver pipelines.
onrtctransform = (event) => {
  let transform;
  if (event.transformer.options.name == "senderTransform")
    transform = createSenderTransform();
  // returns a TransformStream (not shown)
  else if (event.transformer.options.name == "receiverTransform")
    transform = createReceiverTransform();
  // returns a TransformStream (not shown)
  else return;
  event.transformer.readable
    .pipeThrough(transform)
    .pipeTo(event.transformer.writable);
};

Beachten Sie, dass der obige Code Teil komplexerer Beispiele ist, die in Using WebRTC Encoded Transforms bereitgestellt werden.

Spezifikationen

Specification
WebRTC Encoded Transform
# rtcrtpscripttransformer

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch