Сегодня 7 ноября рабочая группа по медиа опубликовала первый публичный рабочий проект аудиосессии. Этот API определяет API-поверхность для управления тем, как аудио рендерится и взаимодействует с другими приложениями для воспроизведения аудио, что позволяет улучшить микширование аудио или эксклюзивное воспроизведение в зависимости от контекста, чтобы обеспечить более согласованный и интегрированный медиаопыт на всех устройствах.
Люди все чаще потребляют медиа (аудио/видео) через Интернет, который стал основным каналом доступа к этому типу контента. Однако медиа в Интернете часто не имеет бесшовной интеграции с базовыми платформами. API аудиосеанса устраняет этот пробел, улучшая обработку медиа на платформах, которые поддерживают управление аудиосеансами или аналогичные функции фокусировки на аудио. Этот API улучшает взаимодействие веб-аудио с другими приложениями, позволяя улучшить микширование звука или эксклюзивное воспроизведение в зависимости от контекста, чтобы обеспечить более согласованный и интегрированный опыт использования медиа на всех устройствах.
Кроме того, некоторые платформы автоматически управляют аудиосеансом сайта на основе воспроизведения медиа и API, используемых для воспроизведения аудио. Однако такое поведение не всегда может соответствовать ожиданиям пользователей. Этот API позволяет разработчикам переопределять поведение по умолчанию и получать больше контроля над аудиосеансом.
Сайт заранее устанавливает тип аудиосеанса на "воспроизведение и запись":
navigator.audioSession.type = 'play-and-record';
// С этого момента громкость может быть установлена на основе 'play-and-record'.
...
// Начать воспроизведение удаленного медиа
remoteVideo.srcObject = remoteMediaStream;
remoteVideo.play();
// Start capturing
navigator.mediaDevices
.getUserMedia({ audio: true, video: true })
.then((stream) => {
localVideo.srcObject = stream;
});
Сайт реагирует на прерывание:
navigator.audioSession.type = 'play-and-record';
// С этого момента громкость может быть установлена на основе 'play-and-record'.
...
// Начать воспроизведение удаленного медиа
remoteVideo.srcObject = remoteMediaStream;
remoteVideo.play();
// Начать захват
navigator.mediaDevices
.getUserMedia({ audio: true, video: true })
.then((stream) => {
localVideo.srcObject = stream;
});
navigator.audioSession.onstatechange = async () => {
if (navigator.audioSession.state === "interrupted") {
localVideo.pause();
remoteVideo.pause();
// Дать понять пользователю, что вызов прерван.
showInterruptedBanner();
for (const track of localVideo.srcObject.getTracks()) {
track.enabled = false;
}
} else {
// Позвольте пользователю решить, когда перезапустить вызов.
const shouldRestart = await showOptionalRestartBanner();
if (!shouldRestart) {
return;
}
for (const track of localVideo.srcObject.getTracks()) {
track.enabled = true;
}
localVideo.play();
remoteVideo.play();
}
};