Transmissão ao vivo

O SDK do Cast inclui APIs integradas para oferecer suporte a conteúdo ao vivo. Isso inclui uma IU flexível e pronta para uso, além de APIs que permitem aos desenvolvedores criar experiências avançadas de vida com apenas algumas linhas de código. A API Live permite exibir horários de início e término, metadados do programa, controles de DVR e janelas pesquisáveis.

Este guia demonstra como configurar um stream para as APIs ao vivo, incluindo amostras de código e metadados para configurar os principais cenários ao vivo, além de capturas de tela que demonstram a aparência de cada cenário.

Pré-requisitos

É necessário conhecer os princípios básicos da implementação de um Web Receiver antes de ler este guia. Além disso, para executar os exemplos de código, você precisa de acesso a uma transmissão ao vivo que esteja em conformidade com um dos tipos de mídia compatíveis com o Cast. Em geral, o recurso "Ao vivo" oferece suporte a configurações típicas de transmissão ao vivo para a mídia compatível.

Os termos a seguir são usados ao longo do guia:

  • Janela pesquisável: o intervalo de uma transmissão ao vivo que os usuários podem procurar.
  • Live Edge: a parte mais recente de uma transmissão ao vivo disponível para o jogador.
  • Play Head: é um carimbo de data/hora de IU da posição de reprodução atual.

Transmitir uma transmissão ao vivo

Há duas maneiras de configurar o SDK do receptor da Web para usar a API Live para conteúdo:

  1. usando o interceptador de mensagens LOAD no aplicativo receptor da Web. (recomendado)
  2. usando uma solicitação de carga gerada pelo remetente ou pelo receptor.

O interceptador fornece um objeto LoadRequestData que contém todos os metadados importantes sobre uma solicitação de carregamento. Para indicar que uma solicitação de carregamento é de uma transmissão ao vivo, basta definir streamType no objeto mediaInformation como StreamType.LIVE. MediaInformation.duration precisa ser -1, porque as instâncias do jogador são responsáveis por calcular quando o conteúdo é LIVE.

/*
* This interceptor is called before your content is loaded by a Cast device
*/
playerManager.setMessageInterceptor(
   cast.framework.messages.MessageType.LOAD,
   request => { /* cast.framework.messages.LoadRequestData */
       request.media.streamType = cast.framework.messages.StreamType.LIVE;
   return request;
});

Adicionar dados do guia de programação

As transmissões ao vivo, especialmente de longa duração, como um canal de TV, podem exibir metadados de programação/guia na tela com base na posição de reprodução atual em uma transmissão ao vivo. Recomendamos que os provedores de conteúdo incluam metadados de programação nos aplicativos Web Receiver para melhorar a experiência do usuário final.

É possível configurar os dados iniciais do guia para um stream no interceptador da mensagem LOAD, da mesma forma que indicamos que era um stream ao vivo no exemplo anterior. Seções ou programas individuais na transmissão ao vivo são representados como objetos MediaMetadata armazenados em uma fila. Há uma classe MediaMetadata diferente para diferentes tipos de programas, por exemplo, TvShowMediaMetadata, MovieMediaMetadata, MusicTrackMediaMetadata etc.

No snippet de código a seguir, usamos o objeto MediaMetadata para especificar o horário de início de cada programa com um carimbo de data/hora UNIX com a propriedade sectionStartAbsoluteTime. A duração de um programa é representada em segundos.

// The metadata for a single TV show
const currentShow = new cast.framework.messages.TvShowMediaMetadata();
currentShow.episode = 15;
currentShow.seriesTitle = 'The Odyssey';
currentShow.title = 'Scylla and Charybdis';
currentShow.sectionStartAbsoluteTime = toUnixTimestamp('9:00 PM');
currentShow.sectionDuration = HOUR_IN_SECONDS;

const previousShow = new ...;
const nextShow = new ...;

const containerMetadata = new cast.framework.messages.ContainerMetadata();
containerMetadata.title = 'My TV Channel';
containerMetadata.sections = [previousShow, currentShow, nextShow];

playerManager.getQueueManager().setContainerMetadata(containerMetadata);

Intervalo pesquisável ao vivo

O SDK do Cast inclui controles e elementos da IU que permitem ao usuário mover o marcador dentro do stream usando o controlador expandido ou controles de toque em dispositivos com recurso de toque.

