Поддержка смещения во времени

Используйте API-интерфейсы сдвига во времени в своей службе ТВ-ввода, чтобы пользователи могли приостанавливать, перематывать и перематывать прямые трансляции на ваших каналах обслуживания. Если ваше приложение поддерживает сдвиг во времени, пользователи получают гибкость в просмотре вашего контента:

  • Пользователи могут приостанавливать программы, обрабатывая кратковременные прерывания, поэтому они никогда не пропустят ключевые моменты.
  • Пользователи могут быстро просматривать контент, который они уже видели, или контент, который их не интересует.
  • Пользователи могут перематывать и пересматривать понравившиеся моменты из контента программы.

Рис. 1. Элементы управления воспроизведением Android TV, используемые для смещения во времени.

При сдвиге во времени используются короткие временные записанные сегменты программных данных для реализации возможности воспроизведения программ в реальном времени. Пользователи не могут воспроизводить эти записи со сдвигом во времени за пределами текущего сеанса воспроизведения. Это означает, что они не могут использовать сдвиг времени, чтобы приостановить программу для просмотра на следующий день или приостановить программу для просмотра позже, пока они переключаются на другой канал.

Используйте API-интерфейсы записи ТВ , если вы хотите, чтобы ваши пользователи могли записывать контент программы для просмотра вне текущего сеанса воспроизведения.

Добавьте поддержку смещения во времени

Чтобы добавить поддержку смещения во времени в вашу службу ввода ТВ, вам необходимо реализовать API-интерфейсы смещения во времени в вашем классе TvInputService.Session , обрабатывать запись и воспроизведение записей со сдвигом во времени в вашем приложении и уведомлять систему о том, что ваша служба ввода предоставляет поддержка смещения во времени.

Реализуемые вами методы TvInputService.Session следующие:

Дополнительные сведения о том, как сообщить системе о том, что ваша служба ввода поддерживает сдвиг времени, см. в разделе «Уведомление системы о состоянии смещения времени» .

Если вы используете сопутствующую библиотеку TIF для реализации класса TvInputService.Session , вы автоматически получаете реализацию сдвига во времени, использующую ExoPlayer. Вы можете использовать эту реализацию или переопределить методы API со сдвигом во времени в BaseTvInputService.Session и предоставить собственную реализацию. Дополнительные сведения об использовании сопутствующей библиотеки TIF ​​см. в разделе Создание службы телевизионного ввода с помощью сопутствующей библиотеки TIF .

Запись контента при запуске сеанса

Пользователь может приостанавливать, перематывать и перематывать содержимое программы, получив доступ к элементам управления воспроизведением для канала, либо нажав «Выбрать» во время просмотра контента, а затем перейдя к элементам управления воспроизведением, либо используя специальные элементы управления воспроизведением на удаленном устройстве.

Поскольку пользователь может использовать сдвиг во времени в любое время при просмотре контента программы, ваша служба телевизионного ввода должна начать запись контента со сдвигом во времени, как только пользователь настроится на канал в вашей реализации onTune() . Вам также необходимо сообщить системе, что вы можете вести запись, вызвав notifyTimeShiftStatusChanged(int) , как описано в разделе «Уведомление системы о состоянии смещения во времени» .

Управление хранилищем записанного контента

Служба телевизионного ввода отвечает за хранение записей со сдвигом во времени в личном хранилище приложений вашего приложения и воспроизведение контента, когда система вызывает ваши методы смещения во времени, такие как onTimeShiftResume() . Если ваш контент уже хранится в облаке и ваше приложение может управлять записями со сдвигом во времени в облаке, вы можете использовать облачное хранилище вместо хранилища приложений.

Если в вашем контенте используется защищенный контент, ваша служба ТВ-входа отвечает за правильное шифрование записанного контента и дешифрование контента во время воспроизведения.

Поскольку записанное видео может потребовать большого объема памяти, вам необходимо тщательно управлять записанным содержимым во время воспроизведения сеанса. Если время сеанса воспроизведения превышает время, которое вы можете записать и сохранить для смещения во времени, настройте запись со сдвигом во времени, чтобы сохранить текущий буфер, но убедитесь, что текущее время зафиксировано. Например, если пользователь воспроизводил контент в течение 31 минуты, а максимальный размер записи со сдвигом по времени составляет 30 минут, настройте запись и время начала так, чтобы контент содержался от 1 минуты до 31 минуты.

