Personalizza le notifiche multimediali e i controlli di riproduzione con l'API Media Session

Come eseguire l'integrazione con i tasti multimediali hardware, personalizzare le notifiche multimediali e altro ancora.

François Beaufort
François Beaufort

Per consentire agli utenti di sapere cosa è attualmente in riproduzione nel browser e di controllarlo senza tornare alla pagina che l'ha avviata, l'API Media Session è stata sono state introdotte. Consente agli sviluppatori web di personalizzare questa esperienza tramite in notifiche multimediali personalizzate, eventi multimediali come riproduzione, messa in pausa ricerca, modifica delle tracce e eventi di videoconferenza, come l'attivazione/disattivazione dell'audio microfono, accendere/spegnere la videocamera e riagganciare. Queste personalizzazioni sono disponibile in diversi contesti, tra cui hub multimediali desktop, notifiche multimediali su dispositivi mobili e persino su dispositivi indossabili. Descrivi queste personalizzazioni in questo articolo.

Screenshot di contesti di sessione multimediale.
Media hub su computer, notifica multimediale su dispositivo mobile e dispositivo indossabile.

Informazioni sull'API Media Session

L'API Media session offre diversi vantaggi e funzionalità:

  • I tasti multimediali hardware sono supportati.
  • Le notifiche relative ai contenuti multimediali sono personalizzate su dispositivo mobile, computer e dispositivo indossabile accoppiato.
  • L'hub multimediale è disponibile su computer.
  • I controlli multimediali nella schermata di blocco sono disponibili su ChromeOS e dispositivi mobili.
  • I controlli della finestra Picture in picture sono disponibili per la riproduzione audio, videoconferenze e presentazione di slide.
  • È disponibile l'integrazione con l'assistente sui dispositivi mobili.

Supporto dei browser

  • Chrome: 73.
  • Edge: 79.
  • Firefox: 82.
  • Safari: 15.

Origine

Alcuni esempi illustreranno alcuni di questi punti.

Esempio 1: se gli utenti selezionano la "traccia successiva" tasto multimediale della tastiera, gli sviluppatori web possono gestire questa azione dell'utente se il browser è in primo piano o lo sfondo.

Esempio 2:se gli utenti ascoltano un podcast sul web mentre usano il dispositivo schermo è bloccato, possono comunque premere il pulsante icona dalla serratura filtrare i controlli multimediali in modo che gli sviluppatori web spostino il tempo di riproduzione indietro di qualche secondi.

Esempio 3: se gli utenti hanno schede che riproducono audio, possono interrompere facilmente la riproduzione dall'hub multimediale sul desktop per consentire agli sviluppatori web di cancellarne lo stato.

Esempio 4: se gli utenti partecipano a una videochiamata, possono premere il pulsante di attivazione/disattivazione microfono" nella finestra Picture in picture per impedire al sito web ricezione dati del microfono.

Il tutto attraverso due diverse interfacce: l'interfaccia MediaSession e l'interfaccia MediaMetadata. La prima consente agli utenti di controllare che giocano. Il secondo è come indicare a MediaSession cosa deve essere controllato.

Per spiegarci meglio, l'immagine di seguito mostra come queste interfacce si relazionano a specifiche controlli multimediali, in questo caso una notifica multimediale su dispositivo mobile.

Illustrazione delle interfacce della sessione multimediale.
Struttura di una notifica di contenuti multimediali su dispositivo mobile.

Fai sapere agli utenti cosa c'è in riproduzione

Quando un sito web riproduce contenuti audio o video, gli utenti ricevono automaticamente i contenuti multimediali notifiche nella barra delle notifiche sul dispositivo mobile o nell'hub multimediale desktop. Il browser fa del suo meglio per mostrare le informazioni appropriate utilizzando titolo del documento e l'immagine icona più grande che riesce a trovare. Con la sessione multimediale API, è possibile personalizzare le notifiche multimediali con metadati come titolo, nome dell'artista, nome dell'album e artwork, come mostrato di seguito.

