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.
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:
onTimeShiftGetCurrentPosition()
: que llama el sistema para obtener el valor posición de reproducción en milisegundos. Para obtener más detalles, consulta la En la sección Realiza el seguimiento de los tiempos de la reproducción.onTimeShiftGetStartPosition()
: que el sistema llama para obtener la posición de la grabación con pausa en directo actual en milisegundos. Para obtener más detalles, consulta la sección Cómo realizar el seguimiento de los tiempos de la reproducción.onTimeShiftPause()
: se llama cuando el usuario pausa la reproducción.onTimeShiftResume()
: se llama cuando el usuario reanuda la reproducción.onTimeShiftSeekTo(long)
: llamado cuando el sistema necesita buscar un nuevo horario. Normalmente, la nueva posición se encuentra entre el la posición de inicio y la posición actual.onTimeShiftSetPlaybackParams(PlaybackParams)
: que llama el sistema Para proporcionar parámetros de reproducción (como la velocidad de reproducción) de la sesión actual Para obtener más detalles, consulta la Sección Cómo admitir parámetros de reproducción
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.