Вставляемые потоки для MediaStreamTrack
Содержимое MediaStreamTrack
отображается как поток, которым можно управлять или использовать для создания нового содержимого.
Вставляемые потоки для MediaStreamTrack
являются частью проекта возможностей и в настоящее время находятся в разработке.
Фон
В контексте API захвата мультимедиа и потоков интерфейс MediaStreamTrack
представляет собой одну дорожку мультимедиа в потоке; обычно это аудио- или видеодорожки, но могут существовать и другие типы треков. Объекты MediaStream
состоят из нуля или более объектов MediaStreamTrack
, представляющих различные аудио- или видеодорожки. У каждого MediaStreamTrack
может быть один или несколько каналов. Канал представляет собой наименьшую единицу медиапотока, такую как аудиосигнал, связанный с данным динамиком, например, левый или правый в стереофонической звуковой дорожке.
Для чего нужны вставляемые потоки MediaStreamTrack?
Основная идея, лежащая в основе вставляемых потоков MediaStreamTrack
, заключается в том, чтобы предоставить содержимое объекта MediaStreamTrack
как коллекцию потоков (как определено API потоков WHATWG). Этими потоками можно манипулировать для введения новых компонентов.
Предоставление разработчикам доступа к потоку видео (или аудио) напрямую позволяет им вносить изменения непосредственно в поток. Напротив, реализация одной и той же задачи обработки видео традиционными методами требует от разработчиков использования посредников, таких как элементы <canvas>
.
Примеры использования
Варианты использования вставляемых потоков для MediaStreamTrack
включают, но не ограничиваются:
- Гаджеты для видеоконференций, такие как «funny hats» или виртуальные фоны.
- Обработка голоса как программные vocoders.
Как использовать вставляемые потоки для MediaStreamTrack?
Начиная с Chrome 90, вставляемые потоки для MediaStreamTrack
доступны как часть пробной версии WebCodecs origin в Chrome. Ожидается, что пробная версия origin завершится в Chrome 91 (14 июля 2021 г.). При необходимости будет продолжена отдельная пробная версия источника для вставляемых потоков для MediaStreamTrack
.
Пробные версии Origin позволяют вам опробовать новые функции и сообщить сообществу разработчиков веб-стандартов отзывы об их удобстве использования, практичности и эффективности. Дополнительные сведения см. В руководстве по пробным версиям Origin для веб-разработчиков. Чтобы подписаться на пробную версию того или иного происхождения, посетите страницу регистрации.
Зарегистрируйтесь для получения пробной версии origin
- Запросите токен для вашего источника
- Добавьте токен на свои страницы. Это можно сделать двумя способами:Добавьте
origin-trial
<meta>
тег в заголовок каждой страницы. Например, это может выглядеть примерно так:<meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
Если вы можете настроить свой сервер, вы также можете добавить токен с помощью HTTP-заголовкаOrigin-Trial
. Результирующий заголовок ответа должен выглядеть примерно так:Origin-Trial: TOKEN_GOES_HERE
Включение через chrome: // flags
Чтобы поэкспериментировать со вставляемыми потоками для MediaStreamTrack
локально, без пробного маркера origin, включите флаг #enable-experimental-web-platform-features
в chrome://flags
.
Обнаружение функции
Вы можете обнаруживать вставляемые потоки для поддержки MediaStreamTrack
следующим образом.
if ('MediaStreamTrackProcessor' in window && 'MediaStreamTrackGenerator' in window) {
// Insertable streams for `MediaStreamTrack` is supported.
}
Основные концепции
Вставляемые потоки для построения концепций MediaStreamTrack
, ранее предложенных WebCodecs, и концептуально разделяют MediaStreamTrack
на два компонента:
MediaStreamTrackProcessor
, который потребляет источник объектаMediaStreamTrack
и генерирует поток кадров медиа, в частности,
илиVideoFrame
объекты. Вы можете думать об этом как о приемнике трека, который способен предоставлять незашифрованные кадры из трека в видеAudioFrame
ReadableStream
. Он также открывает канал управления для сигналов, идущих в противоположном направлении.- Объект
MediaStreamTrackGenerator
, который потребляет поток кадров мультимедиа и предоставляет интерфейсMediaStreamTrack
. В качестве входных данных принимает медиафреймы. Кроме того, он обеспечивает доступ к управляющим сигналам, которые генерируются приемником.
MediaStreamTrackProcessor
У объекта MediaStreamTrackProcessor
есть два свойства:
readable
: Позволяет читать кадры изMediaStreamTrack
. Если дорожка является видеодорожкой, считанные фрагментыreadable
будутVideoFrame
объектами. Если дорожка является звуковой дорожкой, считанные фрагментыreadable
будутAudioFrame
объектами.writableControl
: Позволяет отправлять управляющие сигналы на трек. Сигналы управления - это объекты типаMediaStreamTrackSignal
.
MediaStreamTrackGenerator
У объекта MediaStreamTrackGenerator
также есть два свойства:
writable
:WritableStream
который позволяет записывать кадры мультимедиа в файлMediaStreamTrackGenerator
, который сам по себе является файломMediaStreamTrack
. Если атрибутkind
это"audio"
, поток принимаетAudioFrame
объекты и не работает с любым другим типом. Если атрибутkind
это"video"
, поток принимаетVideoFrame
объекты и не работает с любым другим типом. Когда фрейм записываетсяwritable
, метод фреймаclose()
вызывается автоматически, так что его медиаресурсы больше не доступны из JavaScript.readableControl
:ReadableStream
который позволяет считывать управляющие сигналы, отправленные с любых приемников, подключенных кMediaStreamTrackGenerator
. Сигналы управления - это объекты типаMediaStreamTrackSignal
.
В модели MediaStream
, помимо среды, которая течет от источников к стокам, есть также управляющие сигналы, которые текут в противоположном направлении (т. е. от приемников к источникам через дорожку). A MediaStreamTrackProcessor
является приемником, и он позволяет отправлять управляющие сигналы на свой трек и источник через свое свойство writableControl
. MediaStreamTrackGenerator
- это дорожка, для которой можно реализовать настраиваемый источник, записав в его поле writable
кадры мультимедиа. Такой источник может получать управляющие сигналы, отправленные приемниками, через свое свойство readableControl
.
Собираем все вместе
Основная идея состоит в том, чтобы создать следующую технологическую цепочку:
Трек платформы → Процессор → Преобразование → Генератор → Поглотители платформы
Для приложения сканера штрих-кода эта цепочка будет выглядеть, как в примере кода ниже.
const stream = await getUserMedia({ video: true });
const videoTrack = stream.getVideoTracks()[0];
const trackProcessor = new MediaStreamTrackProcessor({ track: videoTrack });
const trackGenerator = new MediaStreamTrackGenerator({ kind: 'video' });
const transformer = new TransformStream({
async transform(videoFrame, controller) {
const barcodes = await detectBarcodes(videoFrame);
const newFrame = highlightBarcodes(videoFrame, barcodes);
videoFrame.close();
controller.enqueue(newFrame);
},
});
trackProcessor.readable.pipeThrough(transformer).pipeTo(trackGenerator.writable);
trackGenerator.readableControl.pipeTo(trackProcessor.writableControl);
Демо
Вы можете увидеть демонстрацию сканера QR-кода из раздела выше в действии на настольный компьютер или мобильном браузере. Держите QR-код перед камерой, и приложение обнаружит его и выделит. Вы можете увидеть исходный код приложения на Glitch.
Вопросы безопасности и конфиденциальности
Безопасность этого API зависит от существующих механизмов веб-платформы. Поскольку данные отображаются с использованием интерфейсов VideoFrame
и AudioFrame
, применяются правила этих интерфейсов для работы с данными, испорченными источником. Например, невозможно получить доступ к данным из ресурсов перекрестного происхождения из-за существующих ограничений на доступ к таким ресурсам (например, невозможно получить доступ к пикселям изображения или видеоэлемента перекрестного происхождения). Кроме того, доступ к мультимедийным данным с камер, микрофонов или экранов требует авторизации пользователя. Медиа-данные, которые предоставляет этот API, уже доступны через другие API. В дополнение к мультимедийным данным этот API предоставляет некоторые управляющие сигналы, такие как запросы новых кадров. Эти сигналы служат подсказками и не представляют значительного риска для безопасности.