Chrome richiede "completa" la messa a fuoco audio per mostrare le notifiche dei contenuti multimediali solo quando la durata dei contenuti multimediali è almeno 5 secondi. In questo modo i suoni accidentali ad esempio, non vengono mostrate notifiche.

// After media (video or audio) starts playing
await document.querySelector("video").play();

if ("mediaSession" in navigator) {
  navigator.mediaSession.metadata = new MediaMetadata({
    title: 'Never Gonna Give You Up',
    artist: 'Rick Astley',
    album: 'Whenever You Need Somebody',
    artwork: [
      { src: 'https://via.placeholder.com/96',   sizes: '96x96',   type: 'image/png' },
      { src: 'https://via.placeholder.com/128', sizes: '128x128', type: 'image/png' },
      { src: 'https://via.placeholder.com/192', sizes: '192x192', type: 'image/png' },
      { src: 'https://via.placeholder.com/256', sizes: '256x256', type: 'image/png' },
      { src: 'https://via.placeholder.com/384', sizes: '384x384', type: 'image/png' },
      { src: 'https://via.placeholder.com/512', sizes: '512x512', type: 'image/png' },
    ]
  });

  // TODO: Update playback state.
}

Al termine della riproduzione, non c'è bisogno di "rilasciare" la sessione multimediale come la notifica scomparirà automaticamente. Tieni presente che L'app navigator.mediaSession.metadata verrà usata all'avvio della prossima riproduzione però. Questo è il motivo per cui è importante aggiornarlo quando l'origine di riproduzione dei contenuti multimediali modifiche per garantire che le informazioni pertinenti vengano mostrate nella notifica dei contenuti multimediali.

Ci sono alcuni aspetti da considerare in merito ai metadati multimediali.

  • L'array di artwork delle notifiche supporta URL BLOB e URL di dati.
  • Se non viene definito alcun artwork ed è presente un'immagine icona (specificata utilizzando <link rel=icon>) di dimensioni auspicabili, verrà utilizzata dalle notifiche relative ai contenuti multimediali.
  • La dimensione target dell'artwork della notifica in Chrome per Android è 512x512. Per dispositivi di fascia bassa, è 256x256.
  • L'attributo title dell'elemento multimediale HTML viene utilizzato nella playlist "Now Playing" Widget macOS.
  • Se la risorsa multimediale è incorporata (ad esempio in un iframe), l'API Media Session le informazioni devono essere impostate dal contesto incorporato. Vedi lo snippet di seguito.
<iframe id="iframe">
  <video>...</video>
</iframe>
<script>
  iframe.contentWindow.navigator.mediaSession.metadata = new MediaMetadata({
    title: 'Never Gonna Give You Up',
    ...
  });
</script>

Puoi aggiungere anche informazioni sui singoli capitoli, ad esempio il titolo della sezione, il relativo timestamp e un'immagine screenshot ai metadati multimediali. In questo modo gli utenti possono navigare tra i contenuti multimediali.

navigator.mediaSession.metadata = new MediaMetadata({
  // title, artist, album, artwork, ...
  chapterInfo: [{
    title: 'Chapter 1',
    startTime: 0,
    artwork: [
      { src: 'https://via.placeholder.com/128', sizes: '128x128', type: 'image/png' },
      { src: 'https://via.placeholder.com/512', sizes: '512x512', type: 'image/png' },
    ]
  }, {
    title: 'Chapter 2',
    startTime: 42,
    artwork: [
      { src: 'https://via.placeholder.com/128', sizes: '128x128', type: 'image/png' },
      { src: 'https://via.placeholder.com/512', sizes: '512x512', type: 'image/png' },
    ]
  }]
});
Informazioni sul capitolo visualizzate in una notifica dei contenuti multimediali di ChromeOS.
Notifica multimediale con i capitoli in ChromeOS.
di Gemini Advanced.

Consenti agli utenti di controllare la riproduzione

