Compatibilidade com time-shifting

Use APIs de time-shifting no serviço de entrada de TV para permitir que os usuários pausem, retrocedam e avancem programas ao vivo nos canais do serviço. Se seu app tiver compatibilidade com time-shifting, os usuários terão maior flexibilidade na maneira como assistem ao seu conteúdo. Por exemplo:

  • Os usuários poderão pausar programas enquanto lidam com uma interrupção de curto prazo, garantindo que nunca percam os principais momentos.
  • Os usuários poderão avançar por conteúdos que já viram ou conteúdos que não sejam 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 reproduzir essas gravações com time-shifting fora da sessão de reprodução atual, então eles não podem usar time-shifting para pausar um programa e assistir no dia seguinte, ou pausar um programa e assistir mais tarde enquanto mudam para um canal diferente. Use as APIs de gravação de TV se quiser permitir que seus usuários gravem conteúdo do programa para assistir fora da sessão de reprodução atual.

Adicionar compatibilidade com time-shifting

Para adicionar compatibilidade com time-shifting no seu serviço de entrada de TV, é necessário implementar as APIs de time-shifting na sua classe TvInputService.Session, gerenciar a gravação e reprodução de gravações com time-shifting no seu app e notificar o sistema de que seu serviço de entrada oferece compatibilidade com time-shifting.

Os métodos TvInputService.Session que você precisa implementar são os seguintes:

Para saber mais detalhes sobre como informar ao sistema que seu serviço de entrada é compatível com time-shifting, consulte Notificar o sistema sobre o status de time-shifting.

Se você está usando a TIF Companion Library para implementar sua classe TvInputService.Session, você recebe 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 o uso da 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, retroceder 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 de reprodução dedicados em um dispositivo remoto, se disponível. 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 onTune(). Nesse ponto, também é necessário informar ao sistema que é possível gravar chamando notifyTimeShiftStatusChanged(int) conforme descrito em 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 privado do app e reproduzir conteúdo quando o sistema chama seus métodos de time-shifting, como onTimeShiftResume(). Se seu conteúdo já estiver armazenado na nuvem e seu app puder gerenciar gravações de time-shifting na nuvem, será possível usar o armazenamento em nuvem em vez do armazenamento do app.

Se seu conteúdo usa conteúdo protegido, o serviço de entrada da 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 é possível gravar e armazenar para time-shifting, é necessário ajustar sua 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 há 31 minutos e seu tamanho máximo de gravação com time-shifting for 30 minutos, será possível ajustar sua gravação e o tempo de início para conter o conteúdo do minuto 1 ao 31.

Se seu serviço de entrada de TV não for compatível com time-shifting devido à falta de armazenamento, será necessário informar ao sistema. Para saber mais detalhes sobre como notificar o sistema sobre restrições de compatibilidade com time-shifting, consulte Notificar o sistema sobre o status de time-shifting.

Quando um usuário muda para um canal diferente ou termina a sessão de reprodução, é necessário excluir os dados de time-shifting gravados.

Notificar o sistema sobre o status de time-shifting

Se o serviço de entrada de TV for compatível com time-shifting, chame notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) na 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 for mudado, use notifyTimeShiftStatusChanged(int). Por exemplo, caso seu serviço de entrada de TV não seja compatível com 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 for compatível com 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 que não é compatível com 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 o período inicial) que o usuário pode procurar. Geralmente, esse é o tempo em que a reprodução do vídeo começa após onTune() ser chamado. No entanto, nos casos em que o usuário assiste a uma quantidade de conteúdo que excede o que seu app pode gravar, pode ser necessário começar a gravar um novo segmento para time-shifting e atualizar o tempo de início de forma adequada.

A posição atual de uma gravação com time-shifting é a posição de reprodução atual, em milissegundos desde o período inicial. Essa posição muda continuamente durante a reprodução. Normalmente, é possível usar seu mecanismo de reprodução para determinar esse valor. Por 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 tempo de início que é fornecido quando o sistema chama seu onTimeShiftGetStartPosition() nunca pode ser maior que a posição de tempo atual fornecida em onTimeShiftGetCurrentPosition(). O sistema usa essas chamadas para atualizar a duração de time-shifting na IU dos controles de reprodução.

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 seu app com uma velocidade de reprodução negativa. O time-shifting também é compatível com vários níveis diferentes (2x, 3x) de velocidade de reprodução para retroceder ou avançar.

O sistema chama seu 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 adequadamente.

Se seu mecanismo de reprodução não for compatível com um parâmetro, tente emular o comportamento esperado da melhor maneira possível. Por exemplo, se o mecanismo de reprodução não for compatível com a velocidade 2x, use operações de busca repetida no mecanismo de reprodução para ter uma velocidade de reprodução aproximadamente duas vezes maior.

Após a definição dos parâmetros, não altere 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.