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 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.

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:

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.