Transmissões ao vivo

O SDK do Cast inclui APIs integradas para oferecer suporte a conteúdo ao vivo. Isso inclui interface flexível e pronta para uso, acoplada a APIs que permitem aos desenvolvedores criar experiências ao vivo com apenas algumas linhas de código. A API Live oferece suporte à exibição horários de início e término, metadados do programa, controles de DVR e janelas pesquisáveis.

Este guia demonstra como configurar uma transmissão para as APIs de transmissões ao vivo, incluindo amostras de código e metadados para configurar os principais cenários ao vivo, além de capturas de tela que mostram cada cenário.

Pré-requisitos

Conhecer os fundamentos da implementação É necessário usar o Receptor da Web antes de analisar esta guia. Além disso, para executar os exemplos de código, você precisará de acesso a um que esteja em conformidade com um dos tipos de mídia compatíveis com a transmissão. Em geral, o recurso "Ao vivo" oferece suporte a configurações típicas de transmissão ao vivo mídia compatível.

Os seguintes termos são usados ao longo deste guia:

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

Como 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 lado do remetente ou do receptor.

O interceptador fornece uma LoadRequestData Objeto que contém todos os metadados importantes sobre uma solicitação de carregamento. Para que uma solicitação de carregamento é para uma transmissão ao vivo, basta definir o streamType no(a) mediaInformation para StreamType.LIVE. MediaInformation.duration precisa ser -1, já que as instâncias do player são responsável por calculá-lo quando o conteúdo for 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;
});

Adicionando dados do guia da programação

Transmissões ao vivo, especialmente transmissões de longa duração, como um canal de TV, podem mostrar metadados do guia/programação na tela com base na reprodução atual em uma transmissão ao vivo. Recomendamos que os provedores de conteúdo incluam programação de metadados em seus aplicativos receptores da Web para uma melhor experiência do usuário.

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

No snippet de código a seguir, usamos o objeto MediaMetadata para especificar horário de início de cada programa com um Carimbo de data/hora do UNIX com o 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 em tempo real

O SDK do Cast inclui elementos e controles de interface que permitem que o usuário mova os marcador de reprodução no stream usando o Controlador expandido ou controles por toque em dispositivos habilitados para toque.

A LiveSeekableRange representa o intervalo de tempo em um fluxo em que um usuário pode buscar. No(s) dia(s) Receptor web você pode acessar informações sobre o intervalo pesquisável via PlayerManager.getLiveSeekableRange(), que retorna um LiveSeekableRange objeto. As principais propriedades do objeto que você precisa conhecer são:

  • start: hora de início (em segundos) do intervalo em relação ao início da transmissão em segundos.
  • end: o tempo máximo (em segundos) que o player pode alcançar. com base nos segmentos disponíveis, em relação ao início da transmissão.
  • isMovingWindow: um valor booleano que indica se o intervalo pesquisável move (ou seja, segmentos mais antigos são removidos do manifesto) com o stream, esse valor deve ser verdadeiro para todas as transmissões ao vivo.
  • isLiveDone: um valor booleano que indica se a transmissão ao vivo concluído, ou seja, nenhum segmento novo está sendo gerado.

O tamanho do intervalo pesquisável, representado como o tempo entre start e end, é determinada pelo número de segmentos disponíveis no stream e será se mover com o stream. Por exemplo, se, no início do stream, a fase o intervalo é {start:0, end: 600, isMovingWindow: false, isLiveDone: false}, dez segundos após o início do stream, ele pode se tornar {start: 10, end: 610, isMovingWindow: true, isLiveDone: false}. É importante observar o início e os horários de término no intervalo pesquisável são atualizados com base no tempo que leva para gerar um novo segmento. Assim, se a duração típica de um trecho da sua transmissão for de 10 segundos, os horários de início e término serão atualizados a cada 10 segundos, conforme muito bem.

Desativar a busca

Para desativar a busca em um stream, remova a funcionalidade de busca dos comandos de mídia compatíveis com o receptor da Web:

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

Remoção do comando de mídia com suporte a indicadores do SEEK para aplicativos remetentes e touch displays para desativar a busca, mas não desativa comandos de voz, como como "Ok Google, voltar 30 segundos". comandos de mídia compatíveis com voz para detalhes sobre como desativar comandos de mídia para voz.

Eventos de framework ao vivo

Dois eventos, LIVE_ENDED e LIVE_IS_MOVING_WINDOW_CHANGED, estão incluídos em a API em tempo real. Ambos os eventos recebem um LiveStatusEvent , que contém o intervalo atual pesquisável em tempo real.

Evento Descrição
LIVE_ENDED Acionado quando uma transmissão ao vivo termina. Nesse ponto, o valor end em LiveSeekableRange não será mais atualizado. os usuários ainda poderão visualizar o conteúdo dentro do intervalo pesquisável em tempo real.
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. Em uma transmissão ao vivo, isso acontecerá quando o jogador detectar que o manifesto está removendo segmentos anteriores.