Un'azione della sessione multimediale è un'azione (ad esempio "riproduci" o "metti in pausa") che un sito web può per gli utenti quando interagiscono con l'attuale riproduzione dei contenuti multimediali. Le azioni sono sono analoghi e funzionano in modo analogo agli eventi. Come gli eventi, le azioni implementato impostando gestori su un oggetto appropriato, un'istanza MediaSession, in questo caso. Alcune azioni vengono attivate quando gli utenti premeno di tasti di cuffie, di un altro dispositivo remoto, di una tastiera notifica multimediale.

Screenshot di una notifica di contenuti multimediali in Windows 10.
Notifica di contenuti multimediali personalizzati in Windows 10.

Poiché alcune azioni relative alle sessioni multimediali potrebbero non essere supportate, ti consigliamo di usa un blocco try…catch durante l'impostazione.

const actionHandlers = [
  ['play',          () => { /* ... */ }],
  ['pause',         () => { /* ... */ }],
  ['previoustrack', () => { /* ... */ }],
  ['nexttrack',     () => { /* ... */ }],
  ['stop',          () => { /* ... */ }],
  ['seekbackward',  (details) => { /* ... */ }],
  ['seekforward',   (details) => { /* ... */ }],
  ['seekto',        (details) => { /* ... */ }],
  /* Video conferencing actions */
  ['togglemicrophone', () => { /* ... */ }],
  ['togglecamera',     () => { /* ... */ }],
  ['hangup',           () => { /* ... */ }],
  /* Presenting slides actions */
  ['previousslide', () => { /* ... */ }],
  ['nextslide',     () => { /* ... */ }],
];

for (const [action, handler] of actionHandlers) {
  try {
    navigator.mediaSession.setActionHandler(action, handler);
  } catch (error) {
    console.log(`The media session action "${action}" is not supported yet.`);
  }
}

Per annullare un gestore di azioni della sessione multimediale, è sufficiente impostarlo su null.

try {
  // Unset the "nexttrack" action handler at the end of a playlist.
  navigator.mediaSession.setActionHandler('nexttrack', null);
} catch (error) {
  console.log(`The media session action "nexttrack" is not supported yet.`);
}

Una volta impostati, i gestori delle azioni delle sessioni multimediali verranno mantenuti durante le riproduzioni multimediali. È simile al pattern listener di eventi, tranne che per la gestione di un evento significa che il browser smette di eseguire qualsiasi comportamento predefinito e lo utilizza come un indica che il sito web supporta l'azione multimediale. Di conseguenza, i controlli delle azioni multimediali non verranno mostrati se non viene impostato il gestore di azioni appropriato.

Screenshot del widget Now Playing in macOS Big Sur.
Widget Now Playing in macOS Big Sur.

Riprodurre / mettere in pausa

L'azione "play" indica che l'utente vuole riprendere la riproduzione dei contenuti multimediali. mentre "pause" indica il desiderio di interromperlo temporaneamente.

L'opzione "Riproduci/Pausa" viene sempre mostrata in una notifica di contenuti multimediali e i relativi sono gestiti automaticamente dal browser. Per eseguire l'override delle impostazioni predefinite comportamento, gestire la riproduzione e "metti in pausa" azioni multimediali come mostrato di seguito.

Il browser potrebbe considerare che un sito web non stia riproducendo contenuti multimediali quando cerca o ad esempio durante il caricamento. In questo caso, sostituisci questo comportamento impostando navigator.mediaSession.playbackState a "playing" o "paused" per assicurarti la UI del sito web rimane sincronizzata con i controlli di notifica dei contenuti multimediali.

const video = document.querySelector('video');

navigator.mediaSession.setActionHandler('play', async () => {
  // Resume playback
  await video.play();
});

navigator.mediaSession.setActionHandler('pause', () => {
  // Pause active playback
  video.pause();
});

video.addEventListener('play', () => {
  navigator.mediaSession.playbackState = 'playing';
});

