Spec-Zone.ru › Web APIs

Использование API возможностей медиа

Базовая Широко доступная *

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с января 2020 года.

* Некоторые части этой функции могут иметь различный уровень поддержки.

  • Узнать больше
  • Полная совместимость
  • Отправить отзыв

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

Эти функции включают:

  • Возможность запросить у браузера информацию о его способности кодировать или декодировать медиа с заданным набором параметров кодирования. Эти параметры могут включать кодеки, разрешения, битрейты, частоту кадров и другие подобные детали. С помощью API возможностей медиа вы можете определить не только поддерживает ли браузер данный формат, но и насколько эффективно и плавно он это делает. Короче говоря, этот API заменяет и улучшает метод MediaSource isTypeSupported() или метод HTMLMediaElement canPlayType().
  • Все более подробную информацию о свойствах экрана, чтобы принимать обоснованные решения при выборе лучшего формата для воспроизведения на устройстве пользователя. Например, вы можете использовать API для того, чтобы не пытаться воспроизводить контент с высоким динамическим диапазоном (HDR) на экране со стандартным динамическим диапазоном (SDR).
  • Поддержка получения обратной связи в реальном времени о воспроизведении медиа, чтобы ваш код мог принимать обоснованные решения о корректировке качества потока или других настроек для управления воспринимаемыми пользователем производительностью и качеством медиа. Одним из элементов этого является возможность обнаруживать переключение устройства на другую графическую карту, чтобы вы могли внести соответствующие коррективы на основании возможностей новой графической карты.

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

Интерфейс MediaCapabilities

Интерфейс MediaCapabilities доступен с помощью свойства mediaCapabilities, которое предоставляется как объектом navigator , так и объектом WorkerNavigator; другими словами, API возможностей медиа доступен как в основном потоке, так и в рабочих процессах.

Если объект существует, API возможностей медиа доступен. Поэтому вы можете проверить наличие API следующим образом:

if ("mediaCapabilities" in navigator) {
  // mediaCapabilities is available
} else {
  // mediaCapabilities IS NOT available
}

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

Создание конфигурации декодирования видео

Метод MediaCapabilities.decodingInfo() принимает в качестве параметра конфигурацию декодирования медиа.

В нашем примере мы проверяем возможности декодирования конфигурации видео. Конфигурация требует типа тестируемого медиа — например, простого file или MediaSource — и объекта конфигурации видео, который включает значения для contentType, width, height, bitrate, и framerate:

  • contentType должен быть строкой, указывающей на допустимый тип MIME видео.
  • width и height — это горизонтальные и вертикальные размеры видео; они также используются для определения соотношения сторон.
  • bitrate — это количество битов, используемых для кодирования одной секунды видео.
  • framerate — это количество кадров, воспроизводимых в секунду при воспроизведении видео.
const videoConfiguration = {
  type: "file",
  video: {
    contentType: "video/webm;codecs=vp8",
    width: 800,
    height: 600,
    bitrate: 10000,
    framerate: 15,
  },
};

Если бы мы запрашивали декодируемость аудиофайла, мы бы создали конфигурацию аудио, включая количество каналов и частоту дискретизации, исключив свойства, относящиеся только к видео — а именно размеры и частоту кадров:

const audioConfiguration = {
  type: "file",
  audio: {
    contentType: "audio/ogg",
    channels: 2,
    bitrate: 132700,
    samplerate: 5200,
  },
};

Если бы мы тестировали возможности кодирования, мы бы создали немного другую конфигурацию. В этом случае тип тестируемого медиа — это либо record (для записи медиа, т.е. объекта MediaRecorder), либо transmission (для медиа, передаваемого электронными средствами, такими как RTCPeerConnection) — плюс конфигурация аудио или видео, как описано выше.

Запрос информации о возможностях декодирования у браузера

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

let promise = navigator.mediaCapabilities.decodingInfo(videoConfiguration);

Методы decodingInfo() и encodingInfo() оба возвращают промисы. После выполнения промиса вы можете получить доступ к свойствам supported, smooth, и powerEfficient из возвращенного объекта.

Обработка ответа

Вместо присваивания промиса переменной, мы можем вывести значения, возвращаемые промисом, в консоль:

navigator.mediaCapabilities.decodingInfo(videoConfiguration).then((result) => {
  console.log(
    `This configuration is ${result.supported ? "" : "not "}supported,`,
  );
  console.log(`${result.smooth ? "" : "not "}smooth, and`);
  console.log(`${result.powerEfficient ? "" : "not "}power efficient.`);
});

Обработка ошибок

В нашем примере декодирования видео произошла бы ошибка TypeError, если конфигурация медиа, переданная методу decodingInfo(), была некорректной. Возникновение ошибки может быть обусловлено несколькими причинами, в том числе:

  • Указанный type не является одним из двух разрешенных значений: file или media-source
  • Указанный contentType

Ошибка может быть вызвана тем, что type не является одним из двух возможных значений, contentType не является допустимым типом MIME кодека, или недопустимые или пропущенные определения пропущены из объекта конфигурации видео.

navigator.mediaCapabilities
  .decodingInfo(videoConfiguration)
  .then(console.log("It worked"))
  .catch((error) => console.error(`It failed: ${error}`));

Практический пример API возможностей медиа

CSS

li {
  margin: 1em;
}

HTML

