Использование API возможностей медиа
Базовая Широко доступная *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с января 2020 года.
* Некоторые части этой функции могут иметь различный уровень поддержки.
API возможностей медиа (Media Capabilities API) предоставляет несколько ключевых функций, которые помогут вам лучше справиться с медиа, а также определить, как эффективно оно обрабатывается в реальном времени.
Эти функции включают:
- Возможность запросить у браузера информацию о его способности кодировать или декодировать медиа с заданным набором параметров кодирования. Эти параметры могут включать кодеки, разрешения, битрейты, частоту кадров и другие подобные детали. С помощью API возможностей медиа вы можете определить не только поддерживает ли браузер данный формат, но и насколько эффективно и плавно он это делает. Короче говоря, этот API заменяет и улучшает метод
MediaSourceisTypeSupported()или методHTMLMediaElementcanPlayType(). - Все более подробную информацию о свойствах экрана, чтобы принимать обоснованные решения при выборе лучшего формата для воспроизведения на устройстве пользователя. Например, вы можете использовать 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 |
См. также
© 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