video.addEventListener('pause', () => {
  navigator.mediaSession.playbackState = 'paused';
});

Traccia precedente

L'azione "previoustrack" indica che l'utente vuole avviare la riproduzione di contenuti multimediali corrente dall'inizio se la riproduzione ha una nozione di all'inizio o passa all'elemento precedente nella playlist se i contenuti multimediali vengono riprodotti ha una nozione di playlist.

navigator.mediaSession.setActionHandler('previoustrack', () => {
  // Play previous track.
});

Traccia successiva

L'azione "nexttrack" indica che l'utente vuole spostare la riproduzione dei contenuti multimediali in all'elemento successivo nella playlist, se la riproduzione multimediale ha una nozione di playlist.

navigator.mediaSession.setActionHandler('nexttrack', () => {
  // Play next track.
});

Interrompi

L'azione "stop" indica che l'utente vuole interrompere la riproduzione dei contenuti multimediali e cancella lo stato, se opportuno.

navigator.mediaSession.setActionHandler('stop', () => {
  // Stop playback and clear state if appropriate.
});

Va indietro / avanti

L'azione "seekbackward" indica che l'utente vuole spostare i contenuti multimediali. il tempo di riproduzione torna indietro di un breve periodo mentre "seekforward" indica un desiderio per mandare avanti di un breve periodo il tempo di riproduzione dei contenuti multimediali. In entrambi i casi, per un periodo di tempo breve si intende pochi secondi.

Il valore seekOffset fornito nel gestore di azioni corrisponde al tempo in secondi per sposta il tempo di riproduzione dei contenuti multimediali. Se non viene specificato (ad esempio undefined), dovresti utilizzare un tempo ragionevole (ad es. 10-30 secondi).

const video = document.querySelector('video');
const defaultSkipTime = 10; /* Time to skip in seconds by default */

navigator.mediaSession.setActionHandler('seekbackward', (details) => {
  const skipTime = details.seekOffset || defaultSkipTime;
  video.currentTime = Math.max(video.currentTime - skipTime, 0);
  // TODO: Update playback state.
});

navigator.mediaSession.setActionHandler('seekforward', (details) => {
  const skipTime = details.seekOffset || defaultSkipTime;
  video.currentTime = Math.min(video.currentTime + skipTime, video.duration);
  // TODO: Update playback state.
});

Vai a un orario specifico

L'azione "seekto" indica che l'utente vuole spostare la riproduzione dei contenuti multimediali a un orario specifico.

Il valore seekTime fornito nel gestore di azioni corrisponde al tempo in secondi per sposta il tempo di riproduzione dei contenuti multimediali.

Il valore booleano fastSeek fornito nel gestore di azioni è true se l'azione è essere chiamato più volte come parte di una sequenza e questa non è l'ultima in quella sequenza.

const video = document.querySelector('video');

navigator.mediaSession.setActionHandler('seekto', (details) => {
  if (details.fastSeek && 'fastSeek' in video) {
    // Only use fast seek if supported.
    video.fastSeek(details.seekTime);
    return;
  }
  video.currentTime = details.seekTime;
  // TODO: Update playback state.
});

Imposta la posizione di riproduzione

Mostrare con precisione il punto di riproduzione dei contenuti multimediali in una notifica è semplicissimo come impostare lo stato della posizione al momento giusto, come mostrato di seguito. La stato posizione è una combinazione di velocità di riproduzione multimediale, durata e ora attuale.

Screenshot dei controlli multimediali della schermata di blocco in ChromeOS.
Controlli multimediali della schermata di blocco in ChromeOS.

La durata deve essere specificata e positiva. La posizione deve essere positiva inferiore alla durata. La velocità di riproduzione deve essere superiore a 0.

const video = document.querySelector('video');

function updatePositionState() {
  if ('setPositionState' in navigator.mediaSession) {
    navigator.mediaSession.setPositionState({
      duration: video.duration,
      playbackRate: video.playbackRate,
      position: video.currentTime,
    });
  }
}

