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 objeto- LiveStreamEvente a propriedade- dynamicAdInsertionTypedefinida como o valor de enumeração- POD_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-urlencodedou- application/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 objeto- tagsé uma matriz de objetos- TagSegment.
- Use o ID completo do evento de anúncio para encontrar um objeto - TagSegmentcom o tipo- progress.
- 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 propriedade- ad_break_idcomo chave para encontrar o objeto- AdBreakno objeto- ad_breaksde metadados do anúncio.- O exemplo a seguir encontra um objeto - AdBreak:- { "type":"mid", "duration":15, "ads":1 }
- Use os dados - TagSegmente- AdBreakpara 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 erro- 404.
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.