Используйте API сдвига во времени в сервисе ввода ТВ, чтобы пользователи могли приостанавливать, перематывать назад и вперед прямые трансляции на каналах вашего сервиса. Если ваше приложение поддерживает сдвиг во времени, у пользователей появляется больше возможностей для просмотра контента:
- Пользователи могут приостанавливать воспроизведение программ во время кратковременной паузы, чтобы не пропустить ключевые моменты.
- Пользователи могут перематывать контент, который они уже видели или который им не интересен.
- Пользователи могут перематывать и пересматривать любимые моменты в программах.
Сдвиг во времени использует короткие временные записанные сегменты данных программы, чтобы реализовать возможность воспроизведения программ в прямом эфире. Пользователи не могут воспроизводить такие записи вне текущего сеанса воспроизведения. Это означает, что они не могут использовать сдвиг по времени, чтобы приостановить программу и посмотреть ее на следующий день или посмотреть позже, переключившись на другой канал.
Если вы хотите, чтобы пользователи могли записывать программы и смотреть их позже, используйте API для записи ТВ-контента.
Добавьте поддержку сдвига по времени
Чтобы добавить поддержку сдвига во времени в сервис ТВ-входа, необходимо реализовать API сдвига во времени в классе TvInputService.Session, настроить запись и воспроизведение записей со сдвигом во времени в приложении и уведомить систему о том, что сервис ТВ-входа поддерживает сдвиг во времени.
Вам нужно реализовать следующие методы TvInputService.Session:
onTimeShiftGetCurrentPosition()– вызывается системой для получения текущей позиции воспроизведения в миллисекундах. Подробную информацию вы найдете в разделе Отслеживание времени воспроизведения.onTimeShiftGetStartPosition(): вызывается системой для получения начальной позиции текущей записи со сдвигом по времени в миллисекундах. Подробнее об этом рассказывается в разделе Отслеживание времени воспроизведения.onTimeShiftPause()– вызывается, когда пользователь приостанавливает воспроизведение.onTimeShiftResume()– вызывается, когда пользователь возобновляет воспроизведение.onTimeShiftSeekTo(long): вызывается, когда системе нужно перейти к новой временной позиции. Обычно новая позиция находится между начальной и текущей.onTimeShiftSetPlaybackParams(PlaybackParams): вызывается системой для предоставления параметров воспроизведения, таких как скорость воспроизведения, для текущего сеанса. Подробную информацию вы найдете в разделе Поддержка параметров воспроизведения.
Дополнительную информацию о том, как сообщить системе, что ваш сервис ввода поддерживает сдвиг по времени, можно найти в разделе Уведомление системы о статусе сдвига по времени.
Если вы используете библиотеку TIF Companion Library для реализации класса TvInputService.Session, то автоматически получаете реализацию сдвига во времени, в которой используется ExoPlayer. Вы можете использовать эту реализацию или переопределить методы API для сдвига во времени в BaseTvInputService.Session и предоставить собственную реализацию. Подробнее о том, как создать сервис ввода ТВ с помощью TIF Companion Library…
Запись контента при запуске сеанса
Пользователь может приостанавливать, перематывать вперед и назад контент программы, используя элементы управления воспроизведением для канала. Для этого нужно нажать Выбрать во время просмотра контента и перейти к элементам управления воспроизведением или использовать специальные элементы управления воспроизведением на удаленном устройстве.
Поскольку пользователь может в любой момент воспользоваться сдвигом во времени, ваш сервис ТВ-входа должен начать запись контента, как только пользователь переключится на канал в вашей реализации 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().
Однако если пользователь смотрит контент дольше, чем может записать ваше приложение, вам нужно начать запись нового сегмента для сдвига по времени и соответствующим образом обновить время начала.
Текущая позиция записи со сдвигом во времени – это текущая позиция воспроизведения в миллисекундах с начала эпохи. Эта позиция постоянно меняется во время воспроизведения. Обычно это значение можно определить с помощью механизма воспроизведения, как показано в примере ниже.
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; }
Убедитесь, что время начала, которое вы указываете, когда система вызывает onTimeShiftGetStartPosition(), не превышает текущую позицию времени, указанную в onTimeShiftGetCurrentPosition().
Система использует эти вызовы, чтобы обновить длительность сдвига по времени в интерфейсе элементов управления воспроизведением.
Поддержка параметров воспроизведения
Чтобы изменить скорость воспроизведения во время сдвига по времени, система использует параметры воспроизведения. Например, если пользователь решит перемотать текущее воспроизведение, в ваше приложение будут переданы новые параметры воспроизведения с отрицательной скоростью воспроизведения. При перемотке назад или вперед можно выбрать скорость воспроизведения (2x или 3x).
Система вызывает метод onTimeShiftSetPlaybackParams(PlaybackParams) с объектом PlaybackParams, который содержит параметры текущего сеанса. Используйте эту информацию, чтобы правильно настроить механизм воспроизведения медиаконтента.
Если ваш проигрыватель не поддерживает какой-либо параметр, постарайтесь как можно точнее сымитировать ожидаемое поведение. Например, если ваш проигрыватель не поддерживает двойную скорость, используйте повторяющиеся операции поиска, чтобы добиться примерно двойной скорости воспроизведения.
После того как параметры заданы, не меняйте настройки, пока пользователь не выполнит команду воспроизведения, требующую другого параметра, или не переключится на новый канал.