Если ваша служба ТВ-входа не поддерживает сдвиг во времени из-за нехватки памяти, вы должны сообщить об этом системе. Более подробную информацию о том, как уведомить систему об ограничениях поддержки перевода во времени, см. в разделе Уведомление системы о статусе перевода во времени .

Когда пользователь переключается на другой канал или иным образом завершает сеанс воспроизведения, удалите записанные данные со сдвигом во времени.

Уведомлять систему о статусе смещения во времени

Если ваша служба телевизионного ввода поддерживает сдвиг по времени, вызовите notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) в вашей реализации onTune() , когда пользователь настраивается на канал.

Чтобы сообщить системе об изменении каких-либо возможностей сдвига во времени вашей службы ввода, используйте notifyTimeShiftStatusChanged(int) . Например, если ваша служба телевизионного ввода не может поддерживать сдвиг по времени из-за ограничений места для хранения или по другим причинам, вызовите notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE) .

Если ваша служба телевизионного ввода вообще не поддерживает сдвиг во времени, вызовите notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) при создании сеанса воспроизведения. Система рассматривает любую службу ввода, которая никогда не вызывает notifyTimeShiftStatusChanged() как службу ввода, не поддерживающую сдвиг во времени. Сюда входят службы ввода, использующие API уровня 22 и более ранних версий.

Отслеживание времени воспроизведения

Начальная позиция записи со сдвигом во времени — это самая ранняя позиция в абсолютном времени (в миллисекундах с начала эпохи), к которой пользователь может стремиться. Обычно это время, когда воспроизведение видео начинается после вызова onTune() . Однако, когда пользователь просматривает объем контента, превышающий то, что может записать ваше приложение, вам необходимо начать запись нового сегмента для смещения во времени и соответствующим образом обновить время начала.

Текущая позиция записи со сдвигом во времени — это текущая позиция воспроизведения в миллисекундах с начала эпохи. Это положение постоянно меняется во время воспроизведения. Обычно для определения этого значения можно использовать механизм воспроизведения, как показано в следующем примере:

Котлин

override fun onTimeShiftGetCurrentPosition(): Long =
        tvPlayer?.run {
            currentProgram?.let { program ->
                currentPosition + program.startTimeUtcMillis
            }
        } ?: TvInputManager.TIME_SHIFT_INVALID_TIME

Ява

@Override
public long onTimeShiftGetCurrentPosition() {
  if (getTvPlayer() != null && currentProgram != null) {
    return getTvPlayer().getCurrentPosition() +
      currentProgram.getStartTimeUtcMillis();
  }
  return TvInputManager.TIME_SHIFT_INVALID_TIME;
}

Убедитесь, что время начала, которое вы указываете, когда система вызывает ваш onTimeShiftGetStartPosition() никогда не превышает текущую временную позицию, которую вы указываете в onTimeShiftGetCurrentPosition() . Система использует эти вызовы для обновления продолжительности сдвига во времени в пользовательском интерфейсе управления воспроизведением.

Поддержка параметров воспроизведения

Чтобы изменить скорость воспроизведения во время сдвига во времени, система использует параметры воспроизведения. Например, если пользователь решает перемотать текущее воспроизведение, в ваше приложение передаются новые параметры воспроизведения с отрицательной скоростью воспроизведения. Сдвиг во времени также поддерживает несколько различных уровней скорости воспроизведения (2x или 3x) для перемотки назад или вперед.

Система вызывает ваш метод onTimeShiftSetPlaybackParams(PlaybackParams) с объектом PlaybackParams , который содержит параметры для текущего сеанса. Используйте эту информацию для правильной настройки механизма воспроизведения мультимедиа.

Если ваш механизм воспроизведения не поддерживает параметр, как можно лучше смоделируйте ожидаемое поведение. Например, если ваш механизм воспроизведения не поддерживает 2-кратную скорость, используйте повторяющиеся операции поиска в вашем механизме воспроизведения, чтобы добиться примерно удвоенной скорости воспроизведения.

После установки параметров не меняйте настройки, пока пользователь не выдаст команду воспроизведения, требующую другого параметра, или не переключится на новый канал.