Este guia aborda o desenvolvimento de um aplicativo cliente para carregar uma transmissão ao vivo HLS ou DASH com a API Pod Serving e seu manipulador de manifesto.
Pré-requisitos
Antes de continuar, você precisa ter o seguinte:
Uma chave de recurso personalizada para um evento de transmissão ao vivo configurado com o tipo de DAI
Pod serving redirect. Para conseguir essa chave, siga estas etapas:Use uma biblioteca de cliente da API SOAP para chamar o método
LiveStreamEventService.createLiveStreamEventscom um objetoLiveStreamEvente a propriedadedynamicAdInsertionTypedefinida como o valor de enumeraçãoPOD_SERVING_REDIRECT. Para todas as bibliotecas de cliente, consulte Bibliotecas de cliente e exemplos de código.
Determine se o SDK do Interactive Media Ads (IMA) está disponível para sua plataforma. Recomendamos usar o SDK do IMA para aumentar a receita. Para mais detalhes, consulte Configurar o SDK do IMA para DAI.
Fazer uma solicitação de stream
Quando o usuário selecionar uma transmissão, faça o seguinte:
Faça uma solicitação
POSTao método do serviço de transmissão ao vivo. Para mais detalhes, consulte Método: stream.Transmita parâmetros de segmentação de anúncios nos formatos
application/x-www-form-urlencodedouapplication/json. Essa solicitação registra uma sessão de stream com a DAI do Google.O exemplo a seguir faz uma solicitação de stream:
Codificação de formulário
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const params = new URLSearchParams({ cust_params: 'section=sports&page=golf,tennis' }).toString(); const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params }); console.log(await response.json());Codificação JSON
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cust_params: { section: 'sports', page: 'golf,tennis' } }) }); console.log(await response.json());Se for bem-sucedido, você vai ver uma saída semelhante a esta:
{ "stream_id": "8d2b2292-6356-4c0e-94be-cece01d2df2e:DLS", "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/", "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata", "session_update_url": "https://dai.google.com/linear/.../session", "polling_frequency": 10 }Na resposta JSON, localize o ID da sessão de transmissão e armazene outros dados para etapas subsequentes.
Pesquisar metadados de anúncios
Para fazer o polling dos metadados de anúncios, faça o seguinte:
Leia o valor
metadata_urlda resposta de registro de stream.Faça uma solicitação
GETpara o endpoint. Para mais detalhes, consulte Método: metadata.O exemplo a seguir busca metadados de anúncios:
const response = await fetch(metadata_url); console.log(await response.json());Se a solicitação for bem-sucedida, você vai receber a resposta PodMetadata para os intervalos publicitários atuais e futuros:
{ "tags":{ "google_5555555555":{ "ad":"0000229834_ad1", "ad_break_id":"0000229834", "type":"firstquartile" }, "google_1234567890123456789":{ "ad":"0000229834_ad1", "ad_break_id":"0000229834", "type":"progress" }, ... }, "ads":{ "0000229834_ad1":{ "ad_break_id":"0000229834", "position":1, "duration":15, "clickthrough_url":"https://.../", ... }, ... }, "ad_breaks":{ "0000229834":{ "type":"mid", "duration":15, "ads":1 }, ... } }Salve o objeto
tagspara as etapas posteriores.Defina um timer usando o valor
polling_frequencypara solicitar regularmente metadados de todos os intervalos de publicidade sucessivos.
Carregue a transmissão no player de vídeo
Depois de receber o ID da sessão da resposta de registro, transmita o ID para o manipulador de manifesto ou crie um URL de manifesto para carregar o stream em um player de vídeo.
Para transmitir o ID da sessão, consulte a documentação do manipulador de manifesto. Se você desenvolver um manipulador de manifesto, consulte Manipulador de manifesto para transmissão ao vivo.
O exemplo a seguir monta um URL de manifesto:
https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"
Quando o player estiver pronto, comece a reprodução.
Detectar eventos de anúncios
Verifique o formato do contêiner da sua transmissão para os metadados com carimbo de data/hora:
As transmissões HLS com contêineres Transport Stream (TS) usam tags ID3 com carimbo de data/hora para transportar metadados com carimbo de data/hora. Para mais detalhes, consulte Sobre o formato de aplicativo de mídia comum com HTTP Live Streaming (HLS).
Os fluxos DASH usam elementos
EventStreampara especificar eventos no manifesto.As transmissões DASH usam elementos
InbandEventStreamquando os segmentos contêm caixas de mensagem de evento (emsg) para dados de payload, incluindo tags ID3. Para mais detalhes, consulte InbandEventStream.Os streams CMAF, incluindo DASH e HLS, usam caixas
emsgque contêm tags ID3.
Para recuperar tags ID3 do seu stream, consulte o guia do player de vídeo. Para mais detalhes, consulte o guia de como processar metadados com carimbo de data/hora.
Para recuperar o ID do evento de anúncio das tags ID3, faça o seguinte:
- Filtre os eventos por
scheme_id_uricomurn:google:dai:2018ouhttps://aomedia.org/emsg/ID3. Extraia a matriz de bytes do campo
message_data.O exemplo a seguir decodifica os dados
emsgem JSON:{ "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1234567890123456789", ... }Filtre as tags ID3 com o formato
TXXXgoogle_{ad_event_ID}:TXXXgoogle_1234567890123456789
Mostrar dados de eventos de anúncios
Para encontrar o objeto TagSegment, faça o seguinte:
Recupere o objeto de metadados do anúncio
tagsde Pesquisar metadados do anúncio. O objetotagsé uma matriz de objetosTagSegment.Use o ID completo do evento de anúncio para encontrar um objeto
TagSegmentcom o tipoprogress.Use os primeiros 17 caracteres do ID do evento de anúncio para encontrar um objeto
TagSegmentde outros tipos.Depois de ter o
TagSegment, use a propriedadead_break_idcomo chave para encontrar o objetoAdBreakno objetoad_breaksde metadados do anúncio.O exemplo a seguir encontra um objeto
AdBreak:{ "type":"mid", "duration":15, "ads":1 }Use os dados
TagSegmenteAdBreakpara mostrar informações sobre a posição do anúncio no intervalo. Por exemplo,Ad 1 of 3.
Enviar pings de verificação de mídia
Para cada evento de anúncio, exceto o tipo progress, envie um ping de verificação de mídia.
A DAI do Google descarta eventos progress, e o envio frequente deles pode afetar o desempenho do app.
Para gerar o URL completo de verificação de mídia de um evento de anúncio, faça o seguinte:
Na resposta do fluxo, adicione o ID do evento de anúncio completo ao valor
media_verification_url.Faça uma solicitação
GETcom o URL completo:// media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/" const completeUrl = `${media_verification_url}google_5555555555123456789`; const response = await fetch(completeUrl);Se a operação for bem-sucedida, você vai receber uma resposta com o código de status
202. Caso contrário, você vai receber um código de erro404.
Use o monitoramento de atividade de streaming (SAM) para inspecionar um registro histórico de todos os eventos de anúncio. Para mais detalhes, consulte Monitorar e resolver problemas de uma transmissão ao vivo.