Obsługa przesuwania w czasie

Użyj interfejsów API do przesuwania w czasie w usłudze wprowadzania TV, aby umożliwić użytkownikom wstrzymywanie, przewijanie do tyłu i przewijanie do przodu programów na żywo w kanałach usługi. Jeśli Twoja aplikacja obsługuje przesuwanie w czasie, użytkownicy zyskują większą elastyczność w sposobie oglądania treści:

  • Użytkownicy mogą wstrzymywać programy, gdy muszą na chwilę przerwać oglądanie, dzięki czemu nie przegapią ważnych momentów.
  • Użytkownicy mogą przewijać do przodu treści, które już widzieli, lub treści, które nie interesują.
  • Użytkownicy mogą przewijać do tyłu i ponownie oglądać ulubione momenty w programie.
Rysunek 1. Elementy sterujące odtwarzaniem w Androidzie TV używane do przesuwania w czasie.

Przesuwanie w czasie wykorzystuje krótkie, tymczasowe, nagrane segmenty danych programu, aby umożliwić odtwarzanie programów na żywo. Użytkownicy nie mogą odtwarzać tych nagrań poza bieżącą sesją odtwarzania. Oznacza to, że nie mogą używać przesuwania w czasie, aby wstrzymać program i obejrzeć go następnego dnia, ani wstrzymać programu i obejrzeć go później, gdy przełączą się na inny kanał.

Jeśli chcesz umożliwić użytkownikom nagrywanie treści programu, aby mogli je oglądać poza bieżącą sesją odtwarzania , użyj interfejsów API do nagrywania TV.

Dodawanie obsługi przesuwania w czasie

Aby dodać obsługę przesuwania w czasie do usługi wprowadzania TV, musisz zaimplementować interfejsy API do przesuwania w czasie w klasie TvInputService.Session, obsługiwać nagrywanie i odtwarzanie nagrań z przesunięciem w czasie w aplikacji oraz powiadomić system, że Twoja usługa wprowadzania obsługuje przesuwanie w czasie.

Metody TvInputService.Session, które musisz zaimplementować, to:

Więcej informacji o tym, jak poinformować system, że Twoja usługa wprowadzania obsługuje przesuwanie w czasie, znajdziesz w sekcji Powiadamianie systemu o stanie przesuwania w czasie.

Jeśli do implementacji klasy TvInputService.Session używasz biblioteki TIF Companion, automatycznie uzyskasz implementację przesuwania w czasie, która korzysta z ExoPlayera. Możesz użyć tej implementacji lub zastąpić metody interfejsu API do przesuwania w czasie w BaseTvInputService.Session i podać własną implementację. Więcej informacji o korzystaniu z biblioteki TIF Companion znajdziesz w artykule Tworzenie usługi wprowadzania TV za pomocą biblioteki TIF Companion.

Nagrywanie treści po rozpoczęciu sesji

Użytkownik może wstrzymywać, przewijać do tyłu i przewijać do przodu treści programu, uzyskując dostęp do elementów sterujących odtwarzaniem kanału. Może to zrobić, naciskając Wybierz podczas oglądania treści, a następnie przechodząc do elementów sterujących odtwarzaniem, lub używając specjalnych elementów sterujących odtwarzaniem na urządzeniu zdalnym.

Ponieważ użytkownik może używać przesuwania w czasie w dowolnym momencie podczas oglądania treści programu, usługa wprowadzania TV musi rozpocząć nagrywanie treści z przesunięciem w czasie, gdy tylko użytkownik przełączy się na kanał w implementacji onTune(). Musisz też poinformować system, że możesz nagrywać, wywołując notifyTimeShiftStatusChanged(int), jak opisano w sekcji Powiadamianie systemu o stanie przesuwania w czasie.

Zarządzanie miejscem na nagrane treści

Usługa wprowadzania TV jest odpowiedzialna za przechowywanie nagrań z przesunięciem w czasie w prywatnym miejscu na dane aplikacji i odtwarzanie treści, gdy system wywołuje metody przesuwania w czasie, takie jak onTimeShiftResume(). Jeśli Twoje treści są już przechowywane w chmurze, a Twoja aplikacja może zarządzać nagraniami z przesunięciem w czasie w chmurze, możesz użyć miejsca na dane w chmurze zamiast miejsca na dane aplikacji.

Jeśli Twoje treści korzystają z treści chronionych, usługa wprowadzania TV jest odpowiedzialna za prawidłowe szyfrowanie nagranych treści i odszyfrowywanie treści podczas odtwarzania.

