Используйте 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 см. раздел «Создание службы ввода ТВ с помощью библиотеки 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() . Однако, если пользователь просматривает контент, превышающий объем, который может записать ваше приложение, вам необходимо начать запись нового сегмента для отложенного воспроизведения и соответствующим образом обновить начальное время.
Текущее положение записи со сдвигом во времени — это текущая позиция воспроизведения в миллисекундах с начала эпохи. Это положение непрерывно изменяется во время воспроизведения. Как правило, вы можете определить это значение с помощью вашего механизма воспроизведения, как показано в следующем примере:
Котлин
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 , содержащий параметры для текущей сессии. Используйте эту информацию для соответствующей настройки механизма воспроизведения мультимедиа.
Если ваш механизм воспроизведения не поддерживает какой-либо параметр, постарайтесь максимально точно имитировать ожидаемое поведение. Например, если ваш механизм воспроизведения не поддерживает двукратную скорость, используйте повторные операции перемотки, чтобы добиться приблизительно удвоенной скорости воспроизведения.
После установки параметров не изменяйте настройки, за исключением случаев, когда пользователь отдает команду воспроизведения, требующую других параметров, или переключается на новый канал.
,Используйте 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 см. раздел «Создание службы ввода ТВ с помощью библиотеки 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() . Однако, если пользователь просматривает контент, превышающий объем, который может записать ваше приложение, вам необходимо начать запись нового сегмента для отложенного воспроизведения и соответствующим образом обновить начальное время.
Текущее положение записи со сдвигом во времени — это текущая позиция воспроизведения в миллисекундах с начала эпохи. Это положение непрерывно изменяется во время воспроизведения. Как правило, вы можете определить это значение с помощью вашего механизма воспроизведения, как показано в следующем примере:
Котлин
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 , содержащий параметры для текущей сессии. Используйте эту информацию для соответствующей настройки механизма воспроизведения мультимедиа.
Если ваш механизм воспроизведения не поддерживает какой-либо параметр, постарайтесь максимально точно имитировать ожидаемое поведение. Например, если ваш механизм воспроизведения не поддерживает двукратную скорость, используйте повторные операции перемотки, чтобы добиться приблизительно удвоенной скорости воспроизведения.
После установки параметров не изменяйте настройки, за исключением случаев, когда пользователь отдает команду воспроизведения, требующую других параметров, или переключается на новый канал.
,Используйте 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 см. раздел «Создание службы ввода ТВ с помощью библиотеки 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() . Однако, если пользователь просматривает контент, превышающий объем, который может записать ваше приложение, вам необходимо начать запись нового сегмента для отложенного воспроизведения и соответствующим образом обновить начальное время.
Текущее положение записи со сдвигом во времени — это текущая позиция воспроизведения в миллисекундах с начала эпохи. Это положение непрерывно изменяется во время воспроизведения. Как правило, вы можете определить это значение с помощью вашего механизма воспроизведения, как показано в следующем примере:
Котлин
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 , содержащий параметры для текущей сессии. Используйте эту информацию для соответствующей настройки механизма воспроизведения мультимедиа.
Если ваш механизм воспроизведения не поддерживает какой-либо параметр, постарайтесь максимально точно имитировать ожидаемое поведение. Например, если ваш механизм воспроизведения не поддерживает двукратную скорость, используйте повторные операции перемотки, чтобы добиться приблизительно удвоенной скорости воспроизведения.
После установки параметров не изменяйте настройки, за исключением случаев, когда пользователь отдает команду воспроизведения, требующую других параметров, или переключается на новый канал.
,Используйте 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 см. раздел «Создание службы ввода ТВ с помощью библиотеки 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() . Однако, если пользователь просматривает контент, превышающий объем, который может записать ваше приложение, вам необходимо начать запись нового сегмента для отложенного воспроизведения и соответствующим образом обновить начальное время.
The current position of a time-shifting recording is the current playback position, in milliseconds since the epoch. This position changes continuously during playback. Typically, you can use your playback engine to determine this value, as shown in the following example:
Котлин
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; }
Ensure that the start time you provide when the system calls your onTimeShiftGetStartPosition() is never greater than the current time position you provide in onTimeShiftGetCurrentPosition() . The system uses these calls to update the time-shifting duration in the playback controls UI.
Support playback parameters
To change playback speed during time-shifting, the system uses playback parameters. For example, if the user decides to rewind the current playback, new playback parameters are passed to your app with a negative playback speed. Time-shifting also supports several different levels, 2x or 3x, of playback speed for rewinding or fast-forwarding.
The system calls your onTimeShiftSetPlaybackParams(PlaybackParams) method with a PlaybackParams object that contains parameters for the current session. Use this information to configure your media playback engine appropriately.
If your playback engine does not support a parameter, emulate the expected behavior as best you can. For example, if your playback engine doesn't support 2x speed, use repeated seek operations on your playback engine to achieve an approximately double playback speed.
After the parameters are set, don't change the settings unless the user either issues a playback command that requires a different parameter or switches to a new channel.