Compatibilidad con time-shifting

Usa las APIs de pausa en directo en tu servicio de entrada de TV para permitir que los usuarios pausen, retrocedan y adelantar programas en vivo en tus canales de servicio. Si la app admite la pausa en directo, los usuarios obtienen flexibilidad a la hora de ver tu contenido:

  • Los usuarios pueden pausar programas mientras controlan una interrupción a corto plazo. nunca se pierden los momentos clave.
  • Los usuarios pueden adelantar el contenido que ya vieron o que que no les interesa.
  • Pueden retroceder o volver a mirar sus momentos favoritos del contenido del programa.

Figura 1: Controles de reproducción de Android TV para pausa en directo

La pausa en directo usa segmentos cortos, temporales y grabados de datos del programa para implementar la capacidad de reproducir programas en vivo. Los usuarios no pueden reproducir esta pausa fuera de la sesión de reproducción actual. Esto significa que no pueden usar la pausa en directo para pausar un programa y verlo al día siguiente, o pausarlo para mirar más tarde mientras cambian de canal.

Si quieres, usa las APIs de grabación de TV. Para permitir que los usuarios graben contenido de programas para mirarlo fuera de la reproducción actual sesión.

Cómo agregar compatibilidad con la pausa en directo

Para agregar compatibilidad con la pausa en directo a tu servicio de entrada de TV, debes implementar el APIs de pausa en directo en tu clase TvInputService.Session, administrar la grabación y reproducción de grabaciones con pausa en directo en tu app, y notificar al sistema que tu servicio de entrada admite pausa en directo.

Los métodos TvInputService.Session que implementas son los siguientes: lo siguiente:

Si deseas obtener más información para informar al sistema que tu servicio de entrada admite pausa en directo, consulta la Cómo notificar al sistema sobre el estado de la pausa en directo sección.

Si usas la Biblioteca complementaria del TIF para implementar tu TvInputService.Session, obtendrás automáticamente una implementación de pausa en directo que usa ExoPlayer. Puedes usar esta implementar o anular los métodos de la API de pausa en directo en BaseTvInputService.Session y proporciona el tuyo para implementarlos. Para obtener más información sobre el uso de la Biblioteca complementaria del TIF, consulta Cómo crear un servicio de entrada de TV con la Biblioteca complementaria del TIF.

Cómo grabar contenido cuando comienza una sesión

Un usuario puede pausar, retroceder y adelantar el contenido del programa accediendo al controles de reproducción del canal, ya sea presionando Seleccionar mientras mirar contenido y navegar a los controles de reproducción, o bien usar controles de reproducción dedicados en un dispositivo remoto.

Como el usuario puede usar la pausa en directo en cualquier momento mientras miras contenido de programas, tu TV el servicio de entrada debe comenzar a grabar el contenido con pausa en directo ni bien el usuario las melodías en un canal de tu onTune() para implementarlos. También debes informa al sistema que puedes grabar llamando notifyTimeShiftStatusChanged(int), como se describe en el Cómo notificar al sistema sobre el estado de la pausa en directo sección.

Cómo administrar el almacenamiento de contenido grabado

Tu servicio de entrada de TV se encarga de almacenar las grabaciones con pausa en directo en el almacenamiento privado de tu app y la reproducción de contenido cuando llama el sistema tus métodos de pausa en directo, como onTimeShiftResume() Si tu contenido ya está almacenado en la nube y tu app puede administrar grabaciones con pausa en directo en la nube, puedes usar el almacenamiento en la nube de almacenamiento de apps.

Si tu contenido usa contenido protegido, tu servicio de entrada de TV es responsable de lo siguiente: la encriptación adecuada del contenido grabado y la desencriptación del contenido durante reproducción.