Cenários de transmissão ao vivo

Há oito tipos de cenários possíveis para a transmissão ao vivo, e cada um deles são definidas por meio da definição de três configurações principais:

  • A transmissão tem um horário de início
  • A transmissão tem um horário de término
  • Os usuários podem procurar dentro da janela pesquisável da transmissão ao vivo.

Consulte Como adicionar dados do guia do programa para saber como configurar esses valores.

Confira abaixo descrições e capturas de tela dos cenários disponíveis na transmissão ao vivo API. As variáveis T1 e T2 representam o carimbo de data/hora no respectivamente à esquerda e à direita da interface.

Horário de início Horário de término Pesquisável T1 T2
Cenário 1 Não Não Não Cabeça de brincadeira Não mostrado
Cenário 2 Não Não Sim Play Head (link em inglês) Não mostrado
Cenário 3 Não Sim Não Play Head (link em inglês) Não mostrado
Cenário 4 Não Sim Sim Play Head (link em inglês) Não mostrado
Cenário 5 Sim Não Não Mostrar tempo de início Play Head (link em inglês)
Cenário 6 Sim Não Sim Mostrar tempo de início Play Head (link em inglês)
Cenário 7 Sim Sim Não Mostrar hora de início Mostrar hora de término
Cenário 8 Sim Sim Sim Mostrar hora de início Mostrar hora de término

Cenário um

Horário de início Horário de término Pesquisável T1 T2
Não Não Não Tocar na cabeça Não mostrado

O cenário 1 não tem horário de início nem de término e os usuários não podem buscar dentro do riacho. Quando um usuário interromper a transmissão, a reprodução será retomada a partir da borda ao vivo de onde a transmissão foi pausada.

Cenário sete

Uma TV mostrando a interface ao vivo do Chromecast no cenário 7 com o horário do relógio Um smartphone mostrando a interface ao vivo do cenário 7 com a hora do relógio.

Horário de início Horário de término Pesquisável T1 T2
Sim Sim Não Cabeça de brincadeira Duração do programa

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

Cenário 8

Uma TV mostrando a interface ao vivo do Chromecast no cenário 8 com o horário do relógio Um smartphone mostrando a interface ao vivo do cenário 8 com a hora do relógio

Horário de início Horário de término Pesquisável T1 T2
Sim Sim Sim Cabeça de brincadeira Duração do programa

O cenário sete tem um horário de início, um horário de término e é pesquisável. Os dois carimbos de data/hora na interface do usuário, T1 e T2, representam o marcador atual e o total do respectivamente. Se um usuário pausar/retomar a reprodução, a transmissão será retomada. no momento em que a pausa foi feita, se ela estiver dentro da janela pesquisável (a área em vermelho na a barra de busca representa para onde um usuário pode voltar e a área em branco representa para onde eles podem avançar.

Como configurar um cenário

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

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

Comportamento de reprodução

Enquanto estiver pausado, a interface do usuário continuará a ter seus metadados de reprodução atualizados. inclui tempos de reprodução no início e de borda ao vivo. Após a retomada do fluxo, há há alguns comportamentos que você precisa conhecer, que variam de acordo com a configuração do stream.

Streams pesquisáveis

Após a retomada de um stream pesquisável:

  • A borda ativa precisa ser atualizada para o local ativo e o intervalo pesquisável serão ajustados.
  • Se o marcador passar do programa atual, a barra de reprodução será atualizada. com os metadados do novo programa (incluindo horários de início e término, se disponíveis).
  • Se uma janela pesquisável tiver o comprimento de "X", o intervalo pesquisável se estenderá de volta a no máximo "X" ou ao início do programa, o que for menor.
  • Se o usuário tiver ficado pausado por tempo suficiente para que a hora atual não seja mais em na janela pesquisável, o stream será retomado no primeiro ponto (à esquerda) da janela pesquisável.

Ir para LiveSeekableRange.end para retomar a reprodução na borda ao vivo após retomá-la.

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;
  }
  ...
});

Streams não pesquisáveis

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

  • Nesse caso, a reprodução será retomada na borda ao vivo.
  • Se a borda ativa ultrapassar o programa atual, a barra de reprodução deverá ser atualizados com os metadados do novo programa (incluindo horário de início e término) se disponível).

Mudanças na superfície da API e como personalizar a interface em tempo real

O SDK do Cast oferece suporte integrado para a criação de interfaces do usuário personalizadas em vez de usando a interface pronta para uso. No entanto, é importante seguir Lista de verificação do design de UX do Google Cast ao personalizar a interface gráfica do usuário.

Receptor da Web

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

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

Não se esqueça de levar em conta também dois eventos ao vivo ao personalizar a interface.

SDK do Android

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