Mit den Zeitverschiebung-APIs in Ihrem TV-Eingabedienst können Nutzer Live-Programme auf Ihren Dienstkanälen pausieren, zurückspulen und vorspulen. Wenn Ihre App die Zeitverschiebung unterstützt, haben Nutzer mehr Flexibilität bei der Wiedergabe Ihrer Inhalte:
- Nutzer können Programme pausieren, wenn sie kurz unterbrochen werden, so verpassen sie keine wichtigen Momente.
- Nutzer können Inhalte vorspulen, die sie bereits gesehen haben oder die sie nicht interessieren.
- Nutzer können Lieblingsmomente in Programminhalten zurückspulen und noch einmal ansehen.
Bei der Zeitverschiebung werden kurze, temporäre, aufgezeichnete Segmente von Programmdaten verwendet, um die Wiedergabe von Live-Programmen zu ermöglichen. Nutzer können diese Zeitverschiebungsaufzeichnungen nicht außerhalb der aktuellen Wiedergabesitzung abspielen. Das bedeutet, dass sie die Zeitverschiebung nicht verwenden können, um ein Programm zu pausieren und es sich am nächsten Tag anzusehen, oder um ein Programm zu pausieren und es sich später anzusehen, während sie zu einem anderen Kanal wechseln.
Verwenden Sie die TV-Aufzeichnungs-APIs, wenn Sie Nutzern die Möglichkeit geben möchten, Programminhalte aufzuzeichnen und sie sich außerhalb der aktuellen Wiedergabe sitzung anzusehen.
Unterstützung für die Zeitverschiebung hinzufügen
Wenn Sie Ihrem TV-Eingabedienst Unterstützung für die Zeitverschiebung hinzufügen möchten, müssen Sie die Zeitverschiebung-APIs in Ihrer TvInputService.Session-Klasse implementieren, die Aufzeichnung und Wiedergabe von Zeitverschiebungsaufzeichnungen in Ihrer App verarbeiten und das System darüber informieren, dass Ihr Eingabedienst die Zeitverschiebung unterstützt.
Die TvInputService.Session-Methoden, die Sie implementieren, sind die folgenden:
onTimeShiftGetCurrentPosition(): Wird vom System aufgerufen, um die aktuelle Wiedergabeposition in Millisekunden abzurufen. Weitere Informationen finden Sie im Abschnitt Wiedergabezeiten verfolgen.onTimeShiftGetStartPosition(): Wird vom System aufgerufen, um die Start position der aktuellen Zeitverschiebungsaufzeichnung in Millisekunden abzurufen. Weitere Informationen finden Sie unter im Abschnitt Wiedergabezeiten verfolgen.onTimeShiftPause(): Wird aufgerufen, wenn der Nutzer die Wiedergabe pausiert.onTimeShiftResume(): Wird aufgerufen, wenn der Nutzer die Wiedergabe fortsetzt.onTimeShiftSeekTo(long): Wird aufgerufen, wenn das System eine neue Zeitposition suchen muss. Normalerweise liegt die neue Position zwischen der Startposition und der aktuellen Position.onTimeShiftSetPlaybackParams(PlaybackParams): Wird vom System aufgerufen, um Wiedergabeparameter wie die Wiedergabegeschwindigkeit für die aktuelle Sitzung bereitzustellen. Weitere Informationen finden Sie im Abschnitt Wiedergabeparameter unterstützen.
Weitere Informationen dazu, wie Sie das System darüber informieren, dass Ihr Eingabedienst die Zeitverschiebung unterstützt, finden Sie im Abschnitt System über den Status der Zeitverschiebung benachrichtigen.
Wenn Sie die TIF Companion Library verwenden, um Ihre TvInputService.Session-Klasse zu implementieren, erhalten Sie automatisch eine Implementierung der Zeitverschiebung, die ExoPlayer verwendet. Sie können diese Implementierung verwenden oder die Zeitverschiebung-API-Methoden in BaseTvInputService.Session überschreiben und Ihre eigene Implementierung bereitstellen. Weitere Informationen zur Verwendung der TIF Companion Library finden Sie unter TV-Eingabedienst mit
der TIF Companion Library erstellen.
Inhalte aufzeichnen, wenn eine Sitzung gestartet wird
Nutzer können Programminhalte pausieren, zurückspulen und vorspulen, indem sie auf die Wiedergabesteuerelemente für den Kanal zugreifen. Dazu können sie entweder während der Wiedergabe von Inhalten Auswählen drücken und dann zu den Wiedergabesteuerelementen navigieren oder spezielle Wiedergabesteuerelemente auf einem Remote-Gerät verwenden.
Da Nutzer die Zeitverschiebung jederzeit während der Wiedergabe von Programminhalten verwenden können, muss Ihr TV-Eingabedienst mit der Aufzeichnung von Zeitverschiebungsinhalten beginnen, sobald der Nutzer in Ihrer onTune()-Implementierung einen Kanal auswählt. Sie müssen das System auch darüber
informieren, dass Sie aufzeichnen können, indem Sie
notifyTimeShiftStatusChanged(int),
aufrufen, wie im
System über den Status der Zeitverschiebung benachrichtigen
Abschnitt beschrieben.
Speicher für aufgezeichnete Inhalte verwalten
Ihr TV-Eingabedienst ist dafür verantwortlich, Zeitverschiebungsaufzeichnungen im privaten App-Speicher Ihrer App zu speichern und Inhalte wiederzugeben, wenn das System Ihre Zeitverschiebungsmethoden wie onTimeShiftResume() aufruft.
Wenn Ihre Inhalte bereits in der Cloud gespeichert sind und Ihre App Zeitverschiebungsaufzeichnungen in der Cloud verwalten kann, können Sie anstelle des App-Speichers Cloud-Speicher verwenden.
Wenn Ihre Inhalte geschützte Inhalte verwenden, ist Ihr TV-Eingabedienst für die ordnungsgemäße Verschlüsselung aufgezeichneter Inhalte und die Entschlüsselung von Inhalten während der Wiedergabe verantwortlich.
Da aufgezeichnete Videoinhalte viel Speicherplatz benötigen können, müssen Sie aufgezeichnete Inhalte während der Wiedergabe in der Sitzung sorgfältig verwalten. Wenn die Wiedergabesitzung länger dauert als die Zeit, die Sie für die Zeitverschiebung aufzeichnen und speichern können, passen Sie die Zeitverschiebungsaufzeichnung an, um den aktuellen Puffer beizubehalten, aber die aktuelle Zeit zu erfassen. Wenn der Nutzer beispielsweise 31 Minuten lang Inhalte wiedergegeben hat und Ihre maximale Zeitverschiebungsaufzeichnung 30 Minuten beträgt, passen Sie die Aufzeichnung und die Startzeit so an, dass Inhalte von Minute 1 bis Minute 31 enthalten sind.
Wenn Ihr TV-Eingabedienst die Zeitverschiebung aufgrund von Speichermangel nicht unterstützen kann, müssen Sie das System darüber informieren. Weitere Informationen dazu, wie Sie das System über Einschränkungen bei der Unterstützung der Zeitverschiebung benachrichtigen, finden Sie im Abschnitt System über den Status der Zeitverschiebung benachrichtigen.
Wenn der Nutzer zu einem anderen Kanal wechselt oder die Wiedergabesitzung auf andere Weise beendet, löschen Sie die aufgezeichneten Zeitverschiebungsdaten.
System über den Status der Zeitverschiebung benachrichtigen
Wenn Ihr TV-Eingabedienst die Zeitverschiebung unterstützt, rufen Sie in Ihrer Implementierung von onTune() notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) auf, wenn ein Nutzer einen Kanal auswählt.
Verwenden Sie notifyTimeShiftStatusChanged(int), um das System über Änderungen an den Zeitverschiebungsfunktionen Ihres Eingabedienstes zu informieren.
Wenn Ihr TV-Eingabedienst die Zeitverschiebung beispielsweise aufgrund von Speicherplatzbeschränkungen oder aus anderen Gründen nicht unterstützen kann, rufen Sie notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE) auf.
Wenn Ihr TV-Eingabedienst die Zeitverschiebung überhaupt nicht unterstützen kann, rufen Sie notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) auf, wenn eine Wiedergabesitzung erstellt wird. Das System behandelt jeden Eingabedienst, der notifyTimeShiftStatusChanged() nie aufruft, als Eingabedienst, der die Zeitverschiebung nicht unterstützen kann. Dies gilt für Eingabedienste mit API-Level 22 und niedriger.
Wiedergabezeiten verfolgen
Die Startposition einer Zeitverschiebungsaufzeichnung ist die früheste absolute Zeitposition in Millisekunden seit der Epoche, zu der der Nutzer springen kann. Das ist normalerweise die Zeit, zu der die Videowiedergabe beginnt, nachdem onTune() aufgerufen wurde.
Wenn der Nutzer jedoch mehr Inhalte ansieht, als Ihre App aufzeichnen kann, müssen Sie ein neues Segment für die Zeitverschiebung aufzeichnen und die Startzeit entsprechend aktualisieren.
Die aktuelle Position einer Zeitverschiebungsaufzeichnung ist die aktuelle Wiedergabeposition in Millisekunden seit der Epoche. Diese Position ändert sich während der Wiedergabe kontinuierlich. Normalerweise können Sie Ihre Wiedergabe-Engine verwenden, um diesen Wert zu bestimmen, wie im folgenden Beispiel gezeigt:
Kotlin
override fun onTimeShiftGetCurrentPosition(): Long = tvPlayer?.run { currentProgram?.let { program -> currentPosition + program.startTimeUtcMillis } } ?: TvInputManager.TIME_SHIFT_INVALID_TIME
Java
@Override public long onTimeShiftGetCurrentPosition() { if (getTvPlayer() != null && currentProgram != null) { return getTvPlayer().getCurrentPosition() + currentProgram.getStartTimeUtcMillis(); } return TvInputManager.TIME_SHIFT_INVALID_TIME; }
Die Startzeit, die Sie angeben, wenn das System onTimeShiftGetStartPosition() aufruft, darf niemals größer sein als die aktuelle Zeitposition, die Sie in onTimeShiftGetCurrentPosition() angeben.
Das System verwendet diese Aufrufe, um die Zeitverschiebungsdauer in der UI der Wiedergabesteuerelemente zu aktualisieren.
Wiedergabeparameter unterstützen
Um die Wiedergabegeschwindigkeit während der Zeitverschiebung zu ändern, verwendet das System Wiedergabeparameter. Wenn der Nutzer beispielsweise die aktuelle Wiedergabe zurückspulen möchte, werden neue Wiedergabeparameter mit einer negativen Wiedergabegeschwindigkeit an Ihre App übergeben. Die Zeitverschiebung unterstützt auch mehrere verschiedene Stufen (2x oder 3x) der Wiedergabegeschwindigkeit für das Zurückspulen oder Vorspulen.
Das System ruft Ihre
onTimeShiftSetPlaybackParams(PlaybackParams)
Methode mit einem PlaybackParams Objekt auf, das
Parameter für die aktuelle Sitzung enthält. Verwenden Sie diese Informationen, um Ihre Medienwiedergabe-Engine entsprechend zu konfigurieren.
Wenn Ihre Wiedergabe-Engine einen Parameter nicht unterstützt, emulieren Sie das erwartete Verhalten so gut wie möglich. Wenn Ihre Wiedergabe-Engine beispielsweise keine 2-fache Geschwindigkeit unterstützt, verwenden Sie wiederholte Suchvorgänge in Ihrer Wiedergabe-Engine, um eine ungefähr doppelte Wiedergabegeschwindigkeit zu erzielen.
Nachdem die Parameter festgelegt wurden, ändern Sie die Einstellungen nur, wenn der Nutzer entweder einen Wiedergabebefehl ausgibt, der einen anderen Parameter erfordert, oder zu einem neuen Kanal wechselt.