Dado que el contenido de video grabado puede requerir mucho almacenamiento, debes hacer lo siguiente: administrar cuidadosamente el contenido grabado durante la reproducción de una sesión. Si la reproducción tiempo de la sesión supera la cantidad de tiempo que puedes grabar y almacenar pausa en directo, ajusta la grabación con pausa en directo para mantener búfer actual, pero asegúrate de que se capture la hora actual. Por ejemplo, si el usuario ha estado reproduciendo contenido por 31 minutos y tu grabación con pausa en directo máxima es de 30 minutos, ajusta la grabación y el tiempo de inicio para que contenido desde el minuto 1 hasta el minuto 31.

Si el servicio de entrada de TV no admite la pausa en directo debido a la falta de debes informar al sistema. Para obtener más detalles sobre cómo notificar sistema operativo sobre restricciones de compatibilidad con la pausa en directo, consulta el Cómo notificar al sistema sobre el estado de la pausa en directo sección.

Cuando el usuario cambia a un canal diferente o finaliza la reproducción. borra los datos grabados de la pausa en directo.

Cómo notificar al sistema sobre el estado de la pausa en directo

Si el servicio de entrada de TV admite la pausa en directo, llama notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) en tu implementación de onTune() cuando un usuario sintoniza a un canal.

Para informar al sistema si hay capacidades de pausa en directo de tu servicio de entrada cambiar, usar notifyTimeShiftStatusChanged(int) Por ejemplo, si tu servicio de entrada de TV no admite la pausa en directo debido a restricciones de espacio de almacenamiento u otras razones, llama notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE)

Si el servicio de entrada de TV no admite la pausa en directo, llama notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) Cuando se crea una sesión de reproducción. El sistema trata cualquier servicio de entrada nunca llama notifyTimeShiftStatusChanged() como un servicio de entrada que no puede admiten la pausa en directo. Esto abarca los servicios de entrada que usan el nivel de API 22 y anteriormente.

Cómo realizar el seguimiento de los tiempos de la reproducción

La posición de inicio de una grabación con pausa en directo es el tiempo absoluto más antiguo posición, en milisegundos desde el ciclo de entrenamiento, a la que el usuario puede buscar. Este es generalmente el tiempo en el que se inicia la reproducción de video después de Se llama a onTune(). Sin embargo, cuando el usuario mira una cantidad de contenido que supera el que la app pueda grabar, debes comenzar a grabar un segmento nuevo para y actualizar la hora de inicio según corresponda.

La posición actual de una grabación con pausa en directo es la reproducción actual posición, en milisegundos desde el ciclo de entrenamiento. Esta posición cambia continuamente durante la reproducción. Por lo general, puedes usar tu motor de reproducción para determinar de salida, como se muestra en el siguiente ejemplo:

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;
}

Asegúrate de que la hora de inicio que proporciones cuando el sistema llame a tu onTimeShiftGetStartPosition() nunca sea mayor que la posición de tiempo actual que proporciones en onTimeShiftGetCurrentPosition() El sistema usa estas llamadas para Actualizar la duración de la pausa en directo en la IU de controles de reproducción

Cómo agregar compatibilidad con los parámetros de reproducción

Para cambiar la velocidad de reproducción durante la pausa en directo, el sistema usa parámetros de reproducción. Para Por ejemplo, si el usuario decide retroceder la reproducción actual, la reproducción nueva se pasan parámetros a tu app con una velocidad de reproducción negativa. La pausa en directo también admite varios niveles de velocidad de reproducción 2 o 3x diferentes para retroceder o adelantar.

El sistema llama a tu onTimeShiftSetPlaybackParams(PlaybackParams) con un objeto PlaybackParams que contiene parámetros para la sesión actual. Usa esta información para configurar correctamente el motor de reproducción de contenido multimedia.

Si tu motor de reproducción no admite un parámetro, emular el comportamiento esperado de la mejor manera posible. Por ejemplo, si la reproducción El motor no admite el doble de velocidad, usa operaciones de búsqueda repetidas en la reproducción. para lograr una velocidad de reproducción aproximadamente doble.

Después de establecer los parámetros, no cambies la configuración, a menos que el usuario Emite un comando de reproducción que requiere un parámetro o cambios diferentes. a un canal nuevo.