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.
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.
// 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