Отпечатки

Возможности WebCodecs и конфиденциальность браузера

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

Документация

Нужна структурированная документация по теме Отпечатки?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

WebCodecs предоставляет веб-приложениям низкоуровневый доступ к кодированию и декодированию аудио и видео (определение W3C). VideoFrame также принимает поддерживаемые источники изображений, поэтому полученные из них кадры можно передавать в обработку видео (VideoFrame W3C); это не общий API кодирования статичных изображений. Сведения о поддержке помогают выбрать путь обработки, но не описывают устройство целиком и не являются его идентификатором. Результат зависит от браузера, операционной системы, доступных кодеков и контекста выполнения.

Требование к медиа приводит к проверке поддержки, а затем к WebCodecs или запасному пути приложения.

Какие сведения предоставляет WebCodecs

API представляет обработку медиа через закодированные фрагменты и конфигурации кодеков. Приложение может до начала работы проверить поддержку конфигурации и не запускать путь, который текущий браузер не может выполнить. Такой ответ помогает выбрать вариант, но не обещает конкретную скорость или качество. Положительный результат проверки не гарантирует успешность последующей асинхронной обработки: её ошибки отдельно передаются через обработчик ошибок (проверка конфигурации, модель обработки, обработчик ошибок).

Это не то же самое, что объявление типа файла или согласование параметров звонка в реальном времени. Спецификация W3C указывает, что закодированные данные здесь не упакованы в контейнер (строка кодека); WebCodecs также не определяет сетевой транспорт, поэтому упаковка и передача относятся к отдельным уровням приложения. См. поддержку MIME и кодеков и поведение кодеков WebRTC.

Положительный ответ о поддержке не означает готовность к обработке. Создание объекта кодека все еще может завершиться ошибкой из-за нехватки ресурсов или изменения контекста. Ответ относится к полной переданной конфигурации: она может включать профиль, размеры, частоту кадров, частоту дискретизации и другие параметры. Проверяйте конфигурацию задачи пользователя, а не широкий список несвязанных сочетаний (поддержка конфигурации).

Поскольку обработка асинхронна, приложению нужно управлять очередями, выходными данными, ошибками и ресурсами. Спецификация предоставляет размеры очередей кодирования и декодирования, а также события dequeue; работа может накапливаться при насыщении кодека (модель обработки). Ограничивайте ожидающую работу и применяйте обратное давление: при отставании следующего этапа приостанавливайте новые входные данные, а не молча отбрасывайте кадры, которые пользователь рассчитывает сохранить. Закрывайте VideoFrame и AudioData, когда они больше не нужны (системные ресурсы, VideoFrame.close()). Показывайте, ожидает ли задача, выполняется, приостановлена или готова: ответ о поддержке не описывает ее текущее состояние. Предварительный просмотр может использовать упрощенное представление, а экспорт может сохранять запрошенное качество исходника; это различие нужно сообщить. При отмене в приложении прекратите прием данных, освободите ресурсы задачи и сохраните оригинал для выбора другого пути.

VideoFrame.timestamp и duration измеряются в микросекундах: сохраняйте временную шкалу медиа, не подменяйте ее временем получения callback.

При преобразовании и экспорте проверяйте также цветовое пространство, обрезку, поворот и отражение. VideoFrame и AudioData могут удерживать память CPU/GPU и эксклюзивные ресурсы кодека. Закрывайте объекты после завершения их потребителем и определяйте владельца данных, если они передаются рендереру, очереди или мультиплексору (системные ресурсы, VideoFrame).

При насыщении новые запросы буферизуются и увеличивают размер очереди; порог задается реализацией и может быть неограниченным, поэтому переносимого счетчика, предсказывающего скорость или гарантирующего завершение в другой реализации, нет.

Событие dequeue помогает регулировать новые входные данные, но не подтверждает завершение выходных callbacks или упаковки файла: отслеживайте эти этапы отдельно.

Кодек может удерживать выходные данные до новых входов, а flush() требует выдать ожидающие результаты; перед завершением проверьте последние кадры и фрагменты.

Состояние очереди, callbacks и файла является отдельными показателями рабочего процесса приложения, а не свойствами устройства. Укоротившаяся очередь не означает, что экспорт завершен, а время получения callback не заменяет временные метки медиа.

При отмене закройте кадры, которые еще не попали к потребителю, но не закрывайте объект, работу с которым еще выполняет другая часть конвейера. Определите владельца объекта, пока он хранится в рендерере, очереди или мультиплексоре.

