Este guia descreve como inserir intervalos de anúncio usando o método de metadados de tempo de conjunto de anúncios (ATM) para buscar o tempo e a duração exatos dos intervalos, incluindo anúncios precedentes.
Para inserir anúncios precedentes e gerenciar o retorno ao conteúdo após intervalos de anúncios intermediários, recomendamos chamar as seguintes APIs:
- API de metadados de tempo de conjunto de anúncios (ATM): consulta os resultados da decisão de conjunto de anúncios, incluindo durações de anúncios e de inserção.
- Endpoint de segmento de anúncio: solicite segmentos de anúncio ou inserções com a opção de encerrar o conjunto de anúncios atual.
Opcionalmente, para eventos de transmissão ao vivo com alta simultaneidade, recomendamos chamar a API Early Ad Break Notification (EABN) para programar decisões de anúncio antes do início do intervalo de anúncio.
Pré-requisitos
Para começar, você precisa configurar um evento de transmissão ao vivo para o tipo de Inserção de anúncios dinâmicos (DAI) de redirecionamento de veiculação de pods. Escolha um dos seguintes métodos:
- Interface do Ad Manager:configure uma transmissão ao vivo para DAI.
- API Ad Manager:use uma biblioteca de cliente (opções
disponíveis) para chamar o método
LiveStreamEventService.createLiveStreamEvents. Defina o parâmetroLiveStreamEvent.dynamicAdInsertionTypecomoPOD_SERVING_REDIRECT.
Recuperar o stream de conteúdo
Quando um usuário seleciona um evento de transmissão ao vivo, o app cliente faz uma solicitação de streaming para o Google Ad Manager. Na resposta de stream, o app extrai o ID da sessão e os metadados da DAI do Google para incluir na solicitação de manifesto de stream.
O exemplo a seguir transmite um ID de sessão da DAI do Google para um manipulador de manifesto:
https://MANIFEST_MANIPULATOR_URL/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY
Ao processar a solicitação de reprodução de conteúdo de vídeo, armazene o ID da sessão da DAI do Google e CUSTOM_ASSET_KEY da solicitação para se preparar para a junção de anúncios.
Recuperar metadados de marcação de tempo de um conjunto de anúncios
Para recuperar a marcação de tempo do conjunto de anúncios, siga estas etapas:
- Gere um token HMAC.
- Chame a API ATM com o token HMAC.
Solicitar metadados de tempo para anúncios precedentes
Verifique as configurações de anúncio precedente do seu evento de transmissão ao vivo usando as seguintes opções:
Para recuperar os resultados da decisão de anúncio precedente, faça uma solicitação à API ATM.
O exemplo a seguir faz uma solicitação de ATM para anúncios precedentes:
curl "https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/pod.json?stream_id=SESSION_ID&ad_break_id=preroll&auth-token=your_signed_HMAC_token"
Solicitar metadados de tempo para anúncios intermediários
Para recuperar metadados de um conjunto de anúncios intermediários, siga estas etapas:
- Analise o manifesto da transmissão ao vivo para encontrar os marcadores de anúncio que contêm o tempo e a duração de cada intervalo de anúncio intermediário.
- Chame o endpoint da API ATM para solicitar a duração exata do conjunto de anúncios e da inserção. A API retorna um objeto JSON com os resultados da decisão do conjunto de anúncios.
O exemplo a seguir faz uma solicitação de ATM para anúncios intermediários:
curl "https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/pod.json?stream_id=SESSION_ID&ad_break_id=AD_BREAK_ID&pd=AD_BREAK_DURATION&auth-token=your_signed_HMAC_token"
Se for bem-sucedido, você vai ver uma saída semelhante ao seguinte objeto JSON:
{
"status": "final",
"ads": [
{
"duration_ms": 5046,
"variants": {
"devrel1428000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5045
]
}
},
"devrel1928000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5045
]
}
}
}
}
],
"slate": {
"duration_ms": 0,
"variants": {
"devrel1428000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5005,
...
5046
]
}
},
"devrel1928000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5005,
...
5046
]
}
}
}
}
}
Inserir anúncios no manifesto de conteúdo
As seções a seguir explicam como modificar o manifesto da transmissão ao vivo e adicionar os segmentos de anúncio.
Identificar segmentos de intervalo de anúncio e inserir descontinuidades
Ao processar cada manifesto de variante, identifique as tags EXT-X-CUE-IN e
EXT-X-CUE-OUT no seu stream, indicando o início e o fim de um
intervalo de anúncio.
Substitua as tags EXT-X-CUE-IN e EXT-X-CUE-OUT pelos elementos EXT-X-DISCONTINUITY para que o player de vídeo do cliente alterne entre conteúdo e anúncios.
O manifesto de exemplo a seguir substitui as tags EXT-X-CUE-IN e EXT-X-CUE-OUT:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXT-X-CUE-OUT:17.450
#EXTINF:5.000,
contentorigin.com/3.ts
#EXTINF:5.000,
contentorigin.com/4.ts
#EXTINF:5.000,
contentorigin.com/5.ts
#EXTINF:2.450,
contentorigin.com/6.ts
#EXT-X-CUE-IN
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
O exemplo a seguir mostra um manifesto substituído:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXTINF:5.000,
#EXT-X-DISCONTINUITY
{... Insert ad segments here ...}
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
Os segmentos de anúncios da DAI do Google não são criptografados. Se o conteúdo estiver criptografado, remova a criptografia inserindo o elemento EXT-X-KEY:METHOD=NONE antes do primeiro segmento de anúncio de cada intervalo de anúncio. No final do intervalo de anúncio, adicione a criptografia novamente inserindo um EXT-X-KEY adequado.
Acompanhe o horário de início, a duração e o índice do próximo intervalo de anúncio futuro.
Criar URLs de segmentos de anúncios
Substitua os segmentos de conteúdo entre as tags EXT-X-DISCONTINUITY por URLs de cada segmento de anúncio. Para determinar quantos segmentos de anúncio inserir, use o
ads.segment_durations.values fornecido na resposta JSON da API ATM.
Para voltar ao conteúdo antes da conclusão do conjunto de anúncios, como ao detectar uma tag
EXT-X-CUE-IN, o manipulador de manifesto
precisa adicionar o parâmetro d= ao URL do segmento final do anúncio.
Esse parâmetro encurta o segmento para evitar afetar a linha do tempo do player de vídeo do cliente.
O exemplo a seguir cria um URL de segmento de anúncio precedente no manifesto. Observação: os segmentos de anúncios usam um índice com base em zero:
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/preroll/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
O exemplo a seguir monta um URL de segmento de anúncio intermediário no manifesto:
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
O exemplo a seguir insere segmentos de anúncio no manifesto:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
#EXTINF:5.000,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/1.ts?stream_id=SESSION_ID
#EXTINF:5.000,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/2.ts?stream_id=SESSION_ID
#EXTINF:2.450,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/3.ts?stream_id=SESSION_ID
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
Criar segmentos de inserção
Para preencher a lacuna entre o anúncio e o conteúdo, insira segmentos de inserção.
Use a matriz slates.segment_durations.values da resposta JSON da API ATM para determinar a duração de cada segmento de bloco. Faça um loop na sequência de durações de segmento conforme necessário para preencher todo o intervalo de anúncio.
Para voltar ao conteúdo antes da conclusão do conjunto de anúncios, como ao detectar uma tag
EXT-X-CUE-IN, adicione o parâmetro d= ao URL do segmento
final de inserção. Esse parâmetro encurta o segmento para evitar afetar a linha do tempo do player de vídeo do cliente. O valor dos parâmetros d= precisa ser um número inteiro que represente a duração em milissegundos para encurtar o segmento.
O exemplo a seguir monta um segmento de programação:
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/slate/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
O slate/0 no exemplo representa o número da iteração da tela. Consulte a compatibilidade e a capacidade de armazenamento em cache do player de vídeo do cliente para determinar se você deve começar em 0 e aumentar esse número a cada loop da lista ou manter em 0 para todas as iterações.
Gerenciar o retorno ao conteúdo
Depois que o manipulador de manifesto inserir todos os segmentos do conjunto de anúncios, ele precisará voltar para o stream de conteúdo. Para voltar ao stream de conteúdo, escolha um dos métodos a seguir. Cada método exige um segmento de realinhamento final para manter a linha do tempo do stream precisa.
Preencher e realinhar:insira os segmentos de claquete e faça um loop.
Preencha a duração e insira elementos EXT-X-DISCONTINUITY entre cada iteração
de lista. Para o último segmento, adicione o parâmetro d= em milissegundos para corresponder ao início do conteúdo.
Retorno imediato:insira um único segmento de reajuste usando o parâmetro d= e seguindo com o conteúdo.
O player de vídeo volta ao conteúdo sem uma linha do tempo alterada.
O exemplo a seguir cria uma transição preenchendo o restante da duração do intervalo de anúncio com segmentos de inserção.
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
#EXTINF:5.000,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/1.ts?stream_id=SESSION_ID
#EXTINF:5.000,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/slate/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
#EXT-X-DISCONTINUITY
#EXTINF:2.450,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/slate/0/profile/ENCODING_PROFILE/1.ts?stream_id=SESSION_ID&d=2450
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
Nesse método, o manipulador de manifesto faz um loop da tela conforme necessário e anexa o parâmetro de URL d= apenas ao último segmento da tela. Esse processo se alinha precisamente com o início programado do conteúdo.
O exemplo a seguir mostra como usar um único segmento de inserção com o parâmetro d= para manter a linha do tempo do player precisa quando você não preenche todo o restante do intervalo com inserções em loop.
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
#EXTINF:5.000,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/1.ts?stream_id=SESSION_ID
#EXTINF:5.000,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/2.ts?stream_id=SESSION_ID
#EXT-X-DISCONTINUITY
#EXTINF:2.450,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/slate/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID&d=2450
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
Opcional: programar um intervalo de anúncio
Para aumentar sua taxa de preenchimento, envie uma notificação de intervalo de anúncio antecipado (EABN) com a duração do conjunto de anúncios, parâmetros de segmentação personalizada e dados de sinal SCTE-35. Para mais detalhes, consulte Enviar notificações antecipadas de intervalo de anúncio.