Korzystaj z interfejsów API przesuwających w czasie w usłudze wejścia TV, aby umożliwić użytkownikom wstrzymywanie, przewijanie do tyłu aby przyspieszyć programy na żywo na Twoich kanałach usługowych. Jeśli aplikacja obsługuje YouTube przesuwa się w czasie, więc użytkownicy zyskują elastyczność w sposobie, w jaki oglądają Twoje treści:
- Użytkownicy mogą wstrzymywać programy, mając do czynienia z krótkotrwałą przerwą, aby nigdy nie przegapić kluczowych momentów.
- Użytkownicy mogą przewijać treści, które już widzieli, lub które co ich nie interesuje.
- Użytkownicy mogą przewijać ulubione momenty w programie i ponownie je oglądać.
![](https://developer.android.com/static/images/training/tv/tif/time-shift.png?authuser=9&hl=pl)
Rysunek 1. Elementy sterujące odtwarzaniem w Androidzie TV służące do przesuwania w czasie.
Funkcja przesuwania w czasie wykorzystuje krótkie, tymczasowe, zarejestrowane segmenty danych programu, implementować możliwość odtwarzania programów na żywo. Użytkownicy nie mogą odtworzyć tego przesunięcia w czasie nagrania poza bieżącą sesją odtwarzania. Oznacza to, że nie może korzystać z przesuwam w czasie, aby wstrzymać program i obejrzeć następny dzień, lub wstrzymać program, aby obejrzeć je później, podczas gdy przełączają się na inny kanał.
Jeśli chcesz, użyj interfejsów API do nagrywania telewizji. aby umożliwić użytkownikom nagrywanie treści programu i odtwarzanie ich poza aktualnie odtwarzanym materiałem .
Dodawanie obsługi przesuwania w czasie
Aby dodać obsługę przesuwania w czasie do usługi wejścia TV, musisz zaimplementować funkcję
interfejsy API przesuwające w czasie w klasie TvInputService.Session
,
obsługiwać nagrywanie i odtwarzanie nagrań z przesunięciem w czasie w aplikacji oraz powiadamiać
system, z którego usługa wejściowa obsługuje
przesunięcie w czasie.
Wdrażane przez Ciebie metody TvInputService.Session
to
następujące:
onTimeShiftGetCurrentPosition()
: wywołany przez system, aby pobrać bieżącą pozycję odtwarzania w milisekundach. Więcej informacji: Śledzenie czasu odtwarzania.onTimeShiftGetStartPosition()
: wywołany przez system, aby uzyskać początek położenie bieżącego przesunięcia w czasie w milisekundach. Aby dowiedzieć się więcej, przeczytaj sekcję Śledzenie czasu odtwarzania.onTimeShiftPause()
: gdy użytkownik wstrzymuje odtwarzanie.onTimeShiftResume()
: Wywoływana po wznowieniu odtwarzania przez użytkownika.onTimeShiftSeekTo(long)
: gdy system musi wyszukać nowej pozycji czasowej. Normalnie nowa pozycja znajduje się między pozycji początkowej i bieżącej pozycji.onTimeShiftSetPlaybackParams(PlaybackParams)
: wywołany przez system aby udostępnić parametry odtwarzania (np. szybkość odtwarzania) w bieżącej sesji. Więcej informacji: Obsługa parametrów odtwarzania.
Więcej informacji na temat informowania systemu, że usługa wejściowa obsługuje przesuwanie w czasie, Powiadamianie systemu o stanie przesunięcia w czasie .
Jeśli używasz biblioteki towarzyszącej TIF do implementacji
TvInputService.Session
zajęcia, automatycznie otrzymasz:
wdrożenia przesuwania czasowego z wykorzystaniem ExoPlayer. Możesz użyć tej
lub zastąpić metody interfejsu API przesunięte w czasie
BaseTvInputService.Session
i podaj własne
implementacji. Więcej informacji o korzystaniu z biblioteki towarzyszącej TIF znajdziesz w artykule Tworzenie usługi wejścia TV za pomocą
w bibliotece towarzyszącej TIF.
Nagrywaj treści po rozpoczęciu sesji
Użytkownik może wstrzymywać, przewijać i przewijać do przodu treści programu za pomocą elementów sterujących odtwarzaniem na kanale, przez naciśnięcie klawisza Select obejrzenia treści, a następnie przejdź do elementów sterujących odtwarzaniem lub specjalne elementy sterujące odtwarzaniem na urządzeniu zdalnym.
Ponieważ użytkownik może
możesz w dowolnym momencie użyć przesunięcia w czasie, oglądając programy,
usługa wejściowa musi rozpocząć nagrywanie treści przesuwanych w czasie, gdy tylko użytkownik
dostraja się do kanału na Twoim
onTune()
implementacji. Musisz także wykonać te czynności:
poinformują system o możliwości nagrywania przez wywołanie
notifyTimeShiftStatusChanged(int)
,
zgodnie z opisem w
Powiadamianie systemu o stanie przesunięcia w czasie
.
Zarządzanie przechowywaniem nagranych treści
Twoja usługa wejścia TV odpowiada za przechowywanie nagrań z przesunięciem w czasie w
pamięci aplikacji w prywatnym miejscu i odtwarzania treści po wywołaniu przez system
przesuwania w czasie,
onTimeShiftResume()
Jeśli treści są już przechowywane w chmurze i aplikacja może zarządzać
nagrania z przesunięciem w czasie w chmurze, możesz zamiast tego skorzystać z miejsca w chmurze
pamięci aplikacji.
Jeśli Twoje treści zawierają treści chronione, usługa wejścia TV odpowiada za poprawne szyfrowanie nagranych treści i ich odszyfrowywanie podczas odtwarzania.
Nagrane treści wideo mogą zajmować dużo miejsca, dlatego ostrożnie zarządzać nagranymi treściami podczas odtwarzania w sesji. Jeśli odtwarzanie czas trwania sesji przekracza czas, który możesz nagrać i zapisać lub przesunięcie w czasie, możesz dostosować nagranie przesunięcie w czasie, by zachować w bieżącym buforze, ale upewnij się, że przechwycony jest bieżący czas. Jeśli na przykład użytkownik odtwarza treści od 31 minut, a Twoje maksymalne przesunięcie w czasie rozmiar to 30 minut. Dostosuj nagranie i czas rozpoczęcia, aby zmieścić od minuty 1 do 31 minuty.
Jeśli usługa wejścia TV nie obsługuje przesunięcia w czasie z powodu braku musisz poinformować o tym system. Więcej informacji o tym, jak powiadamiać o ograniczeniach obsługi przesuwających się w czasie, zapoznaj się z Powiadamianie systemu o stanie przesunięcia w czasie .
Gdy użytkownik przełączy się na inny kanał lub w inny sposób zakończy odtwarzanie usuń zarejestrowane dane o przesunięciu w czasie.
Powiadamianie systemu o stanie przesunięcia w czasie
Jeśli Twoja usługa wejścia TV obsługuje przesunięcie w czasie,
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE)
w:
implementacja
onTune()
, gdy użytkownik odtwarza treści
do kanału.
Aby informować system o dowolnych możliwościach usługi wejściowej dotyczących przesuwania w czasie
zmień, użyj
notifyTimeShiftStatusChanged(int)
Na przykład jeśli usługa wejścia TV nie obsługuje przesunięcia w czasie
z powodu ograniczenia dostępnego miejsca na dane lub z innych powodów,
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE)
Jeśli usługa wejścia TV w ogóle nie obsługuje przesuwania w czasie, zadzwoń pod numer
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED)
po utworzeniu sesji odtwarzania. System traktuje każdą usługę wejściową, która
nigdy nie dzwoni
notifyTimeShiftStatusChanged()
jako usługi wejściowej, która nie może
i obsługują
przesunięcia w czasie. Dotyczy to usług wprowadzania danych używających interfejsu API poziomu 22 oraz
wcześniej.
Śledź czas odtwarzania
Pozycja początkowa nagrania z przesunięciem w czasie to najwcześniejszy czas bezwzględny
pozycja, do której użytkownik może szukać w milisekundach od początku epoki. To jest
zwykle jest to czas, po którym rozpoczyna się odtwarzanie filmu
Funkcja onTune()
jest wywoływana.
Jeśli jednak użytkownik obejrzy ilość treści, która przekracza to, co
Twoja aplikacja może nagrywać, musisz rozpocząć nagrywanie nowego segmentu dla
przesuniesz w czasie i odpowiednio zaktualizuję godzinę rozpoczęcia.
Bieżąca pozycja nagrania z przesunięciem w czasie to bieżące odtwarzanie położenie w milisekundach od początku epoki. Ta pozycja zmienia się w sposób ciągły podczas odtwarzania. Zwykle można to ustalić za pomocą mechanizmu odtwarzania Jak w tym przykładzie:
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; }
Upewnij się, że godzina rozpoczęcia podana, gdy system wywołuje Twój
onTimeShiftGetStartPosition()
nigdy nie jest większa niż bieżąca pozycja czasu podana w
onTimeShiftGetCurrentPosition()
System używa tych wywołań, aby:
zaktualizować czas trwania przesunięcia w czasie w interfejsie elementów sterujących odtwarzaniem.
Obsługa parametrów odtwarzania
Aby zmienić szybkość odtwarzania podczas przesuwania w czasie, system wykorzystuje parametry odtwarzania. Dla: Jeśli użytkownik zdecyduje się przewinąć obecne odtwarzanie do tyłu, są przesyłane do Twojej aplikacji z ujemną szybkością odtwarzania. Przesunięcie w czasie obsługuje też kilka różnych poziomów szybkości odtwarzania – 2- lub 3-krotnie. aby przewinąć film do tyłu lub do przodu.
System wywoła
onTimeShiftSetPlaybackParams(PlaybackParams)
z obiektem PlaybackParams
, który zawiera
w bieżącej sesji. Wykorzystaj te informacje, aby:
odpowiednio skonfigurować mechanizm odtwarzania multimediów.
Jeśli mechanizm odtwarzania nie obsługuje jakiegoś parametru, jak najlepiej emulować oczekiwane działanie. Jeśli na przykład podczas odtwarzania mechanizm nie obsługuje 2-krotnej szybkości przewijania, użyj powtarzających się przewijania w trakcie odtwarzania prawie dwukrotnie.
Po skonfigurowaniu parametrów nie zmieniaj tych ustawień, chyba że użytkownik generuje polecenie odtwarzania, które wymaga innego parametru lub przełączników na nowy kanał.