Verwenden Sie zeitversetzte APIs in Ihrem TV-Eingabedienst, damit Nutzer Live-Programme in Ihren Dienstkanälen pausieren, zurückspulen und vorspulen können. Wenn Ihre App die zeitversetzte Nutzung unterstützt, können Nutzer Ihre Inhalte flexibel ansehen:
- Nutzer können Programme pausieren, während sie eine kurzfristige Unterbrechung behandeln, damit sie keine wichtigen Momente verpassen.
- Nutzer können vorspulen, die sie bereits gesehen haben oder die sie nicht interessieren.
- So können Nutzer zurückspulen und sich ihre Lieblingsmomente in den Programminhalten noch einmal ansehen.
![](https://developer.android.com/static/images/training/tv/tif/time-shift.png?authuser=6&hl=de)
Abbildung 1: Die Android TV-Wiedergabesteuerung, die für die zeitversetzte Nutzung verwendet wird.
Bei der zeitversetzten Nutzung werden kurze, temporäre, aufgezeichnete Segmente von Programmdaten verwendet, um die Möglichkeit zur Wiedergabe von Live-Programmen zu implementieren. Nutzer können diese zeitversetzten Aufnahmen nicht außerhalb der aktuellen Wiedergabesitzung abspielen. Das bedeutet, dass sie nicht durch zeitversetztes Fernsehen ein Programm pausieren können, um es sich den nächsten Tag anzusehen, oder ein Programm pausieren, um es später anzusehen, wenn sie zu einem anderen Kanal wechseln.
Verwende die APIs zur TV-Aufzeichnung, wenn du deinen Nutzern erlauben möchtest, Programminhalte aufzuzeichnen, die sie außerhalb der aktuellen Wiedergabesitzung ansehen können.
Unterstützung für zeitversetztes Fernsehen hinzufügen
Damit Ihr TV-Eingabedienst zeitversetztes Fernsehen unterstützt, müssen Sie die zeitversetzten APIs in Ihrer TvInputService.Session
-Klasse implementieren, die Aufzeichnung und Wiedergabe zeitversetzter Aufnahmen in Ihrer App übernehmen und das System darüber informieren, dass Ihr Eingabedienst zeitversetztes Fernsehen unterstützt.
Folgende TvInputService.Session
-Methoden implementieren Sie:
onTimeShiftGetCurrentPosition()
: wird vom System aufgerufen, um die aktuelle Wiedergabeposition in Millisekunden zu ermitteln. Weitere Informationen finden Sie im Abschnitt Wiedergabezeiten erfassen.onTimeShiftGetStartPosition()
: wird vom System aufgerufen, um die Startposition der aktuellen zeitversetzten Aufnahme in Millisekunden zu ermitteln. Weitere Informationen finden Sie im Abschnitt Wiedergabezeiten erfassen.onTimeShiftPause()
: Wird aufgerufen, wenn der Nutzer die Wiedergabe anhält.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 können, dass Ihr Eingabedienst die zeitversetzte Nutzung unterstützt, finden Sie im Abschnitt System über den Status der zeitversetzten Nutzung informieren.
Wenn Sie die TvInputService.Session
-Klasse mithilfe der TIF-Companion-Bibliothek implementieren, erhalten Sie automatisch eine zeitversetzte Nutzung mit ExoPlayer. Sie können diese Implementierung verwenden oder die zeitversetzten API-Methoden in BaseTvInputService.Session
überschreiben und eine eigene Implementierung angeben. Weitere Informationen zur Verwendung der TIF-Companion-Bibliothek finden Sie unter TV-Eingabedienst mithilfe der TIF-Companion-Bibliothek erstellen.
Inhalte beim Start einer Sitzung aufzeichnen
Ein Nutzer kann Programminhalte pausieren, zurückspulen und vorspulen, indem er die Wiedergabesteuerung für den Kanal verwendet. Dazu drückt er entweder während der Wiedergabe des Inhalts die Taste Auswählen und ruft dann die Wiedergabesteuerung auf oder er kann die spezielle Wiedergabesteuerung auf einem Remote-Gerät verwenden.
Da der Nutzer während der Wiedergabe von Programminhalten jederzeit zeitversetztes Fernsehen ansehen kann, muss Ihr TV-Eingabedienst mit der Aufzeichnung zeitversetzter Inhalte beginnen, sobald der Nutzer einen Kanal in Ihrer onTune()
-Implementierung auswählt. Außerdem musst du das System darüber informieren, dass du Aufnahmen machen kannst. Dazu musst du notifyTimeShiftStatusChanged(int)
aufrufen, wie im Abschnitt System über zeitversetztes Fernsehen informieren beschrieben.
Speicherung aufgezeichneter Inhalte verwalten
Ihr TV-Eingabedienst ist dafür verantwortlich, zeitversetzte Aufnahmen im privaten App-Speicher Ihrer App zu speichern und Inhalte abzuspielen, wenn das System Ihre zeitversetzten Methoden wie onTimeShiftResume()
aufruft.
Wenn Ihre Inhalte bereits in der Cloud gespeichert sind und Ihre Anwendung zeitversetzte Aufzeichnungen in der Cloud verwalten kann, können Sie Cloud-Speicher anstelle von App-Speicher verwenden.
Wenn Ihre Inhalte geschützte Inhalte verwenden, ist Ihr TV-Eingabedienst für die ordnungsgemäße Verschlüsselung der aufgezeichneten Inhalte und die Entschlüsselung der Inhalte während der Wiedergabe verantwortlich.
Da aufgezeichnete Videoinhalte sehr viel Speicherplatz erfordern können, müssen Sie aufgezeichnete Inhalte während der Sitzungswiedergabe sorgfältig verwalten. Wenn die Wiedergabesitzungszeit die Zeit überschreitet, die Sie für die zeitversetzte Nutzung aufzeichnen und speichern können, passen Sie die zeitversetzte Aufzeichnung so an, dass der aktuelle Zwischenspeicher beibehalten wird, aber die aktuelle Zeit erfasst wird. Wenn der Nutzer beispielsweise 31 Minuten lang Inhalte abgespielt hat und die maximale zeitversetzte Aufnahmegröße 30 Minuten beträgt, passen Sie die Aufnahme und die Startzeit so an, dass sie von Minute 1 bis Minute 31 beginnt.
Wenn Ihr TV-Eingabedienst die zeitversetzte Nutzung aufgrund von Speichermangel nicht unterstützt, müssen Sie das System informieren. Weitere Informationen dazu, wie Sie das System über Einschränkungen bei der zeitversetzten Nutzung informieren, finden Sie im Abschnitt System über den Status der zeitversetzten Nutzung informieren.
Wenn der Nutzer zu einem anderen Kanal wechselt oder die Wiedergabesitzung beendet, werden die aufgezeichneten zeitversetzten Daten gelöscht.
System über Status der zeitversetzten Nutzung informieren
Wenn dein TV-Eingabedienst die zeitversetzte Nutzung unterstützt, rufe notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE)
in deiner Implementierung von onTune()
auf, wenn ein Nutzer einen Kanal abspielt.
Verwenden Sie notifyTimeShiftStatusChanged(int)
, um das System zu informieren, wenn sich zeitversetzte Funktionen Ihres Eingabedienstes ändern.
Wenn Ihr TV-Eingabedienst beispielsweise die zeitversetzte Nutzung aufgrund von Speicherplatzbeschränkungen oder anderen Gründen nicht unterstützt, rufen Sie notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE)
auf.
Wenn Ihr TV-Eingabedienst die zeitversetzte Nutzung nicht unterstützt, rufen Sie beim Erstellen einer Wiedergabesitzung notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED)
auf. Das System behandelt jeden Eingabedienst, der notifyTimeShiftStatusChanged()
nie aufruft, als Eingabedienst, der keine zeitversetzte Nutzung unterstützt. Dies umfasst Eingabedienste mit API-Level 22 und niedriger.
Wiedergabezeiten erfassen
Die Startposition einer zeitversetzten Aufnahme ist die früheste absolute Zeitposition in Millisekunden seit der Epoche, die der Nutzer anstreben kann. Das ist normalerweise die Zeit, zu der die Videowiedergabe beginnt, nachdem onTune()
aufgerufen wurde.
Wenn sich der Nutzer jedoch eine Menge Inhalte ansieht, die Ihre App nicht aufnehmen kann, müssen Sie mit der Aufzeichnung eines neuen Segments zur zeitversetzten Nutzung beginnen und Ihre Startzeit entsprechend aktualisieren.
Die aktuelle Position einer zeitversetzten Aufnahme ist die aktuelle Wiedergabeposition in Millisekunden seit der Epoche. Diese Position ändert sich während der Wiedergabe kontinuierlich. Typischerweise können Sie die Wiedergabe-Engine verwenden, um diesen Wert zu ermitteln, 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 Ihre onTimeShiftGetStartPosition()
aufruft, muss nie nach der aktuellen Zeitposition liegen, die Sie in onTimeShiftGetCurrentPosition()
angegeben haben.
Das System verwendet diese Aufrufe, um die Dauer der zeitversetzten Nutzung in der Benutzeroberfläche der Wiedergabesteuerung zu aktualisieren.
Wiedergabeparameter unterstützen
Um die Wiedergabegeschwindigkeit während der zeitversetzten Nutzung zu ändern, verwendet das System Wiedergabeparameter. Wenn sich der Nutzer beispielsweise entscheidet, die aktuelle Wiedergabe zurückzuspulen, werden neue Wiedergabeparameter mit einer negativen Wiedergabegeschwindigkeit an Ihre App übergeben. Das zeitversetzte Fernsehen unterstützt auch verschiedene Stufen der Wiedergabegeschwindigkeit zum Zurück- oder Vorspulen: 2- oder 3-fach.
Das System ruft die Methode onTimeShiftSetPlaybackParams(PlaybackParams)
mit einem PlaybackParams
-Objekt auf, das Parameter für die aktuelle Sitzung enthält. Konfigurieren Sie anhand dieser Informationen die Engine für die Medienwiedergabe entsprechend.
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 der Wiedergabe-Engine, um eine etwa doppelte Wiedergabegeschwindigkeit zu erreichen.
Nachdem die Parameter festgelegt wurden, dürfen Sie die Einstellungen nur dann ändern, wenn der Nutzer einen Wiedergabebefehl ausgibt, für den ein anderer Parameter erforderlich ist, oder zu einem neuen Kanal wechselt.