O LiveSeekableRange representa o intervalo de tempo em um stream em que um usuário pode procurar. No Receptor da Web, é possível acessar informações sobre o intervalo pesquisável por meio de PlayerManager.getLiveSeekableRange(), que retorna um objeto LiveSeekableRange. As principais propriedades do objeto que você precisa conhecer são:

  • start: o horário de início (em segundos) do intervalo em relação ao início do stream em segundos.
  • end: o tempo máximo (em segundos) que o jogador pode procurar, com base nos segmentos disponíveis em relação ao início do stream.
  • isMoveWindow: um valor booleano que indica se o intervalo pesquisável se move (ou seja, segmentos mais antigos foram removidos do manifesto) com o stream. Esse valor precisa ser true para todas as transmissões ao vivo.
  • isLiveDone: um valor booleano que indica se a transmissão ao vivo foi concluída, o que significa que nenhum segmento novo está sendo gerado.

O tamanho do intervalo pesquisável, representado como o tempo entre start e end, é determinado pelo número de segmentos disponíveis no stream e vai ser movido com ele. Por exemplo, se, no início do stream, o intervalo pesquisável for {start:0, end: 600, isMovingWindow: false, isLiveDone: false}, dez segundos após o início do stream, ele poderá se tornar {start: 10, end: 610, isMovingWindow: true, isLiveDone: false}. É importante observar que os horários de início e término no intervalo pesquisável são atualizados com base no tempo necessário para gerar um novo segmento. Assim, se a duração típica de um segmento para o stream for 10 segundos, os horários de início e término também serão atualizados a cada 10 segundos.

Desativar busca

Para desativar a busca em um stream, você precisa remover a funcionalidade de busca dos comandos de mídia com suporte no receptor da Web:

// disable seeking in the LOAD messageInterceptor
playerManager.removeSupportedMediaCommands(cast.framework.messages.Command.SEEK, true);

A remoção do comando de mídia compatível para indicadores de SEEK para aplicativos de remetente e touchscreens para desativar a busca, mas não desativa os comandos de voz, como "Ok Google, busque 30 segundos para trás". Consulte o guia de comandos de mídia compatíveis com a voz para ver detalhes sobre como desativar os comandos de mídia para voz.

Eventos de framework em tempo real

Dois eventos, LIVE_ENDED e LIVE_IS_MOVING_WINDOW_CHANGED, estão incluídos na API Live. Os dois eventos recebem um objeto LiveStatusEvent, que contém o intervalo atual pesquisável.

Evento Descrição
LIVE_ENDED Acionado quando uma transmissão ao vivo termina. A partir de agora, o valor de end no LiveSeekableRange deixará de ser atualizado. Os usuários ainda poderão ver o conteúdo dentro do intervalo pesquisável.
LIVE_IS_MOVING_WINDOW_CHANGED Acionado quando o intervalo pesquisável de uma transmissão ao vivo muda de uma janela fixa para uma janela móvel ou vice-versa. Isso acontece quando o player detecta que o manifesto está removendo segmentos anteriores.

Cenários de transmissão ao vivo

Existem oito tipos possíveis de cenário para transmissões ao vivo, cada um definido com três configurações principais:

  • O horário de início do stream está em andamento
  • A transmissão tem um horário de término
  • Os usuários podem buscar na janela pesquisável da transmissão ao vivo

Consulte Como adicionar dados de guia de programação para saber como configurar esses valores.

Veja abaixo as descrições e capturas de tela dos cenários com suporte da API Live. As variáveis T1 e T2 são usadas para representar o carimbo de data/hora à esquerda e à direita da IU, respectivamente.

Horário de início Horário de término Procurável T1 T2 (em inglês)
Cenário 1 Não Não Não Cabeça do Google Play Não exibido
Cenário 2 Não Não Sim Jogar Não aparece
Cenário 3 Não Sim Não Jogar Não aparece
Cenário 4 Não Sim Sim Jogar Não aparece
Cenário 5 Sim Não Não Mostrar horário de início Jogar
Cenário 6 Sim Não Sim Mostrar horário de início Jogar
Cenário 7 Sim Sim Não Mostrar horário de início Mostrar horário de término
Cenário 8 Sim Yes Sim Mostrar horário de início Mostrar horário de término

Cenário um

Horário de início Horário de término Procurável T1 T2 (em inglês)
Não Não Não Reproduzir cabeça Não exibido

O cenário um não tem horário de início ou de término e os usuários não podem fazer buscas no stream. Quando um usuário interrompe um stream, a reprodução é retomada da borda ao vivo, em vez de onde o stream foi pausado.

Situação 7

Uma TV mostrando a IU ao vivo do Chromecast para o cenário 7 com o relógio Um smartphone mostrando a IU em tempo real do cenário 7 com o relógio

