Медиа-обновления в Chrome 75

Франсуа Бофор
François Beaufort

Медиа-возможности Chrome были обновлены в версии 75. В этой статье я расскажу о новых функциях, в том числе:

  • Прогнозирование, будет ли воспроизведение плавным и энергоэффективным для зашифрованных носителей.
  • Поддержка подсказки атрибута playsInline элемента видео.

Зашифрованные носители: информация о декодировании

Начиная с Chrome 66, веб-разработчики могут использовать информацию о декодировании, чтобы запрашивать в браузере возможности четкого декодирования контента устройства на основе такой информации, как кодеки, профиль, разрешение, битрейт и т. д. Это указывает, будет ли воспроизведение плавным. (своевременно) и энергоэффективно на основе предыдущей статистики воспроизведения, записанной браузером.

Спецификация Media Capabilities API , определяющая информацию о декодировании, с тех пор была обновлена ​​для обработки конфигураций зашифрованного мультимедиа, чтобы веб-сайты, использующие зашифрованный носитель (EME), могли выбирать оптимальные медиапотоки.

В двух словах, вот как работает декодирование информации для EME. Попробуйте официальный образец .

const encryptedMediaConfig = {
  type: 'media-source', // or 'file'
  video: {
    contentType: 'video/webm; codecs="vp09.00.10.08"',
    width: 1920,
    height: 1080,
    bitrate: 2646242, // number of bits used to encode a second of video
    framerate: '25' // number of frames used in one second
  },
  keySystemConfiguration: {
    keySystem: 'com.widevine.alpha',
    videoRobustness: 'SW_SECURE_DECODE' // Widevine L3
  }
};

navigator.mediaCapabilities.decodingInfo(encryptedMediaConfig).then(result => {
  if (!result.supported) {
    console.log('Argh! This encrypted media configuration is not supported.');
    return;
  }

  if (!result.keySystemAccess) {
    console.log('Argh! Encrypted media support is not available.')
    return;
  }

  console.log('This encrypted media configuration is supported.');
  console.log('Playback should be' +
      (result.smooth ? '' : ' NOT') + ' smooth and' +
      (result.powerEfficient ? '' : ' NOT') + ' power efficient.');

  // TODO: Use `result.keySystemAccess.createMediaKeys()` to setup EME playback.
});

Воспроизведения EME имеют специализированные пути кода декодирования и рендеринга, что означает другую поддержку и производительность кодеков по сравнению с чистым воспроизведением. Следовательно, новый ключ keySystemConfiguration должен быть установлен в объекте конфигурации мультимедиа, передаваемом в navigator.mediaCapabilities.decodingInfo() . Значением этого ключа является словарь, содержащий ряд известных типов EME . Это повторяет входные данные, предоставленные для requestMediaKeySystemAccess() EME, с одним существенным отличием: последовательности входных данных, предоставленные для requestMediaKeySystemAccess() сводятся к одному значению везде, где целью последовательности было заставить requestMediaKeySystemAccess() выбрать подмножество, которое оно поддерживает.

Информация о декодировании описывает качество (плавность и энергоэффективность) поддержки одной пары аудио- и видеопотоков без принятия решения за вызывающую сторону. Вызывающие абоненты по-прежнему должны заказывать конфигурации мультимедиа, как они это делают с помощью requestMediaKeySystemAccess() . Только теперь они сами идут по списку.

navigator.mediaCapabilities.decodingInfo() возвращает обещание, которое асинхронно разрешается с объектом, содержащим три логических значения: supported , smooth и powerEfficient . Однако если ключ keySystemConfiguration установлен и supported значение true , также возвращается еще один объект MediaKeySystemAccess с именем keySystemAccess . Его можно использовать для запроса некоторых медиа-ключей и настройки зашифрованного воспроизведения мультимедиа. Вот пример:

// Like rMSKA(), orderedMediaConfigs is ordered from most to least wanted.
const capabilitiesPromises = orderedMediaConfigs.map(mediaConfig =>
  navigator.mediaCapabilities.decodingInfo(mediaConfig)
);

// Assume this app wants a supported and smooth media playback.
let bestConfig = null;
for await (const result of capabilitiesPromises) {
  if (result.supported && result.smooth) {
    bestConfig = result;
    break;
  }
}

if (bestConfig) {
  const mediaKeys = await bestConfig.keySystemAccess.createMediaKeys();
  // TODO: rest of EME path as-is
} else {
  // Argh! No smooth configs found.
  // TODO: Maybe choose the lowest resolution and framerate available.
}

Обратите внимание, что для декодирования зашифрованных носителей требуется HTTPS.

Более того, имейте в виду, что это может вызвать приглашение пользователя на Android и ChromeOS так же, как и requestMediaKeySystemAccess() . Однако он не будет отображать больше запросов, чем requestMediaKeySystemAccess() , несмотря на то, что для настройки воспроизведения зашифрованного мультимедиа требуется больше вызовов.

ALT_TEXT_ЗДЕСЬ
Подсказка о защищенном контенте

Намерение экспериментировать | Трекер Chromestatus | Ошибка хрома

HTMLVideoElement.playsInline

Chrome теперь поддерживает логический атрибут playsInline . Если он присутствует, он намекает браузеру, что видео должно отображаться «встроенным» в документ по умолчанию, ограниченным областью воспроизведения элемента.

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

<video playsinline></video>

Поскольку Chrome на Android и настольных компьютерах не поддерживает автоматический полноэкранный режим, подсказка атрибута видеоэлемента playsInline не используется.

Намерение отправить | Трекер Chromestatus | Ошибка хрома