Medienbenachrichtigungen und Wiedergabesteuerung mit der Media Session API anpassen

Informationen zur Einbindung von Hardware-Medienschlüsseln, zum Anpassen von Medienbenachrichtigungen und mehr.

François Beaufort
François Beaufort

Um Nutzer darüber zu informieren, was gerade in ihrem Browser abgespielt wird, und um sie zu steuern ohne zu der Seite zurückzukehren, auf der sie gestartet ist, wurde die Media Session API eingeführt. Sie ermöglicht es Webentwicklern, Metadaten in benutzerdefinierten Medienbenachrichtigungen, Medienereignissen wie Wiedergabe, Pause, Suchen, Nachverfolgen von Änderungen und Videokonferenzen, z. B. zum Stummschalten oder Aufheben der Stummschaltung Mikrofon, Kamera ein-/ausschalten und auflegen. Diese Anpassungen sind in verschiedenen Kontexten verfügbar, z. B. Desktop-Media-Hubs, Medienbenachrichtigungen auf Mobilgeräten und sogar auf Wearables. Ich werde diese Anpassungen diesem Artikel.

<ph type="x-smartling-placeholder">
</ph> Screenshots von Media Session-Kontexten
Media Hub auf einem Computer, Medienbenachrichtigungen auf Mobilgeräten und einem Wearable-Gerät.

Über die Media Session API

Die Media Session API bietet mehrere Vorteile und Funktionen:

  • Hardware-Medienschlüssel werden unterstützt.
  • Medienbenachrichtigungen werden auf Mobilgeräten, Computern und gekoppelten Wearables angepasst.
  • Der Media Hub ist auf Computern verfügbar.
  • Mediensteuerelemente für den Sperrbildschirm sind unter ChromeOS und auf Mobilgeräten verfügbar.
  • Die Bild-im-Bild-Fenster-Steuerelemente sind für die Audiowiedergabe verfügbar, Videokonferenzen und Präsentationen.
  • Die Assistant-Integration ist auf Mobilgeräten verfügbar.

Unterstützte Browser

  • Chrome: 73 <ph type="x-smartling-placeholder">
  • Edge: 79. <ph type="x-smartling-placeholder">
  • Firefox: 82 <ph type="x-smartling-placeholder">
  • Safari: 15. <ph type="x-smartling-placeholder">

Quelle

Einige dieser Punkte werden anhand einiger Beispiele veranschaulicht.

Beispiel 1:Wenn Nutzer auf „Nächster Titel“ klicken Medientaste auf ihrer Tastatur, Webentwickler können diese Nutzeraktion unabhängig davon ausführen, ob der Browser im Vordergrund ausgeführt wird oder den Hintergrund.

Beispiel 2:Sie hören sich auf dem Gerät einen Podcast im Web an. Display gesperrt ist, können sie trotzdem auf die Schaltfläche zum Zurückspulen tippen. Symbol vom Schloss Bildschirmmediensteuerung, damit Webentwickler die Wiedergabezeit um einige Sekunden.

Beispiel 3: Wenn Nutzer Tabs haben, auf denen Audio wiedergegeben wird, können sie ganz einfach über den Media Hub auf dem Desktop wiedergeben, damit Webentwickler die Möglichkeit haben, ihren Zustand löschen.

Beispiel 4: Nutzer, die an einem Videoanruf teilnehmen, können die Ein/Aus-Schaltfläche Mikrofon“ im Bild-im-Bild-Fenster, um zu verhindern, dass die Website Mikrofondaten empfangen.

Dies geschieht über zwei verschiedene Schnittstellen: die MediaSession-Schnittstelle. und der MediaMetadata-Schnittstelle. Erstens können Nutzende steuern, gespielt wird. Zum anderen teilen Sie MediaSession mit, was gesteuert werden muss.

Im Bild unten sehen Sie, wie diese Oberflächen mit bestimmten Mediensteuerung, in diesem Fall eine Medienbenachrichtigung auf dem Mobilgerät.

<ph type="x-smartling-placeholder">
</ph> Abbildung der Mediensitzungsoberflächen
Aufbau einer Medienbenachrichtigung auf einem Mobilgerät

Nutzer darüber informieren, was gerade gespielt wird

Wenn eine Website Audio- oder Videoinhalte wiedergibt, erhalten Nutzer automatisch Medien in der Benachrichtigungsleiste auf Mobilgeräten oder im Media Hub auf Desktop-Computer. Der Browser versucht, die passenden Informationen anzuzeigen, indem er die Funktion Dokumenttitel und das größte Symbolbild, das es finden kann. Mit der Mediensitzung API können Sie die Medienbenachrichtigung mit Rich Media-Formaten Metadaten wie Titel, Name des Künstlers, Albumname und Artwork wie unten dargestellt.

Chrome fordert „vollständig“ an Audiofokus angezeigt werden, sodass Medienbenachrichtigungen nur angezeigt werden, Die Mediendauer beträgt mindestens 5 Sekunden. So werden Nebengeräusche wie Dings, werden keine Benachrichtigungen angezeigt.

// 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.
}

Wenn die Wiedergabe beendet ist, musst du nichts weiter tun. Mediensitzung als verschwindet die Benachrichtigung automatisch. Beachten Sie, dass navigator.mediaSession.metadata wird verwendet, wenn die nächste Wiedergabe beginnt aber. Aus diesem Grund ist es wichtig, es zu aktualisieren, wenn die Medienwiedergabequelle um sicherzustellen, dass relevante Informationen in der Medienbenachrichtigung angezeigt werden.

Es gibt einige Dinge zu den Medienmetadaten zu beachten.

  • Das Benachrichtigungs-Artwork-Array unterstützt Blob-URLs und Daten-URLs.
  • Wenn kein Artwork definiert ist und ein Symbolbild (mit <link rel=icon> angegeben) in der gewünschten Größe vorhanden ist, wird es in Medienbenachrichtigungen verwendet.
  • Die Zielgröße der Benachrichtigungsgrafik in Chrome für Android ist 512x512. Für Low-End-Geräten ist es 256x256.
  • Das Attribut title des HTML-Medienelements wird in „Läuft gerade“ verwendet macOS-Widget.
  • Wenn die Medienressource eingebettet ist (z. B. in einen iFrame), Media Session API -Informationen müssen aus dem eingebetteten Kontext festgelegt werden. Siehe Snippet unten.
<iframe id="iframe">
  <video>...</video>
</iframe>
<script>
  iframe.contentWindow.navigator.mediaSession.metadata = new MediaMetadata({
    title: 'Never Gonna Give You Up',
    ...
  });
</script>

Du kannst den Medienmetadaten auch Informationen zu einzelnen Kapiteln hinzufügen, z. B. den Titel des Abschnitts, seinen Zeitstempel und ein Screenshotbild. So können Nutzende durch die Inhalte der Medien navigieren.

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' },
    ]
  }]
});
<ph type="x-smartling-placeholder">
</ph> Kapitelinformationen, die in einer ChromeOS-Medienbenachrichtigung angezeigt werden.
Medienbenachrichtigung zu Kapiteln in ChromeOS

Nutzer können festlegen, was abgespielt wird

Eine Mediensitzungsaktion ist eine Aktion (z. B. „Wiedergabe“ oder „Pause“), die eine Website ausführen kann. wenn sie mit der aktuellen Medienwiedergabe interagieren. Aktionen sind und funktionieren ähnlich wie Ereignisse. Wie Ereignisse sind auch Aktionen implementiert werden, indem Handler für ein entsprechendes Objekt, eine Instanz von In diesem Fall MediaSession. Einige Aktionen werden ausgelöst, wenn Nutzer Tasten von einem Headset, einem anderen Remote-Gerät, einer Tastatur oder zur Interaktion mit einem Medienbenachrichtigung.

<ph type="x-smartling-placeholder">
</ph> Screenshot einer Medienbenachrichtigung in Windows 10.
Angepasste Medienbenachrichtigung in Windows 10

Da einige Aktionen für Mediensitzungen möglicherweise nicht unterstützt werden, empfehlen wir, verwenden Sie dabei den try…catch-Block.

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.`);
  }
}

Das Deaktivieren eines Handlers für Mediensitzungen ist einfach, indem man ihn auf null setzt.

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.`);
}

Nach der Festlegung bleiben Handler für Mediensitzungen-Aktionen während der Medienwiedergabe bestehen. Dies ähnelt dem Ereignis-Listener-Muster, außer dass ein Ereignis verarbeitet wird, bedeutet, dass der Browser kein Standardverhalten mehr ausführt und dies als signalisiert, dass die Website die Media-Aktion unterstützt. Die Steuerelemente für Medienaktionen wird nur angezeigt, wenn der richtige Aktions-Handler festgelegt ist.

<ph type="x-smartling-placeholder">
</ph> Screenshot des Widgets „Now Playing“ in macOS Big Sur
„Now Playing“-Widget in macOS Big Sur.

Wiedergabe / Pause

Die Aktion „"play"“ gibt an, dass der Nutzer die Medienwiedergabe fortsetzen möchte. während "pause" den Wunsch angibt, ihn vorübergehend anzuhalten.

Die Schaltfläche „Wiedergabe/Pause“ wird immer in Medienbenachrichtigungen angezeigt. Medienereignisse werden automatisch vom Browser verarbeitet. Standardeinstellung überschreiben „Play“ verwenden, und „Pause“ Medienaktionen wie unten dargestellt.

Der Browser stuft Websites möglicherweise so ein, dass keine Medien wiedergegeben werden, wenn sie nach oder geladen werden. Überschreiben Sie in diesem Fall dieses Verhalten, indem Sie navigator.mediaSession.playbackState bis "playing" oder "paused", um sicherzugehen und die Benutzeroberfläche der Website synchronisiert mit den Steuerelementen für Medienbenachrichtigungen.

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';
});

Vorheriger Titel

Die Aktion "previoustrack" gibt an, dass der Nutzer entweder die die aktuelle Medienwiedergabe von Beginn an begonnen, oder zum vorherigen Element in der Playlist springen, wenn die Medienwiedergabe eine Playlist hat.

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

Nächster Titel

Die Aktion "nexttrack" gibt an, dass der Nutzer die Medienwiedergabe auf zum nächsten Element in der Playlist, wenn die Medienwiedergabe den Begriff einer Playlist enthält.

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

Beenden

Die Aktion "stop" gibt an, dass der Nutzer die Medienwiedergabe beenden und Löschen Sie gegebenenfalls den Status.

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

Vorwärts / rückwärts springen

Die Aktion "seekbackward" gibt an, dass der Nutzer die Medien verschieben möchte. kurze Zeit zurückliegen, während "seekforward" darauf hinweist, um die Medienwiedergabezeit für einen kurzen Zeitraum zu verlängern. In beiden Fällen wird ein bedeutet eine kurze Zeitspanne, bedeutet einige Sekunden.

Der im Aktions-Handler angegebene Wert seekOffset ist die Zeit in Sekunden, die Medienwiedergabezeit um. Ist kein Wert angegeben (z. B. undefined), gilt Folgendes: sollten Sie eine vernünftige Zeit verwenden (z. B. 10–30 Sekunden).

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.
});

Zu einem bestimmten Zeitpunkt springen

Die Aktion „"seekto"“ gibt an, dass der Nutzer die Medienwiedergabe verschieben möchte zu einer bestimmten Zeit.

Der im Aktions-Handler angegebene Wert seekTime ist die Zeit in Sekunden, die Medienwiedergabezeit auf.

Der im Aktions-Handler angegebene boolesche Wert fastSeek ist „true“, wenn die Aktion mehrere Male als Teil einer Sequenz aufgerufen werden. Dies ist nicht der letzte Aufruf. in dieser Reihenfolge.

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.
});

Wiedergabeposition festlegen

Die genaue Anzeige der Medienwiedergabeposition in einer Benachrichtigung ist ganz einfach wie unten gezeigt den Positionsstatus zu einem geeigneten Zeitpunkt festlegen. Die ist eine Kombination aus Wiedergaberate, Dauer und in der aktuellen Uhrzeit.

<ph type="x-smartling-placeholder">
</ph> Screenshot der Mediensteuerung auf dem Sperrbildschirm in ChromeOS
Mediensteuerung auf dem Sperrbildschirm in ChromeOS

Die Dauer muss positiv sein. Die Position muss positiv und kürzer als die Dauer. Die Wiedergaberate muss größer als 0 sein.

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();
});

Sie können den Positionsstatus ganz einfach auf null zurücksetzen.

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

Aktionen für Videokonferenzen

Wenn der Nutzer seinen Videoanruf in einem Bild-im-Bild-Fenster öffnet, wird das Symbol zeigt der Browser möglicherweise Steuerelemente für das Mikrofon und die Kamera sowie für das Auflegen an. Wenn der Nutzer darauf klickt, werden sie von der Website über das Video verarbeitet. Videokonferenzaktionen weiter unten. Ein Beispiel finden Sie unter Beispiel für Videokonferenzen.

<ph type="x-smartling-placeholder">
</ph> Screenshot der Steuerelemente für Videokonferenzen in einem Bild-im-Bild-Fenster.
Steuerelemente für Videokonferenzen in einem Bild-im-Bild-Fenster

Mikrofon ein-/ausschalten

Die Aktion „"togglemicrophone"“ gibt an, dass der Nutzer Elemente stummschalten oder die Stummschaltung aufheben möchte. Mikrofon. Die Methode setMicrophoneActive(isActive) teilt dem Browser mit Gibt an, ob die Website das Mikrofon derzeit als aktiv einstuft.

let isMicrophoneActive = false;

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

Kamera umschalten

Die Aktion "togglecamera" gibt an, dass der Nutzer die Funktion Kamera ein oder aus. Die Methode setCameraActive(isActive) gibt an, ob die der Browser die Website als aktiv betrachtet.

let isCameraActive = false;

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

Beenden

Die Aktion "hangup" gibt an, dass der Nutzer einen Anruf beenden möchte.

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

Aktionen für das Präsentieren von Folien

Wenn Nutzende ihre Präsentation in einem Bild-im-Bild-Fenster platzieren, zeigt der Browser möglicherweise Steuerelemente zum Navigieren durch Folien an. Wenn Nutzende werden sie von der Website über die Media Session API verarbeitet. Für eine Beispiel für eine Präsentation.

Zurück

Die Aktion "previousslide" gibt an, dass der Nutzer zum zur vorherigen Folie.

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

Unterstützte Browser

  • Chrome: 111. <ph type="x-smartling-placeholder">
  • Edge: 111. <ph type="x-smartling-placeholder">
  • Firefox: nicht unterstützt <ph type="x-smartling-placeholder">
  • Safari: nicht unterstützt. <ph type="x-smartling-placeholder">

Weiter

Die Aktion "nextslide" gibt an, dass der Nutzer zur nächsten Folie wechseln möchte. wenn Sie Folien präsentieren.

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

Unterstützte Browser

  • Chrome: 111. <ph type="x-smartling-placeholder">
  • Edge: 111. <ph type="x-smartling-placeholder">
  • Firefox: nicht unterstützt <ph type="x-smartling-placeholder">
  • Safari: nicht unterstützt. <ph type="x-smartling-placeholder">

Beispiele

Sehen Sie sich einige Media Sessions mit Blender Foundation und Jan Morgensterns Arbeit.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
. Ein Screencast zur Veranschaulichung der Media Session API.

Ressourcen