Horário de início Horário de término Procurável T1 T2 (em inglês)
Sim Sim Não Cabeça do Google Play Duração do programa

O cenário 7 tem um horário de início e de término, mas não é pesquisável. Os dois carimbos de data/hora na IU, T1 e T2, representam o tempo de reprodução atual e a duração total do programa, respectivamente. Se um usuário pausar/retomar a reprodução, o stream vai ser retomado na borda ao vivo. No exemplo acima, a seção vermelha da barra de busca representa a parte do stream desde que o usuário começou a assistir.

Cenário oito

Uma TV mostrando a IU ao vivo do Chromecast para o cenário 8 com o relógio Um smartphone mostrando a IU em tempo real do cenário 8 com o relógio

Horário de início Horário de término Procurável T1 T2 (em inglês)
Sim Yes Sim Cabeça do Google Play Duração do programa

O cenário 7 tem um horário de início e de término e é pesquisável. Os dois carimbos de data/hora na IU, T1 e T2, representam o tempo de reprodução atual e a duração total do programa, respectivamente. Se um usuário pausar/retomar a reprodução, o stream vai ser retomado no momento em que estiver pausado, se estiver dentro da janela pesquisável. A área em vermelho na barra de busca representa onde um usuário pode voltar e a área em branco representa onde ele pode avançar.

Como configurar um cenário

A configuração de um stream como um cenário ao vivo específico é feita em três partes:

  1. Defina o tipo de transmissão: marque o stream como uma transmissão ao vivo.
  2. Adicionar dados do guia de programação: defina um horário de início e uma duração no objeto MediaMetadata.
  3. Configurar a funcionalidade de busca: ative ou desative a busca.

Comportamento de reprodução

Enquanto estiver pausada, os metadados de reprodução da IU vão continuar sendo atualizados. Isso inclui os tempos de início da reprodução e de borda em tempo real. Após a retomada do stream, há alguns comportamentos que variam de acordo com a configuração do stream.

Streams pesquisáveis

Após a retomada de uma transmissão pesquisável:

  • A borda ativa será atualizada para o local ativo e o intervalo pesquisável vai ser ajustado de acordo.
  • Se o marcador passar do programa atual, a barra de reprodução será atualizada com os metadados do novo programa (incluindo os horários de início e término, se disponíveis).
  • Se uma janela pesquisável tem a extensão "X", o intervalo pesquisável se estende até o máximo de "X" ou até o início do programa, o que for menor.
  • Se o usuário estiver pausado por tempo suficiente para que a hora atual não esteja mais na janela pesquisável, o stream será retomado no ponto mais cedo (à esquerda) da janela pesquisável.

Tente LiveSeekableRange.end para retomar a reprodução na borda ativa depois de retomar.

let playerManager = cast.framework.CastReceiverContext.getInstance().getPlayerManager();
// Intercept the message to PLAY
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.PLAY, (requestData) => {
  ...
  if (playerManager.getLiveSeekableRange()) {
    // Resume playback at the live edge
    playerManager.seek(playerManager.getLiveSeekableRange().end);
  } else {
    return requestData;
  }
  ...
});

Transmissões não perceptíveis

Após a retomada de uma transmissão não pesquisável:

  • Nesse caso, a reprodução vai ser retomada na borda ativa.
  • Se a borda ativa passar do programa atual, a barra de reprodução vai ser atualizada com os metadados do novo programa (incluindo os horários de início e término, se disponíveis).

Mudanças na superfície da API e personalização da IU em tempo real

O SDK do Cast tem suporte integrado para criar interfaces do usuário personalizadas em vez de usar a IU pronta para uso. No entanto, é importante seguir a Lista de verificação de design da UX do Google Cast ao personalizar a interface.

Receptor da Web

No receptor da Web, o PlayerData inclui os campos a seguir para permitir que os desenvolvedores estendam as interfaces personalizadas para transmissões ao vivo:

  • isLive: uma sinalização que indica se a transmissão atual é uma transmissão ao vivo, em vez de VOD.
  • liveSeekableRange: o intervalo pesquisável a ser exibido na tela demarcando a janela de DVR.
  • mediaStartAbsoluteTime: quando a seção começou no tempo absoluto (Época UNIX).
  • sectionStartTimeInMedia: horário de início da seção em segundos em relação ao horário de início da mídia.
  • sectionDuration: duração da seção em segundos.

Além disso, considere os dois eventos ao vivo ao personalizar a IU.

SDK do Android

Como parte da funcionalidade "Ao vivo", o uso do widget de busca da Android no UIMediaController foi descontinuado. Use a CastSeekBar.