Obsługa przesuwania w czasie

Korzystaj z interfejsów API do przesuwania w czasie w usłudze wejściowej TV, aby umożliwić użytkownikom wstrzymywanie i przewijanie programów na żywo w Twoich kanałach usług oraz przewijanie do przodu. Jeśli aplikacja obsługuje przesuwanie w czasie, użytkownicy zyskują elastyczność w sposobie oglądania treści:

  • Użytkownicy mogą wstrzymywać programy podczas wykonywania krótkotrwałych przerw, aby nigdy nie przegapić kluczowych momentów.
  • Użytkownicy mogą przewijać treści, które już widzieli, lub te, które ich nie interesują.
  • Użytkownicy mogą przewijać ulubione momenty do tyłu i oglądać je ponownie.

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 w celu zaimplementowania możliwości odtwarzania programów na żywo. Użytkownicy nie mogą odtwarzać tych nagrań z przesunięciem w czasie poza bieżącą sesją odtwarzania. Oznacza to, że nie mogą użyć przesunięcia w czasie, aby wstrzymać program, aby obejrzeć go następnego dnia, ani wstrzymać programu, aby obejrzeć go później.

Jeśli chcesz zezwolić użytkownikom na nagrywanie treści programu do oglądania poza bieżącą sesją odtwarzania, użyj interfejsów API do nagrywania filmów telewizyjnych.

Dodaj obsługę przesuwania w czasie

Aby dodać obsługę przesunięcia w czasie do usługi wejścia TV, musisz wdrożyć w klasie TvInputService.Session interfejsy API do przesuwania w czasie, umożliwić rejestrowanie i odtwarzanie nagrań z przesuwaniem w czasie w aplikacji oraz powiadomić system, że Twoja usługa wprowadzania obsługuje przesuwanie w czasie.

Wdrażane przez Ciebie metody TvInputService.Session to:

Więcej informacji o tym, jak poinformować system, że usługa wejściowa obsługuje przesunięcie w czasie, znajdziesz w sekcji Powiadom system o stanie przesunięcia w czasie.

Jeśli implementujesz klasę TvInputService.Session za pomocą biblioteki towarzyszącej TIF, automatycznie uzyskujesz implementację przesuwania w czasie wykorzystującą ExoPlayer. Możesz użyć tej implementacji lub zastąpić w BaseTvInputService.Session metody interfejsu API przesuwania w czasie i udostępnić własną implementację. Więcej informacji o używaniu biblioteki towarzyszącej TIF znajdziesz w artykule Tworzenie usługi wprowadzania danych TV przy użyciu biblioteki towarzyszącej TIF.

Nagrywanie treści po rozpoczęciu sesji

Użytkownik może wstrzymywać oraz przewijać materiały do przodu i do tyłu, korzystając z 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 dedykowanych elementów sterujących odtwarzaniem na urządzeniu zdalnym.

Podczas oglądania treści programu użytkownik może w dowolnym momencie użyć przesunięcia w czasie, dlatego Twoja usługa wprowadzania danych na telewizorze musi rozpocząć nagrywanie treści z przesunięciem w czasie, gdy tylko użytkownik przejdzie na kanał w Twojej onTune() implementacji. Musisz też poinformować system, że możesz nagrywać, wywołując funkcję notifyTimeShiftStatusChanged(int) zgodnie z opisem w sekcji Powiadom system o stanie przesunięcia w czasie.

Zarządzanie miejscem na zarejestrowane treści

Usługa wejścia na telewizor odpowiada za przechowywanie nagrań z przesunięciem w czasie w prywatnej pamięci aplikacji i odtwarzanie treści, gdy system wywoła metodę przesuwania w czasie, np. onTimeShiftResume(). Jeśli Twoje treści są już przechowywane w chmurze, a aplikacja może zarządzać nagraniami z przesunięciem w czasie, możesz skorzystać z pamięci w chmurze, a nie z pamięci aplikacji.

Jeśli Twoje materiały zawierają treści chronione, to usługa wejścia TV odpowiada za prawidłowe szyfrowanie nagranych treści i odszyfrowywanie ich podczas odtwarzania.