Почему поддержка различается

WebCodecs задаёт интерфейс, а не гарантирует доступность всех кодеков на любой платформе. Результат зависит от реализации функций в версии браузера и кодеков, предоставляемых операционной системой или медиастеком. На выбор влияет и аппаратное ускорение, однако поддерживаемая конфигурация не означает, что обработка обязательно будет ускоренной.

Стандарты и браузерные реализации развиваются: браузер может добавить функцию, исправить реализацию или изменить интеграцию с ОС; сама ОС может независимо обновить медиасервисы, а администратор может ограничить возможности управляемой установки. Фиксируйте версию браузера, семейство ОС, версию приложения и требование медиа-задачи, чтобы отчет был полезен без догадок о неизвестном оборудовании. Одинаковый номер версии не гарантирует одинаковую медиасреду: дистрибутивы могут полагаться на системные библиотеки или кодеки и их расписание выпуска. Два компьютера могут одинаково ответить на проверку, но иметь разную производительность; поддержка описывает совместимость, а не результат теста скорости.

Если важно аппаратное ускорение, измеряйте реальную задачу на репрезентативных системах и отделяйте результат от утверждений о приватности или личности. Обновление браузера может изменить доступность без изменения стандарта; проверяйте ее при выборе пути приложения, не считая старый ответ постоянными метаданными устройства. Управляемая рабочая станция может ограничить функцию политикой, а личная установка может предоставить ее; оба результата допустимы в соответствующих диапазонах поддержки. Не превращайте одну проверку в общее утверждение о платформе. Обновление системного медиасервиса может изменить путь, даже если приложение выглядит неизменным.

В заметке о выпуске называйте проверенную пользовательскую задачу и доступный запасной путь, а не обещайте одинаковое качество на каждом компьютере. Таблица совместимости должна сообщать, что тестировалось, что наблюдалось и что делать пользователю. Указывайте, использовался ли импортированный файл, источник реального времени или сгенерированный образец: у путей разные разрешения и обработка данных. Короткий образец не покрывает длинный экспорт, переменную частоту кадров, многоканальное аудио или прерванную загрузку. Документируйте эти границы, не раскрывая внутренние детали реализации.

Если задача не поддерживается, до затрат времени или передачи данных предложите другой формат, локальную альтернативу или явную загрузку в сервис. Проверьте первое использование: выбор файла, выдачу нужного разрешения, выбор результата и ожидание завершения. Сбой на любом этапе должен сохранять исходник и объяснять следующий шаг, не требуя повторить несвязанное разрешение. Для повторяющегося сценария можно запомнить предпочтение формата без хранения полного профиля возможностей; пользователь должен легко изменить его, если обновление браузера меняет доступный путь. Выбор пользователя не является наблюдением браузера.

Границы приватности и совместимости

Согласно W3C, профиль возможностей кодеков сам по себе с очень низкой вероятностью уникально идентифицирует человека, но его можно объединить с другими метриками для создания цифрового отпечатка (соображения конфиденциальности). Это не гарантия того, что ответ никогда не поможет идентифицировать человека или устройство. Риск возрастает, если приложение сохраняет ненужные наблюдения или связывает их с другой информацией. Запрашивайте только конфигурации, необходимые для медиа-задачи, и не сохраняйте подробные результаты, когда достаточно выбрать способ воспроизведения.

WebCodecs также не предоставляет камеру, микрофон или файл: у этих входов свои разрешения и ожидания. Запрашивайте вход только когда он нужен, объясняйте это в контексте и различайте импорт файлов и прямой захват. Соразмеряйте проверки задаче: аудиоредактору может требоваться декодировать импорт и кодировать экспорт, но не проверять несвязанные настройки видео. Узкие проверки упрощают работу и согласуют сбор данных с функцией. Отделяйте выбор возможностей от личности аккаунта, чтобы решение о медиа не стало скрытым полем профиля.

Если телеметрия нужна поддержке, предпочитайте агрегированный итог, выполнено, недоступно или использован запасной путь, и объясняйте цель и срок хранения. Не сохраняйте полную конфигурацию, если достаточно краткого статуса. Исходное медиа может содержать голоса, лица, местоположение или частные документы, поэтому для него нужны отдельные правила доступа и удаления. Не называйте локальный просмотр приватным, если оригинал позже загружается для экспорта. Удаленная конвертация должна раскрывать границу сервиса до начала загрузки. Это помогает пользователю принять решение и поддержке объяснить действия браузера.

