Use APIs de time-shifting no seu serviço de entrada de TV para permitir que os usuários pausem, voltem e acelerem programas ao vivo nos canais do serviço. Se o app oferecer suporte a time-shifting, os usuários terão flexibilidade para assistir ao conteúdo:
- Os usuários podem pausar programas ao lidar com uma interrupção de curto prazo para não perderem os momentos importantes.
- Os usuários podem avançar por conteúdos que já viram ou conteúdos que não os interessam.
- Os usuários poderão retroceder e assistir novamente os momentos favoritos no conteúdo do programa.
![](https://developer.android.google.cn/static/images/training/tv/tif/time-shift.png?authuser=7&hl=pt)
Figura 1. Controles de reprodução da Android TV usados para time-shifting.
O Time-shift usa segmentos curtos, temporários e gravados de dados do programa para implementar a capacidade de reproduzir programas ao vivo. Os usuários não podem reproduzir essas gravações com time-shifting fora da sessão de reprodução atual. Isso significa que eles não podem usar a mudança de tempo para pausar um programa para assistir no dia seguinte ou pausar um programa para assistir mais tarde, enquanto mudam para outro canal.
Use as APIs de gravação de TV se quiser permitir que os usuários gravem conteúdo do programa para assistir fora da sessão de reprodução atual.
Adicionar compatibilidade com time-shifting
Para adicionar suporte a time-shifting no seu serviço de entrada de TV, é necessário implementar as
APIs de time-shifting na classe TvInputService.Session
,
processar a gravação e a reprodução de gravações com time-shifting no seu app e notificar
o sistema de que seu serviço de entrada oferece suporte para essa mudança.
Os métodos TvInputService.Session
que você implementa são
os seguintes:
onTimeShiftGetCurrentPosition()
: chamado pelo sistema para identificar a posição de reprodução atual em milissegundos. Para saber mais, consulte a seção Monitorar os tempos de reprodução.onTimeShiftGetStartPosition()
: chamado pelo sistema para descobrir a posição inicial da gravação atual com time-shift em milissegundos. Para saber mais, consulte a seção Monitorar os tempos de reprodução.onTimeShiftPause()
: chamado quando o usuário pausa a reprodução.onTimeShiftResume()
: chamado quando o usuário retoma a reprodução.onTimeShiftSeekTo(long)
: chamado quando o sistema precisa procurar uma nova posição de tempo. Normalmente, a nova posição está entre a posição inicial e a atual.onTimeShiftSetPlaybackParams(PlaybackParams)
: chamado pelo sistema para fornecer parâmetros de reprodução, como a velocidade da reprodução, para a sessão atual. Para ver mais detalhes, consulte a seção Suporte a parâmetros de reprodução.
Para saber mais sobre como informar ao sistema que seu serviço de entrada é compatível com time-shifting, consulte a seção Notificar o sistema sobre o status de time-shifting.
Se você estiver usando a TIF Companion Library para implementar a
classe TvInputService.Session
, você vai receber automaticamente uma
implementação de time-shifting que usa o ExoPlayer. É possível usar essa
implementação ou substituir os métodos da API de time-shifting em
BaseTvInputService.Session
e fornecer sua própria
implementação. Para saber mais sobre como usar a TIF Companion Library, consulte Criar um serviço de entrada de TV usando a TIF Companion Library.
Gravar conteúdo quando uma sessão for iniciada
Um usuário pode pausar, voltar e avançar o conteúdo do programa acessando os controles de reprodução do canal, pressionando Selecionar enquanto assiste ao conteúdo e navegando até os controles de reprodução ou usando controles dedicados de reprodução em um dispositivo remoto.
Como o usuário pode
usar o time-shifting a qualquer momento enquanto assiste ao conteúdo do programa, seu serviço de entrada de TV
precisa começar a gravar o conteúdo de time-shifting assim que o usuário sintonizar um canal na sua
implementação de
onTune()
. Também é necessário
informar ao sistema que você pode gravar chamando
notifyTimeShiftStatusChanged(int)
,
conforme descrito na seção
Notificar o sistema sobre o status de time-shifting.
Gerenciar o armazenamento de conteúdo gravado
Seu serviço de entrada de TV é responsável por armazenar gravações com time-shifting no
armazenamento particular do app e reproduzir conteúdo quando o sistema chama
seus métodos de time-shifting, como onTimeShiftResume()
.
Se o conteúdo já estiver armazenado na nuvem e o app puder gerenciar
as gravações com time-shifting na nuvem, será possível usar o armazenamento em nuvem em vez
do armazenamento de apps.
Se o conteúdo usa conteúdo protegido, o serviço de entrada de TV é responsável pela criptografia adequada do conteúdo gravado e pela descriptografia durante a reprodução.
Como o conteúdo de vídeo gravado pode exigir uma grande quantidade de armazenamento, é necessário gerenciar cuidadosamente o conteúdo gravado durante a reprodução da sessão. Se o tempo da sessão de reprodução exceder a quantidade de tempo que você pode gravar e armazenar para time-shifting, ajuste a gravação para manter o buffer atual, mas garantir que o tempo atual seja capturado. Por exemplo, se o usuário estiver reproduzindo conteúdo por 31 minutos e o tamanho máximo de gravação com time-shifting for 30 minutos, ajuste a gravação e o horário de início para conter conteúdo do minuto 1 ao minuto 31.
Se o serviço de entrada de TV não for compatível com time-shifting devido à falta de armazenamento, será necessário informar o sistema. Para mais detalhes sobre como notificar o sistema sobre restrições de suporte a time-shifting, consulte a seção Notificar o sistema sobre o status de time-shifting.
Quando o usuário mudar para um canal diferente ou encerrar a sessão de reprodução, exclua os dados de time-shifting gravados.
Notificar o sistema sobre o status de time-shifting
Se o serviço de entrada de TV oferecer suporte a time-shifting, chame
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE)
na sua
implementação de
onTune()
quando um usuário sintonizar
um canal.
Para informar ao sistema se algum recurso de time-shifting do seu serviço de entrada
mudar, use
notifyTimeShiftStatusChanged(int)
.
Por exemplo, se o serviço de entrada de TV não tiver suporte a time-shifting
devido a restrições de espaço de armazenamento ou outros motivos, chame
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE)
.
Se o serviço de entrada de TV não tiver suporte a time-shifting, chame
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED)
quando uma sessão de reprodução for criada. O sistema trata todo serviço de entrada que
nunca chama
notifyTimeShiftStatusChanged()
como um serviço de entrada incompatível
com o time-shifting. Isso abrange serviços de entrada usando a API de nível 22 e
anteriores.
Rastrear os tempos de reprodução
A posição inicial de uma gravação com time-shifting é a primeira posição de tempo absoluta,
em milissegundos, desde a época, que o usuário pode procurar. Geralmente, é
o momento em que a reprodução do vídeo começa depois que
onTune()
é chamado.
No entanto, quando o usuário assiste uma quantidade de conteúdo que excede o
que seu app pode gravar, é necessário começar a gravar um novo segmento para
time-shifting e atualizar o horário de início de acordo.
A posição atual de uma gravação com time-shifting é a posição de reprodução atual, em milissegundos, desde o período. Essa posição muda continuamente durante a reprodução. Normalmente, é possível usar o mecanismo de reprodução para determinar esse valor, conforme mostrado neste exemplo:
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; }
O horário de início fornecido quando o sistema chama a
onTimeShiftGetStartPosition()
nunca é maior que a posição de tempo atual fornecida no
onTimeShiftGetCurrentPosition()
.
O sistema usa essas chamadas para
atualizar a duração da mudança de tempo na interface dos controles de mídia.
Compatibilidade com parâmetros de reprodução
Para alterar a velocidade de reprodução durante o time-shifting, o sistema usa parâmetros de reprodução. Por exemplo, se o usuário decidir retroceder a reprodução atual, novos parâmetros de reprodução serão transmitidos ao app com uma velocidade de reprodução negativa. O time-shifting também é compatível com vários níveis diferentes, 2x ou 3x, de velocidade de reprodução para retroceder ou acelerar.
O sistema chama o método
onTimeShiftSetPlaybackParams(PlaybackParams)
com um objeto PlaybackParams
que contém
parâmetros para a sessão atual. Use essas informações para
configurar o mecanismo de reprodução de mídia corretamente.
Se o mecanismo de reprodução não oferecer suporte a um parâmetro, emule o comportamento esperado da melhor maneira possível. Por exemplo, se o mecanismo de reprodução não tiver suporte para a velocidade 2x, use operações de busca repetida no mecanismo para alcançar uma velocidade de reprodução aproximadamente o dobro.
Depois de definir os parâmetros, não mude as configurações, a menos que o usuário emita um comando de reprodução que exija um parâmetro diferente ou mude para um novo canal.