Ponieważ nagrane treści wideo mogą wymagać dużej ilości miejsca, musisz ostrożnie zarządzać nagranymi treściami podczas odtwarzania sesji. Jeśli czas sesji odtwarzania przekracza czas, który można nagrać i zapisać w celu przesunięcia w czasie, dostosuj nagranie z przesunięciem w czasie, aby zachować bieżący bufor, ale upewnić się, że obecny czas zostanie zarejestrowany. Jeśli np. użytkownik odtwarza treści od 31 minut, a maksymalny rozmiar nagrania z przesuwaniem w czasie to 30 minut, dostosuj nagranie i czas rozpoczęcia tak, aby obejmowało treści od 1 do 31 minuty.

Jeśli Twoja usługa wejścia TV nie obsługuje przesunięcia czasu z powodu braku miejsca, musisz poinformować o tym system. Więcej informacji o tym, jak powiadamiać system o ograniczeniach obsługi przesuwania w czasie, znajdziesz w sekcji Powiadom system o stanie przesunięcia w czasie.

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

Powiadom system o stanie przesunięcia w czasie

Jeśli Twoja usługa wejścia TV obsługuje przesunięcie w czasie, wywołaj w implementacji onTune() funkcję notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE), gdy użytkownik dostraja kanał.

Aby poinformować system o ewentualnych zmianach funkcji usługi wejściowej w czasie, użyj funkcji notifyTimeShiftStatusChanged(int). Jeśli na przykład usługa wejścia TV nie obsługuje przesunięcia w czasie z powodu ograniczeń miejsca na dane lub z innych przyczyn, wywołaj notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE).

Jeśli Twoja usługa wejścia TV w ogóle nie obsługuje przesunięcia w czasie, wywołaj notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) po utworzeniu sesji odtwarzania. System traktuje każdą usługę wejściową, która nigdy nie wywołuje notifyTimeShiftStatusChanged(), jako usługi wejściowej, która nie obsługuje przesuwania w czasie. Obejmuje to usługi wejściowe korzystające z interfejsu API na poziomie 22 i wcześniejszych.

Śledzenie czasów odtwarzania

Pozycja początkowa nagrania z przesuwaniem w czasie to najwcześniejsza bezwzględna pozycja czasu (w milisekundach od początku epoki), o którą użytkownik może przewinąć. Zwykle jest to czas, w którym odtwarzanie filmu rozpoczyna się po wywołaniu funkcji onTune(). Jeśli jednak użytkownik obejrzy ilość treści przekraczającą to, co może zarejestrować aplikacja, musisz zacząć rejestrować nowy segment na potrzeby przesunięcia 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). Pozycja zmienia się stale w trakcie odtwarzania. Zwykle do określenia tej wartości możesz użyć silnika 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 metodę onTimeShiftGetStartPosition(), nie może być późniejsza niż bieżąca pozycja czasowa podana w polu onTimeShiftGetCurrentPosition(). System używa tych wywołań do aktualizowania czasu 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 używa parametrów odtwarzania. Jeśli na przykład użytkownik zdecyduje się przewinąć odtwarzanie do tyłu, do aplikacji zostaną przekazane nowe parametry odtwarzania z ujemną szybkością odtwarzania. Ponadto przesunięcie w czasie obsługuje kilka różnych poziomów szybkości odtwarzania – 2x lub 3 razy.

System wywołuje metodę onTimeShiftSetPlaybackParams(PlaybackParams) za pomocą obiektu PlaybackParams, który zawiera parametry bieżącej sesji. Wykorzystaj te informacje, aby odpowiednio skonfigurować mechanizm odtwarzania multimediów.

Jeśli Twój mechanizm odtwarzania nie obsługuje danego parametru, jak najlepiej wykonaj emulację oczekiwanego działania. Jeśli na przykład Twój mechanizm odtwarzania nie obsługuje szybkości dwukrotnej, wykonaj te same operacje przewijania, co pozwoli uzyskać około 2-krotnie większą szybkość odtwarzania.

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