RTCRtpScriptTransformer
Ограниченная доступность
Эта функция не относится к Baseline, так как она не работает в некоторых из наиболее широко используемых браузеров.
Интерфейс RTCRtpScriptTransformer API WebRTC предоставляет интерфейс Stream API для стороны обработчика, который WebRTC кодированное преобразование может использовать для изменения закодированных кадров медиа в входящих и исходящих потоках WebRTC.
Примечание: Эта функция доступна в специализированных Web Workers.
Свойства экземпляра
-
RTCRtpScriptTransformer.readableТолько для чтения -
Поток
ReadableStream, на который могут помещаться закодированные кадры из потоков отправителя или получателя WebRTC. -
RTCRtpScriptTransformer.writableТолько для чтения -
Поток
WritableStream, в который должны поступать закодированные кадры. -
RTCRtpScriptTransformer.optionsТолько для чтения -
Параметры, переданные из
RTCRtpScriptTransformконструктора, которые используются для настройки кода преобразования на основе того, обрабатываются ли входящие или исходящие кадры.
Методы экземпляра
RTCRtpScriptTransformer.generateKeyFrame()-
Запрашивает у кодера видео генерацию ключевого кадра. Может вызываться преобразователем в потоке отправителя при обработке исходящих кадров.
RTCRtpScriptTransformer.sendKeyFrameRequest()-
Запрашивает отправителя отправить ключевой кадр. Может вызываться преобразователем в потоке получателя при обработке входящих закодированных видеокадров.
Описание
Экземпляр RTCRtpScriptTransformer создается как часть создания связанного RTCRtpScriptTransform, который определяет обработчик, в котором создается преобразователь, и параметры, которые будут ему переданы.
Преобразователь становится доступным для обработчика через событие rtctransform transformer свойство. Это событие срабатывает при создании связанного RTCRtpScriptTransform и при помещении закодированного кадра в очередь на RTCRtpScriptTransformer.readable от кодека (исходящий) или от пакетизатора (входящий).
Преобразователь предоставляет поток readable и writable в обработчик, а также объект options, предоставленный RTCRtpScriptTransform при создании. Когда связанный RTCRtpScriptTransform присваивается RTCRtpSender или RTCRtpReceiver, закодированные кадры медиа из потоков WebRTC отправителя или получателя помещаются в очередь в поток readable.
WebRTC кодированное преобразование должно считывать закодированные кадры из transformer.readable, изменять их по мере необходимости и записывать в transformer.writable в том же порядке и без дублирования. transformer.options позволяют использовать соответствующую функцию преобразования, в зависимости от того, являются ли закодированные кадры медиа входящими или исходящими. Преобразование обычно реализуется путем передачи кадров из readable через один или несколько экземпляров TransformStream в writable, преобразуя их по мере необходимости.
Интерфейс также предоставляет методы для генерации ключевого кадра отправителем, чтобы заставить кодер видео сгенерировать новый ключевой кадр, или для получателя запросить новый ключевой кадр у кодера отправителя (кодеры видео обычно отправляют ключевой кадр, содержащий всю необходимую информацию для построения изображения, а затем отправляют кадры с изменениями, содержащие только информацию, которая изменилась с момента предыдущего кадра).
Эти методы необходимы в случаях, когда получатель не сможет декодировать входящие кадры до тех пор, пока не получит новый ключевой кадр. Например, новый получатель, присоединяющийся к конференц-звонку, не сможет увидеть видео, пока не получит новый ключевой кадр, поскольку кадры с изменениями могут быть декодированы только при наличии последнего ключевого кадра и всех последующих кадров с изменениями. Аналогично, если кадры зашифрованы для получателя, они смогут декодировать кадры только после получения своего первого зашифрованного ключевого кадра.
Примеры
В этом примере показан код WebRTC кодированного преобразования, работающего в обработчике.
Код использует addEventListener() для регистрации обработчика функций для события rtctransform, что делает RTCRtpScriptTransformer доступным как event.transformer.
Обработчик создает TransformStream и передает кадры из event.transformer.readable через него в event.transformer.writable. Реализация потока преобразования transform() вызывается для каждого закодированного кадра, помещенного в очередь в потоке: она может считывать данные из кадра и в этом случае инвертирует байты, а затем помещает изменяемый кадр в очередь в потоке.
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);
});
Единственное, что следует отметить в отношении TransformStream выше, это то, что он помещает в очередь закодированные кадры медиа (RTCEncodedVideoFrame или RTCEncodedAudioFrame), а не произвольные «куски», и что свойства writableStrategy и readableStrategy не определены (потому что стратегия очереди полностью управляется пользовательским агентом).
Преобразование может выполняться как входящих, так и исходящих потоках WebRTC. Это не имеет значения в приведенном выше коде, потому что тот же алгоритм может использоваться для отправки для инвертирования кадров и в получении для их отмены. Если для потоков отправителя и получателя требуются разные алгоритмы преобразования, информация о текущем потоке должна передаваться из основного потока. Это делается путем установки аргумента options в соответствующем RTCRtpScriptTransform конструкторе, который затем становится доступным обработчику в RTCRtpScriptTransformer.options.
Ниже мы используем transformer.options для выбора преобразования отправителя или получателя. Обратите внимание, что свойства объекта произвольные (при условии, что значения могут быть сериализованы), и также можно передать MessageChannel и использовать его для общения с преобразованием во время выполнения, например, для обмена ключами шифрования.
// 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);
};
Обратите внимание, что приведенный выше код является частью более полных примеров, предоставленных в Использование WebRTC закодированных преобразований.
Спецификации
Совместимость браузеров
| Рабочий стол | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
RTCRtpScriptTransformer |
Нет | Нет | 117 | Нет | 15.4 | Нет | 117 | Нет | 15.4 | Нет | Нет |
generateKeyFrame |
Нет | Нет | 117 | Нет | 15.4 | Нет | 117 | Нет | 15.4 | Нет | Нет |
options |
Нет | Нет | 117 | Нет | 15.4 | Нет | 117 | Нет | 15.4 | Нет | Нет |
readable |
Нет | Нет | 117 | Нет | 15.4 | Нет | 117 | Нет | 15.4 | Нет | Нет |
sendKeyFrameRequest |
Нет | Нет | 117 | Нет | 15.4 | Нет | 117 | Нет | 15.4 | Нет | Нет |
writable |
Нет | Нет | 117 | Нет | 15.4 | Нет | 117 | Нет | 15.4 | Нет | Нет |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpScriptTransformer