Livestreaming

Das Cast SDK enthält integrierte APIs für Liveinhalte. Dazu gehört eine flexible, sofort einsatzfähige Benutzeroberfläche in Kombination mit APIs, mit denen Entwickler mit nur wenigen Codezeilen umfangreiche Live-Erlebnisse schaffen können. Die Live API unterstützt die Anzeige von Start- und Endzeiten, Programmmetadaten, DVR-Steuerelementen und suchbaren Fenstern.

In diesem Leitfaden wird gezeigt, wie ein Stream für die Live APIs konfiguriert wird. Dazu gehören Code- und Metadatenbeispiele zum Konfigurieren von Live-Kernszenarien sowie Screenshots, die zeigen, wie die einzelnen Szenarien aussehen.

Voraussetzungen

Sie müssen mit den Grundlagen der Implementierung eines Web Receivers vertraut sein, bevor Sie diesen Leitfaden lesen. Zum Ausführen der Codebeispiele benötigen Sie außerdem Zugriff auf einen Livestream, der einem der unterstützten Medientypen für Cast entspricht. Im Allgemeinen unterstützt die Funktion „Live“ typische Livestreamkonfigurationen für die unterstützten Medien.

Die folgenden Begriffe werden im gesamten Leitfaden verwendet:

  • Seekable Window: Der Bereich eines Livestreams, in dem Nutzer suchen können.
  • Live Edge: Der neueste Teil eines Livestreams, der für den Player verfügbar ist.
  • Wiedergabekopf: Ein UI-Zeitstempel für die aktuelle Wiedergabeposition.

Livestreaming

Es gibt zwei Möglichkeiten, das Web Receiver SDK so zu konfigurieren, dass die Live API für Inhalte verwendet wird:

  1. mit dem LOAD-Abfangdienst für Nachrichten in Ihrer Web Receiver-Anwendung. (empfohlen)
  2. mit einer Sender- oder Empfängeranfrage.

Der Listener stellt ein LoadRequestData-Objekt bereit, das alle wichtigen Metadaten zu einer Ladeanfrage enthält. Wenn Sie angeben möchten, dass eine Ladeanfrage für einen Livestream gilt, legen Sie einfach streamType für das mediaInformation-Objekt auf StreamType.LIVE fest. MediaInformation.duration sollte -1 lauten, da die Spielerinstanzen dafür verantwortlich sind, sie zu berechnen, wenn der Inhalt LIVE ist.

/*
* This interceptor is called before your content is loaded by a Cast device
*/
playerManager.setMessageInterceptor(
   cast.framework.messages.MessageType.LOAD,
   request => { /* cast.framework.messages.LoadRequestData */
       request.media.streamType = cast.framework.messages.StreamType.LIVE;
   return request;
});

Programmübersicht hinzufügen

Bei Livestreams, insbesondere bei Livestreams mit langer Ausführungszeit, wie bei einem TV-Kanal, können basierend auf der aktuellen Wiedergabeposition in einem Livestream Metadaten der Anleitung/Programmierung angezeigt werden. Content-Anbietern wird dringend empfohlen, Programmiermetadaten in ihre Web Receiver-Anwendungen aufzunehmen, um die Nutzerfreundlichkeit zu verbessern.

Sie können die anfänglichen Anleitungsdaten für einen Stream im Listener für LOAD-Nachrichten so konfigurieren, wie wir im vorherigen Beispiel angegeben haben, dass der Stream ein Livestream ist. Einzelne Abschnitte oder Programme im Livestream werden als MediaMetadata-Objekte dargestellt, die dann in einer Warteschlange gespeichert werden. Es gibt eine andere MediaMetadata-Klasse für verschiedene Arten von Programmen, z.B. TvShowMediaMetadata, MovieMediaMetadata, MusicTrackMediaMetadata usw.

Im folgenden Code-Snippet verwenden wir das Objekt MediaMetadata, um die Startzeit jeder Sendung mit einem UNIX-Zeitstempel mit dem Attribut sectionStartAbsoluteTime anzugeben. Die Dauer eines Programms wird in Sekunden angegeben.

// The metadata for a single TV show
const currentShow = new cast.framework.messages.TvShowMediaMetadata();
currentShow.episode = 15;
currentShow.seriesTitle = 'The Odyssey';
currentShow.title = 'Scylla and Charybdis';
currentShow.sectionStartAbsoluteTime = toUnixTimestamp('9:00 PM');
currentShow.sectionDuration = HOUR_IN_SECONDS;

const previousShow = new ...;
const nextShow = new ...;

const containerMetadata = new cast.framework.messages.ContainerMetadata();
containerMetadata.title = 'My TV Channel';
containerMetadata.sections = [previousShow, currentShow, nextShow];

playerManager.getQueueManager().setContainerMetadata(containerMetadata);

Bereich für Livesuche

Das Cast SDK enthält UI-Elemente und -Steuerelemente, mit denen Nutzer ihren Abspielkopf mithilfe des erweiterten Controllers oder der Touchbedienung auf Geräten mit Touchscreen im Stream verschieben können.

LiveSeekableRange steht für den Zeitraum in einem Stream, in dem ein Nutzer suchen kann. Im Webempfänger können Sie Informationen über den Suchbereich über PlayerManager.getLiveSeekableRange() abrufen, das ein LiveSeekableRange-Objekt zurückgibt. Die wichtigsten Eigenschaften des Objekts, die Sie kennen sollten:

  • start – Die Startzeit des Bereichs in Sekunden, bezogen auf den Beginn des Streams, in Sekunden.
  • end – Die maximale Zeit (in Sekunden), die der Spieler basierend auf den verfügbaren Segmenten relativ zum Beginn des Streams suchen kann.
  • isMovingWindow: ein boolescher Wert, der angibt, ob der suchbare Bereich aus dem Manifest verschoben wird (d.h. ältere Segmente werden aus dem Manifest entfernt), muss für alle Livestreams true lauten.
  • isLiveDone – ein boolescher Wert, der angibt, ob der Livestream beendet ist, also keine neuen Segmente generiert werden.

Die Größe des Suchbereichs, dargestellt als Zeit zwischen start und end, wird durch die Anzahl der im Stream verfügbaren Segmente bestimmt und wird zusammen mit dem Stream verschoben. Wenn der Beginn des Streams z. B. {start:0, end: 600, isMovingWindow: false, isLiveDone: false} beträgt, kann er zehn Sekunden nach dem Start des Streams {start: 10, end: 610, isMovingWindow: true, isLiveDone: false} werden. Beachten Sie, dass die Start- und Endzeiten im Suchbereich auf der Grundlage der Zeit aktualisiert werden, die zum Generieren eines neuen Segments erforderlich ist. Wenn die typische Länge eines Segments für Ihren Stream also 10 Sekunden beträgt, werden die Start- und Endzeiten etwa alle 10 Sekunden aktualisiert.

Suche deaktivieren

Wenn Sie die Suche in einem Stream deaktivieren möchten, müssen Sie die Suchfunktion aus den unterstützten Medienbefehlen auf dem Web Receiver entfernen:

// disable seeking in the LOAD messageInterceptor
playerManager.removeSupportedMediaCommands(cast.framework.messages.Command.SEEK, true);

Der unterstützte Medienbefehl für SEEK-Signale für Absenderanwendungen und Touchscreens wird entfernt, um die Suche zu deaktivieren. Sprachbefehle wie „Ok Google, such 30 Sekunden zurückspulen“ werden jedoch nicht deaktiviert. Weitere Informationen zum Deaktivieren von Medienbefehlen für Sprachbefehle finden Sie im Leitfaden zu unterstützten Medienbefehlen mit Sprachsteuerung.

Live-Framework-Ereignisse

Die beiden Ereignisse LIVE_ENDED und LIVE_IS_MOVING_WINDOW_CHANGED sind in der Live API enthalten. Beide Ereignisse werden an ein LiveStatusEvent-Objekt übergeben, das den aktuellen Livesuchbereich enthält.

Veranstaltung Beschreibung
LIVE_ENDED Wird ausgelöst, wenn ein Livestream endet An diesem Punkt wird der Wert für end in LiveSeekableRange nicht mehr aktualisiert. Nutzer können jedoch weiterhin Inhalte im Live-Suchbereich sehen.
LIVE_IS_MOVING_WINDOW_CHANGED Wird ausgelöst, wenn sich der durchsuchbare Bereich eines Livestreams von einem festen Fenster in ein bewegliches Fenster oder umgekehrt ändert. Bei einem Livestream passiert das, wenn der Spieler erkennt, dass das Manifest ältere Segmente entfernt.

Szenarien für Livestreams

Es gibt acht mögliche Szenarien für das Livestreaming. Jede davon wird durch die Festlegung von drei Haupteinstellungen konfiguriert:

  • Der Stream hat eine Startzeit
  • Der Stream hat eine Endzeit
  • Nutzer dürfen im Fenster des Livestreams suchen

Weitere Informationen zur Konfiguration dieser Werte finden Sie unter Daten zum Programmleitfaden hinzufügen.

Im Folgenden finden Sie Beschreibungen und Screenshots der Szenarien, die von der Live API unterstützt werden. Die Variablen T1 und T2 werden zur Darstellung des Zeitstempels auf der linken bzw. rechten Seite der Benutzeroberfläche verwendet.

Beginn Ende Suchbar T1 T2
Situation 1 Nein Nein Nein Wiedergabekopf Nicht angezeigt
Situation 2 No No Yes Spielkopf Nicht angezeigt
Situation 3 No Ja No Spielkopf Nicht angezeigt
Situation 4 No Ja Yes Spielkopf Nicht angezeigt
Situation 5 Yes No No Startzeit anzeigen Spielkopf
Situation 6 Yes No Yes Startzeit anzeigen Spielkopf
Szenario 7 Ja Ja Nein Startzeit anzeigen Ende anzeigen
Szenario 8 Ja Ja Ja Startzeit anzeigen Ende anzeigen

Szenario 1

Beginn Ende Suchbar T1 T2
Nein Nein Nein Wiedergabekopf Nicht angezeigt

Szenario 1 hat keine Start- oder Endzeit und Nutzer können im Stream nicht suchen. Wenn ein Nutzer einen Stream anhält, wird die Wiedergabe am Live-Edge fortgesetzt und nicht an der Stelle, an der der Stream pausiert wurde.

Szenario 7

Ein Fernseher, auf dem die Live-Benutzeroberfläche von Chromecast für Szenario 7 mit Uhrzeit angezeigt wird Ein Smartphone, auf dem die Live-UI für Szenario 7 und die Uhrzeit zu sehen ist.

Beginn Ende Suchbar T1 T2
Ja Ja Nein Wiedergabekopf Programmdauer

Szenario 7 hat eine Start- und Endzeit, ist aber nicht suchbar. Die beiden Zeitstempel in der UI, T1 und T2, stellen jeweils die aktuelle Abspielkopfzeit und die Gesamtprogrammdauer dar. Wenn ein Nutzer die Wiedergabe pausiert/fortsetzt, wird der Stream am Live-Edge des Streams fortgesetzt. Im obigen Beispiel steht der rote Abschnitt der Suchleiste für den Teil des Streams, den der Nutzer seit Beginn der Wiedergabe verwendet hat.

Szenario 8

Ein Fernseher, auf dem die Live-Benutzeroberfläche von Chromecast für Szenario 8 mit Uhrzeit angezeigt wird Ein Smartphone, auf dem die Live-UI für Szenario 8 und die Uhrzeit zu sehen ist.

Beginn Ende Suchbar T1 T2
Ja Ja Ja Wiedergabekopf Programmdauer

Szenario 7 hat eine Start- und Endzeit und ist suchbar. Die beiden Zeitstempel in der UI, T1 und T2, stellen die aktuelle Abspielkopfzeit bzw. die Gesamtdauer des Programms dar. Wenn ein Nutzer die Wiedergabe pausiert oder fortsetzt, wird der Stream zu dem Zeitpunkt fortgesetzt, an dem er innerhalb des suchbaren Fensters pausiert wurde. Der rot hervorgehobene Bereich auf der Suchleiste zeigt an, wohin der Nutzer zurückspringen kann, und der weiße Bereich gibt an, wohin er vorwärts springen kann.

Szenario konfigurieren

Die Konfiguration eines Streams als spezifisches Live-Szenario erfolgt in drei Schritten:

  1. Streamtyp festlegen: Markiere den Stream als Livestream.
  2. Add Guide Guide Data - Legen Sie Startzeit und Dauer im MediaMetadata-Objekt fest.
  3. Suchfunktion konfigurieren: Die Suche aktivieren oder deaktivieren.

Wiedergabeverhalten

Wenn die Wiedergabe pausiert ist, werden die Metadaten der Wiedergabe der Benutzeroberfläche weiterhin aktualisiert – dies beinhaltet die Kopf- und Live-Edge-Zeiten der Wiedergabe. Bei der Wiederaufnahme des Streams gibt es einige Verhaltensmuster, die je nach Streamkonfiguration variieren können.

Durchsuchbare Streams

Nach der Wiederaufnahme eines durchsuchbaren Streams gilt Folgendes:

  • Der Live-Edge wird auf den Live-Standort aktualisiert und der Suchbereich wird entsprechend angepasst.
  • Wenn der Abspielkopf über die aktuelle Sendung springt, wird die Scrubbing-Leiste mit den Metadaten der neuen Sendung aktualisiert, einschließlich der Start- und Endzeit, sofern verfügbar.
  • Wenn ein suchbares Fenster die Länge 'X' hat, erstreckt sich der Suchbereich auf höchstens 'X' oder den Anfang der Sendung, je nachdem, welcher Wert kleiner ist.
  • Wenn der Nutzer lange genug pausiert wurde, damit sich die aktuelle Zeit nicht mehr im suchbaren Fenster befindet, wird der Stream an dem frühesten Zeitpunkt (ganz links) des Suchfensters fortgesetzt.

Suchen Sie nach LiveSeekableRange.end, um nach dem Fortsetzen die Wiedergabe am Live-Edge fortzusetzen.

let playerManager = cast.framework.CastReceiverContext.getInstance().getPlayerManager();
// Intercept the message to PLAY
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.PLAY, (requestData) => {
  ...
  if (playerManager.getLiveSeekableRange()) {
    // Resume playback at the live edge
    playerManager.seek(playerManager.getLiveSeekableRange().end);
  } else {
    return requestData;
  }
  ...
});

Nicht suchbare Streams

Bei der Wiederaufnahme eines nicht suchbaren Streams gilt Folgendes:

  • In diesem Fall wird die Wiedergabe am Live-Edge fortgesetzt.
  • Wenn der Liverand über die aktuelle Sendung hinausgeht, sollte die Scrubbing-Leiste mit den Metadaten der neuen Sendung aktualisiert werden (einschließlich der Startzeit und der Endzeit).

API-Oberflächenänderungen und Anpassung der Live-UI

Das Cast SDK bietet eine integrierte Unterstützung für das Erstellen benutzerdefinierter Benutzeroberflächen anstelle der vorkonfigurierten UI. Sie sollten jedoch die Checkliste für das Design der UX für das Streamen befolgen, wenn Sie die Benutzeroberfläche anpassen.

Web-Empfänger

Im Webempfänger enthält PlayerData die folgenden Felder, damit Entwickler ihre benutzerdefinierten Schnittstellen für Livestreams erweitern können:

  • isLive – ein Flag, das angibt, ob der aktuelle Stream ein Livestream und kein VOD-Stream ist.
  • liveSeekableRange – Der suchbare Bereich, der auf dem Bildschirm angezeigt wird, um das DVR-Fenster abzugrenzen.
  • mediaStartAbsoluteTime – Wenn der Abschnitt in absoluter Zeit (UNIX-Epoche) gestartet wurde.
  • sectionStartTimeInMedia: Die Startzeit des Abschnitts in Sekunden, bezogen auf die Medienstartzeit.
  • sectionDuration: Die Abschnittsdauer in Sekunden.

Außerdem solltest du beim Anpassen der UI die zwei Live-Ereignisse berücksichtigen.

Android SDK

Als Teil der Live-Funktion wurde die Verwendung des Android-Seekbar-Widgets in UIMediaController eingestellt. Verwende stattdessen die CastSeekBar.