Проверка выпуска браузера

Сравнивайте одну и ту же задачу и приложение в поддерживаемых версиях браузера. Записывайте, завершается ли сценарий, используется ли запасной путь и изменилось ли поведение после обновления. Начните с видимых требований, входа, ожидаемого результата, поддерживаемого запасного пути и репрезентативных медиа; проверяйте обработку выхода, а не только ответ о поддержке. Функциональную приемку отделяйте от качества изображения, синхронизации, задержки, памяти и размера экспорта.

Стройте проверки вокруг задач пользователя, а не всех комбинаций кодеков: открыть запись, обрезать фрагмент, экспортировать и воспроизвести. Укажите входной контейнер и дорожки, ожидаемый результат и точку отмены. Предпочитайте синтетические образцы; длинный образец выявит рост очереди, разрывы временных меток и давление на память без личного медиа. Отдельно проверяйте выбор файлов и разрешения камеры или микрофона; отказ в прямом захвате не должен блокировать импорт. Переход по ссылке, сворачивание страницы или сон устройства не должны показывать ложный успех. Записывайте, удален ли частичный файл после прерывания, можно ли его восстановить или он не показывался. Повтор должен использовать известный вход и не переключать молча выбранную пользователем локальную работу на удаленный сервис.

Проверяйте метаданные контейнера, порядок и длительность дорожек, порядок кадров, поворот, субтитры и интерпретацию цвета; в аудио слушайте обрезанные начала, отсутствующие каналы и рассинхронизацию после перемотки. Отдельно тестируйте неподдерживаемые конфигурации, поврежденный ввод, нехватку ресурсов, отмену и неполный результат. Для воспроизведения отличий сохраняйте только версию браузера, ОС, ревизию приложения, тип входа, запрошенную конфигурацию и результат, не собирая посторонние детали среды. Проверка выпуска браузера рассматривает браузер и тестовую конфигурацию как единый набор выпуска. Проверяйте непрерывность временных меток после перемотки и отсутствие в архивном экспорте кадров, намеренно пропущенных только в предварительном просмотре. Эти проверки показывают, работает ли пользовательская задача без широкого инвентаря возможностей.

Методы кодека не означают отмену задачи приложения. flush() завершает сообщения управления в очереди и выдает ожидающие выходные данные, но не упаковывает контейнер и не подтверждает завершение записи файла (AudioEncoder.flush()). Дождитесь Promise, обработайте все callbacks выходных данных, завершите мультиплексирование и сохранение, прежде чем объявлять экспорт готовым. reset() немедленно сбрасывает состояние, включая конфигурацию, сообщения очереди и ожидающие callbacks; для повторного использования объект нужно настроить заново (AudioEncoder.reset()). close() прерывает ожидающую работу и освобождает системные ресурсы; это окончательное действие (AudioEncoder.close()). Отмена является решением приложения: прекратите прием данных, выберите reset или close по жизненному циклу задачи, сохраните оригинал и сообщите об отмене или неполном результате, а не об успехе. Предварительный просмотр может намеренно пропускать устаревшие кадры; архивный экспорт сохраняет каждый необходимый кадр, если задача этого требует, поэтому явно опишите эту политику. Перед началом медиа-задачи проверьте, поддерживается ли эта версия браузера и какой запасной путь доступен, если конфигурация кодека недоступна. У локальной обработки и удаленной конвертации разные потоки данных, поэтому объясните передачу до загрузки. Удаляйте старый путь только после проверки нового на тех же задачах и согласования с политикой поддержки. Для поддержки записывайте браузер, систему, версию приложения, задачу и видимый результат; по возможности используйте синтетические образцы и не храните исходное медиа или подробные профили дольше заявленной цели. Задача готова только при согласованности выхода и состояния приложения: кодек может завершиться раньше, чем файл станет полным, синхронизированным или упакованным. После VideoDecoder.flush() следующим входным фрагментом должен быть ключевой кадр; учитывайте это при возобновлении после перемотки или перезапуска (VideoDecoder.flush()).

reset() и close() не могут отменить байты, уже записанные приложением в файл.

Карта утверждений и источников

Публичные источники

#WebCodecs#Конфиденциальность Браузера#Медиа#Совместимость

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.