Use APIs de time-shifting no seu serviço de entrada de TV para permitir que os usuários pausem, voltem e avance programas ao vivo nos canais de serviço. Se o app for compatível com com time-shifting, os usuários ganham flexibilidade na forma como assistem ao seu conteúdo:
- Os usuários podem pausar programas enquanto lidam com uma interrupção de curto prazo. Portanto, para que eles nunca percam momentos importantes.
- Os usuários podem avançar por conteúdo que já viram ou conteúdo que que não seja do interesse deles.
- Os usuários poderão retroceder e assistir novamente os momentos favoritos no conteúdo do programa.
![](https://developer.android.com/static/images/training/tv/tif/time-shift.png?authuser=9&hl=pt)
Figura 1. Controles de reprodução da Android TV usados para time-shifting.
O time-shifting 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 usar esses time-shiftings gravações fora da sessão de reprodução atual. Isso significa que eles não podem usar time-shifting para pausar um programa para assistir ao dia seguinte ou pausar um programa para assistir mais tarde enquanto eles mudam para um canal diferente.
Use as APIs de gravação de TV se quiser para permitir que os usuários gravem o conteúdo do programa para assistir fora da reprodução atual sessão.
Adicionar compatibilidade com time-shifting
Para adicionar suporte a time-shifting no seu serviço de entrada de TV, você precisa implementar o
APIs de time-shifting na classe TvInputService.Session
,
lidar com a gravação e a reprodução de gravações com time-shifting no seu app e notificar
o sistema no qual seu serviço de entrada oferece suporte a time-shifting.
Os métodos TvInputService.Session
que você implementa são
o seguinte:
onTimeShiftGetCurrentPosition()
: chamados pelo sistema para conseguir do vídeo em milissegundos. Para mais detalhes, consulte a seção Rastrear os tempos de reprodução.onTimeShiftGetStartPosition()
: chamados pelo sistema para começar posição da gravação atual com time-shifting em milissegundos. Para mais detalhes, consulte a seção Rastrear 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)
: quando o sistema precisa buscar uma nova posição de tempo. Normalmente, a nova posição está entre o a posição inicial e a posição atual.onTimeShiftSetPlaybackParams(PlaybackParams)
: chamados pelo sistema para fornecer parâmetros de reprodução, como velocidade, para a sessão atual. Para 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 oferece suporte time-shifting, consulte Notificar o sistema sobre o status de time-shifting nesta seção.
Se você estiver usando a TIF Companion Library para implementar seu
TvInputService.Session
, você recebe automaticamente uma
implementação de time-shifting que usa o ExoPlayer. Você pode usar isso
implementação ou substituir os métodos de API com time-shifting na
BaseTvInputService.Session
e forneça as suas
implementação. Para mais informações sobre como usar a TIF Companion Library, consulte Criar um serviço de entrada de TV usando
TIF Companion Library.
Gravar conteúdo quando uma sessão for iniciada
Um usuário pode pausar, retroceder e avançar o conteúdo do programa acessando o controles de reprodução do canal, pressionando Select enquanto assistindo ao conteúdo e navegando até os controles de reprodução ou usando controles de reprodução dedicados em um dispositivo remoto.
Como o usuário pode
usar time-shifting a qualquer momento enquanto assiste ao conteúdo do programa, sua TV
serviço de entrada deve começar a gravar conteúdo com time-shifting assim que o usuário
sintoniza um canal na sua
onTune()
implementação. Você também precisa
informe ao sistema que é possível gravar chamando
notifyTimeShiftStatusChanged(int)
,
conforme descrito nos
Notificar o sistema sobre o status de time-shifting
nesta seção.
Gerenciar o armazenamento de conteúdo gravado
Seu serviço de entrada de TV é responsável por armazenar gravações com time-shifting em
o armazenamento particular do app e a reprodução de 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
gravações com time-shifting na nuvem, use o armazenamento em nuvem
de armazenamento do app.
Caso seu conteúdo use material protegido, seu serviço de entrada de TV será responsável por: criptografia adequada do conteúdo gravado e descriptografia de conteúdo durante a reprodução.
Como o conteúdo de vídeo gravado pode exigir uma grande quantidade de armazenamento, você precisa gerenciar cuidadosamente o conteúdo gravado durante a reprodução da sessão. Se a reprodução o tempo da sessão excede a quantidade de tempo que você pode gravar e armazenar para com time-shifting, ajuste sua gravação com time-shifting para manter o buffer atual, mas garante que o horário atual seja capturado. Por exemplo, se o usuário tenha reproduzido conteúdo há 31 minutos e o máximo de gravação com time-shifting seja de 30 minutos, ajuste a gravação e a hora de início para conter do minuto 1 ao 31.
Se seu serviço de entrada de TV não for compatível com time-shifting devido à falta de o armazenamento, você precisa informar o sistema. Para mais detalhes sobre como notificar o sobre restrições de suporte a time-shifting, consulte a Notificar o sistema sobre o status de time-shifting nesta seção.
Quando o usuário muda para um canal diferente ou encerra a reprodução excluir os dados gravados de time-shifting.
Notificar o sistema sobre o status de time-shifting
Se seu 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
a um canal.
Para informar ao sistema se há recursos de time-shifting do seu serviço de entrada
mudar, usar
notifyTimeShiftStatusChanged(int)
:
Por exemplo, se o serviço de entrada de TV não for compatível com time-shifting
devido a restrições de espaço de armazenamento ou outros motivos, ligue
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE)
:
Se seu serviço de entrada de TV não for compatível com time-shifting, chame
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED)
quando uma sessão de reprodução é criada. O sistema trata qualquer serviço de entrada que
Nunca chama
notifyTimeShiftStatusChanged()
como um serviço de entrada que não pode
oferecer suporte ao time-shifting. Isso abrange serviços de entrada que usam o nível 22 da API e
antes.
Rastrear os tempos de reprodução
A posição inicial de uma gravação com time-shifting é o primeiro horário absoluto
posição, em milissegundos desde o período, que o usuário pode buscar. Isso é
normalmente o tempo em que a reprodução do vídeo começa depois de
onTune()
é chamado.
No entanto, quando o usuário assiste uma quantidade de conteúdo que excede o
seu app possa gravar, será preciso começar a gravar um novo segmento para
time-shifting e atualize 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 posição, em milissegundos, desde o período. Esta posição muda continuamente durante a reprodução. Normalmente, é possível usar o mecanismo de reprodução para determinar isso , 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; }
Confira se o horário de início informado quando o sistema chama
onTimeShiftGetStartPosition()
nunca é maior do que a posição de tempo atual que você fornece em
onTimeShiftGetCurrentPosition()
.
O sistema usa essas chamadas para
atualizar a duração de time-shifting 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. Para Por exemplo, se o usuário decidir voltar a reprodução atual, uma nova reprodução são transmitidos ao app com uma velocidade de reprodução negativa. O time-shifting também é compatível com vários níveis diferentes, duas ou três vezes, de velocidade de reprodução para voltar ou avançar.
O sistema chama
onTimeShiftSetPlaybackParams(PlaybackParams)
com um objeto PlaybackParams
que contém
parâmetros para a sessão atual. Use essas informações para
configure o mecanismo de reprodução de mídia de maneira adequada.
Caso seu mecanismo de reprodução não ofereça suporte a um parâmetro, emular o comportamento esperado da melhor maneira possível. Por exemplo, se a reprodução mecanismo não oferece suporte à velocidade de 2x, use operações de busca repetida na reprodução para atingir uma velocidade de reprodução aproximadamente o dobro.
Após definir os parâmetros, não altere as configurações, a menos que o usuário emite um comando de reprodução que exige um parâmetro ou interruptores diferentes para um novo canal.