Обработка видео с помощью WebCodecs

Управление компонентами видеопотока.

Евгений Земцов
Eugene Zemtsov
Франсуа Бофор
François Beaufort

Современные веб-технологии предоставляют множество способов работы с видео. API Media Stream , API Media Recording , API Media Source и API WebRTC составляют богатый набор инструментов для записи, передачи и воспроизведения видеопотоков. Решая некоторые высокоуровневые задачи, эти API не позволяют веб-программистам работать с отдельными компонентами видеопотока, такими как кадры и несмешанные фрагменты кодированного видео или аудио. Чтобы получить низкоуровневый доступ к этим базовым компонентам, разработчики используют WebAssembly для добавления видео- и аудиокодеков в браузер. Но, учитывая, что современные браузеры уже поставляются с множеством кодеков (которые часто ускоряются аппаратно), их переупаковка в WebAssembly кажется пустой тратой человеческих и компьютерных ресурсов.

API WebCodecs устраняет эту неэффективность, предоставляя программистам возможность использовать медиакомпоненты, уже имеющиеся в браузере. В частности:

  • Видео и аудио декодеры
  • Видео и аудио кодеры
  • Необработанные видеокадры
  • Декодеры изображений

API WebCodecs полезен для веб-приложений, которым требуется полный контроль над обработкой медиаконтента, таких как видеоредакторы, видеоконференции, потоковое видео и т. д.

Рабочий процесс обработки видео

Кадры играют ключевую роль в обработке видео. Поэтому в веб-кодеках большинство классов либо потребляют, либо создают кадры. Видеокодеры преобразуют кадры в закодированные фрагменты. Видеодекодеры делают обратное.

VideoFrame также отлично взаимодействует с другими веб-API, поскольку является источником CanvasImageSource и имеет конструктор , принимающий CanvasImageSource . Поэтому его можно использовать в таких функциях, как drawImage() и texImage2D() . Кроме того, его можно создавать из холстов, растровых изображений, видеоэлементов и других видеокадров.

API WebCodecs хорошо работает в тандеме с классами из API Insertable Streams , которые подключают WebCodecs к дорожкам медиапотока .

  • MediaStreamTrackProcessor разбивает медиа-дорожки на отдельные кадры.
  • MediaStreamTrackGenerator создает медиа-дорожку из потока кадров.

Веб-кодеки и веб-работники

API WebCodecs изначально выполняет всю тяжёлую работу асинхронно и вне основного потока. Однако, поскольку обратные вызовы кадров и фрагментов часто могут вызываться несколько раз в секунду, они могут загромождать основной поток и, следовательно, снижать отзывчивость сайта. Поэтому предпочтительнее перенести обработку отдельных кадров и закодированных фрагментов в веб-воркер.

Для этого ReadableStream предоставляет удобный способ автоматической передачи всех кадров с медиадорожки в воркер. Например, MediaStreamTrackProcessor можно использовать для получения ReadableStream для медиадорожки с веб-камеры. После этого поток передается в веб-воркер, где кадры считываются по одному и помещаются в очередь в VideoEncoder .

Благодаря HTMLCanvasElement.transferControlToOffscreen даже рендеринг можно осуществлять вне основного потока. Но если все эти высокоуровневые инструменты оказались неудобными, сам VideoFrame можно переносить между рабочими процессами.

Веб-кодеки в действии

Кодирование