<form>
  <p>
    Select your video configuration and find out if this browser supports the
    codec, and whether decoding will be smooth and power efficient:
  </p>
  <ul>
    <li>
      <label for="codec">Select a codec</label>
      <select id="codec">
        <option>video/webm; codecs=vp8</option>
        <option>video/webm; codecs=vp9</option>
        <option>video/mp4; codecs=avc1</option>
        <option>video/mp4; codecs=avc1.420034</option>
        <option>invalid</option>
      </select>
    </li>
    <li>
      <label for="size">Select a size</label>
      <select id="size">
        <option>7680x4320</option>
        <option>3840x2160</option>
        <option>2560x1440</option>
        <option>1920x1080</option>
        <option>1280x720</option>
        <option selected>800x600</option>
        <option>640x480</option>
        <option>320x240</option>
        <option value=" x ">none</option>
      </select>
    </li>
    <li>
      <label for="framerate">Select a framerate</label>
      <select id="framerate">
        <option>60</option>
        <option>50</option>
        <option>30</option>
        <option>24</option>
        <option selected>15</option>
      </select>
    </li>
    <li>
      <label for="bitrate">Select a bitrate</label>
      <select id="bitrate">
        <option>4000</option>
        <option>2500</option>
        <option>800</option>
      </select>
    </li>
  </ul>
  <p>
    <input type="button" value="Test this Video Configuration" id="try-it" />
  </p>
</form>

<ul id="results"></ul>

JavaScript

let mc = {
  videoConfiguration: new Object(),

  tryIt() {
    mc.createConfiguration();
    mc.testIt();
  },

  createConfiguration() {
    const size = document.getElementById("size").value.split("x");
    mc.videoConfiguration = {
      type: "file",
      video: {
        contentType: document.getElementById("codec").value,
        width: size[0],
        height: size[1],
        bitrate: document.getElementById("bitrate").value,
        framerate: document.getElementById("framerate").value,
      },
    };
  },

  testIt() {
    let content = "";
    navigator.mediaCapabilities
      .decodingInfo(mc.videoConfiguration)
      .then((result) => {
        const li = document.createElement("li"),
          mcv = mc.videoConfiguration.video;
        content = `A ${mcv.width}x${mcv.height}, ${mcv.contentType} at ${
          mcv.framerate
        }fps and ${mcv.bitrate} bps video ${
          result.supported ? " IS " : "IS NOT "
        } supported,`;
        content += `${result.smooth ? " IS " : " is NOT "} smooth, and`;
        content += `${
          result.powerEfficient ? " IS " : " IS NOT "
        }power efficient.`;
        const ul = document.getElementById("results");
        li.textContent = content;
        ul.appendChild(li);
      })
      .catch((error) => {
        const li = document.createElement("li"),
          ul = document.getElementById("results");
        li.textContent = `Codec ${mc.videoConfiguration.video.contentType} threw an error: ${error}`;
        ul.appendChild(li);
      });
  },
};

document.getElementById("try-it").addEventListener("click", mc.tryIt);

Результат примера

Совместимость с браузерами

Рабочий стол Мобильное устройство
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на IOS Samsung Internet WebView Android
Using_the_Media_Capabilities_API 66 79 63 53 13 66 63 48 13 9.0 66
decodingInfo
66["codecs строка может содержать любой поднабор необязательных параметров (должны быть все или ни одного).", "Возникают ошибки, если codecs строка содержит неожиданные символы (должна оцениваться строка до символа)."]
79["codecs строка может содержать любой поднабор необязательных параметров (должны быть все или ни одного).", "Возникают ошибки, если codecs строка содержит неожиданные символы (должна оцениваться строка до символа)."]
63["Значение параметра type называется transmission.", "В Firefox версии ниже 101, decodingInfo() игнорировал параметры codecs для кодеков av01 (обрабатывая их как av1)."]
53["codecs строка может содержать любой поднабор необязательных параметров (должны быть все или ни одного).", "Возникают ошибки, если codecs строка содержит неожиданные символы (должна оцениваться строка до символа)."]
13
66["codecs строка может содержать любой поднабор необязательных параметров (должны быть все или ни одного).", "Возникают ошибки, если codecs строка содержит неожиданные символы (должна оцениваться строка до символа)."]
63["Значение параметра type называется transmission.", "В Firefox для Android версии ниже 101, decodingInfo() игнорировал параметры codecs для кодеков av01 (обрабатывая их как av1)."]
48["codecs строка может содержать любой поднабор необязательных параметров (должны быть все или ни одного).", "Возникают ошибки, если codecs строка содержит неожиданные символы (должна оцениваться строка до символа)."]
13
9.0["codecs строка может содержать любой поднабор необязательных параметров (должны быть все или ни одного).", "Возникают ошибки, если codecs строка содержит неожиданные символы (должна оцениваться строка до символа)."]
66["codecs строка может содержать любой поднабор необязательных параметров (должны быть все или ни одного).", "Возникают ошибки, если codecs строка содержит неожиданные символы (должна оцениваться строка до символа)."]
encodingInfo 101 101
63Значение параметра type называется transmission.
87 15.4 101
63Значение параметра type называется transmission.
70 15.4 19.0 101

См. также

  • navigator.mediaCapabilities

© 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/Media_Capabilities_API/Using_the_Media_Capabilities_API

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API