Suporte à diferença de tempo

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.

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:

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.