Ponieważ nagrane treści wideo mogą wymagać dużej ilości miejsca na dane, musisz starannie zarządzać nagranymi treściami podczas sesji odtwarzania. Jeśli czas sesji odtwarzania przekracza czas, który możesz nagrać i przechowywać na potrzeby przesuwania w czasie, dostosuj nagrywanie z przesunięciem w czasie, aby zachować bieżący bufor, ale upewnij się, że bieżący czas jest rejestrowany. Jeśli na przykład użytkownik odtwarza treści przez 31 minut, a maksymalny rozmiar nagrania z przesunięciem w czasie wynosi 30 minut, dostosuj nagranie i czas rozpoczęcia, aby zawierało treści od 1 do 31 minuty.

Jeśli usługa wprowadzania TV nie może obsługiwać przesuwania w czasie z powodu braku miejsca na dane, musisz poinformować o tym system. Więcej informacji o tym, jak powiadomić system o ograniczeniach obsługi przesuwania w czasie, znajdziesz w sekcji Powiadamianie systemu o stanie przesuwania w czasie.

Gdy użytkownik przełączy się na inny kanał lub w inny sposób zakończy sesję odtwarzania, usuń nagrane dane z przesunięciem w czasie.

Powiadamianie systemu o stanie przesuwania w czasie

Jeśli Twoja usługa wprowadzania TV obsługuje przesuwanie w czasie, wywołaj notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) w implementacji onTune(), gdy użytkownik przełączy się na kanał.

Aby poinformować system o zmianach w funkcjach przesuwania w czasie w usłudze wprowadzania, użyj notifyTimeShiftStatusChanged(int). Jeśli na przykład usługa wprowadzania TV nie może obsługiwać przesuwania w czasie z powodu ograniczeń miejsca na dane lub innych przyczyn, wywołaj notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE).

Jeśli usługa wprowadzania TV w ogóle nie obsługuje przesuwania w czasie, wywołaj notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) podczas tworzenia sesji odtwarzania. System traktuje każdą usługę wprowadzania, która nigdy nie wywołuje notifyTimeShiftStatusChanged(), jako usługę, która nie obsługuje przesuwania w czasie. Dotyczy to usług wprowadzania korzystających z poziomu API 22 i starszych.

Śledzenie czasu odtwarzania

Pozycja początkowa nagrania z przesunięciem w czasie to najwcześniejsza pozycja czasu bezwzględnego w milisekundach od początku epoki, do której użytkownik może przejść. Zwykle jest to czas rozpoczęcia odtwarzania filmu po wywołaniu onTune(). Gdy jednak użytkownik obejrzy ilość treści przekraczającą to, co Twoja aplikacja może nagrać, musisz rozpocząć nagrywanie nowego segmentu na potrzeby przesuwania w czasie i odpowiednio zaktualizować czas rozpoczęcia.

Bieżąca pozycja nagrania z przesunięciem w czasie to bieżąca pozycja odtwarzania w milisekundach od początku epoki. Ta pozycja zmienia się nieustannie podczas odtwarzania. Zwykle możesz użyć silnika odtwarzania, aby określić tę wartość, jak pokazano 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 czas rozpoczęcia podany podczas wywołania przez system onTimeShiftGetStartPosition() nigdy nie jest większy niż bieżąca pozycja czasu podana w onTimeShiftGetCurrentPosition(). System używa tych wywołań do aktualizowania czasu trwania przesuwania w czasie w interfejsie elementów sterujących odtwarzaniem.

Obsługa parametrów odtwarzania

Aby zmienić szybkość odtwarzania podczas przesuwania w czasie, system używa parametrów odtwarzania. Jeśli na przykład użytkownik zdecyduje się przewinąć bieżące odtwarzanie do tyłu, do Twojej aplikacji zostaną przekazane nowe parametry odtwarzania z ujemną szybkością odtwarzania. Przesuwanie w czasie obsługuje też kilka różnych poziomów szybkości odtwarzania (2x lub 3x) podczas przewijania do tyłu lub do przodu.

System wywołuje metodę onTimeShiftSetPlaybackParams(PlaybackParams) z obiektem PlaybackParamsktóry zawiera parametry bieżącej sesji. Użyj tych informacji, aby odpowiednio skonfigurować silnik odtwarzania multimediów.

Jeśli silnik odtwarzania nie obsługuje parametru, spróbuj jak najlepiej naśladować oczekiwane działanie. Jeśli na przykład silnik odtwarzania nie obsługuje szybkości 2x, użyj powtarzających się operacji wyszukiwania w silniku odtwarzania, aby uzyskać w przybliżeniu dwukrotną szybkość odtwarzania.

Po ustawieniu parametrów nie zmieniaj ustawień, chyba że użytkownik wyda polecenie odtwarzania, które wymaga innego parametru, lub przełączy się na nowy kanał.