// When video starts playing, update duration.
await video.play();
updatePositionState();

// When user wants to seek backward, update position.
navigator.mediaSession.setActionHandler('seekbackward', (details) => {
  /* ... */
  updatePositionState();
});

// When user wants to seek forward, update position.
navigator.mediaSession.setActionHandler('seekforward', (details) => {
  /* ... */
  updatePositionState();
});

// When user wants to seek to a specific time, update position.
navigator.mediaSession.setActionHandler('seekto', (details) => {
  /* ... */
  updatePositionState();
});

// When video playback rate changes, update position state.
video.addEventListener('ratechange', (event) => {
  updatePositionState();
});

Il ripristino dello stato di posizione è semplice quanto l'impostazione su null.

// Reset position state when media is reset.
navigator.mediaSession.setPositionState(null);

Azioni di videoconferenza

Quando l'utente inserisce la videochiamata in una finestra Picture in picture, browser potrebbe visualizzare i controlli per il microfono e la videocamera e per la chiusura. Quando l'utente fa clic su questi elementi, il sito web li gestisce tramite il video azioni di videoconferenza riportate di seguito. Per un esempio, guarda l'esempio di videoconferenze.

Screenshot dei controlli di videoconferenza in una finestra Picture in picture.
Controlli di videoconferenza in una finestra Picture in picture.
di Gemini Advanced.

Attiva/disattiva microfono

L'azione "togglemicrophone" indica che l'utente vuole disattivare o riattivare l'audio. il microfono. Il metodo setMicrophoneActive(isActive) indica al browser se il sito web considera attualmente attivo il microfono.

let isMicrophoneActive = false;

navigator.mediaSession.setActionHandler('togglemicrophone', () => {
  if (isMicrophoneActive) {
    // Mute the microphone.
  } else {
    // Unmute the microphone.
  }
  isMicrophoneActive = !isMicrophoneActive;
  navigator.mediaSession.setMicrophoneActive(isMicrophoneActive);
});

Cambia fotocamera

L'azione "togglecamera" indica che l'utente vuole attivare l'opzione videocamera accesa o spenta. Il metodo setCameraActive(isActive) indica se il parametro il browser considera attivo il sito web.

let isCameraActive = false;

navigator.mediaSession.setActionHandler('togglecamera', () => {
  if (isCameraActive) {
    // Disable the camera.
  } else {
    // Enable the camera.
  }
  isCameraActive = !isCameraActive;
  navigator.mediaSession.setCameraActive(isCameraActive);
});

Riagganciare

L'azione "hangup" indica che l'utente vuole terminare una chiamata.

navigator.mediaSession.setActionHandler('hangup', () => {
  // End the call.
});

Presentazione delle azioni delle slide

Quando l'utente inserisce la presentazione in una finestra Picture in picture, il browser potrebbe visualizzare i controlli per navigare tra le slide. Quando l'utente fa clic su questi, il sito web li gestisce tramite l'API Media Session. Per un vedi l'esempio di presentazione di slide.

Diapositiva precedente

L'azione "previousslide" indica che l'utente vuole tornare all'app slide precedente quando si presentano slide.

navigator.mediaSession.setActionHandler('previousslide', () => {
  // Show previous slide.
});

Supporto dei browser

  • Chrome: 111.
  • Edge: 111.
  • Firefox: non supportato.
  • Safari: non supportato.

Diapositiva successiva

L'azione "nextslide" indica che l'utente vuole passare alla slide successiva durante la presentazione di slide.

navigator.mediaSession.setActionHandler('nextslide', () => {
  // Show next slide.
});

Supporto dei browser

  • Chrome: 111.
  • Edge: 111.
  • Firefox: non supportato.
  • Safari: non supportato.

Esempi

Dai un'occhiata ad alcuni esempi di sessioni multimediali con mister Foundation e Il lavoro di Jan Morgenstern.

Uno screencast che illustra l'API Media Session.

Risorse