O SDK HTML5 do IMA oferece suporte a playlists de anúncios totalmente automatizadas. Esse recurso insere intervalos de anúncios no conteúdo conforme especificado no Google Ad Manager ao veicular seus anúncios. Ele também simplifica muito o código do player de vídeo necessário para oferecer suporte a intervalos de anúncios, incluindo anúncios precedentes, intermediários e finais.
- Ao criar o
AdsManager
, um objetocontentPlayback
é transmitido usando a chamada getAdsManager. Esse objeto precisa ter uma propriedadecurrentTime
que retorne a posição atual do controle de reprodução do vídeo. Se você estiver usando um elementovideo
HTML5 para mostrar seu conteúdo, basta transmitir esse elemento para o SDK. Esse objeto é usado para acompanhar o progresso da reprodução do conteúdo para que os intervalos de anúncios sejam inseridos automaticamente nos horários especificados no Ad Manager. Você também precisa informar ao SDK que quer que ele gerencie o estado do conteúdo em seu nome.var adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsManager = adsManagerLoadedEvent.getAdsManager( videoContent, adsRenderingSettings); // See API reference for contentPlayback.
- Para garantir que os anúncios pós-rolagem sejam veiculados, informe ao SDK quando o conteúdo
for concluído. Isso é um pouco complicado, porque, em alguns casos, o SDK usa o player de vídeo
para exibir anúncios. Portanto, informe ao SDK apenas quando
o conteúdo for concluído, e não quando um anúncio for concluído. Para fazer isso, use o
seguinte código:
var videoContent = document.getElementById('contentElement'); var contentEndedListener = function() {adsLoader.contentComplete();}; videoContent.addEventListener('ended', contentEndedListener); function onContentPauseRequested() { contentElement.removeEventListener('ended', contentEndedListener); ... } function onContentResumeRequested() { contentElement.addEventListener('ended', contentEndedListener); ... }
- Os eventos
CONTENT_PAUSE_REQUESTED
eCONTENT_RESUME_REQUESTED
são usados para pausar e retomar o conteúdo quando os intervalos de anúncio são reproduzidos. - Se o player de vídeo oferecer suporte ao recurso de arrastar para procurar e a propriedade de tempo atual do
player for atualizada enquanto o usuário estiver arrastando, o SDK não poderá diferenciar
entre o conteúdo que está sendo reproduzido normalmente e um usuário que está procurando pelo conteúdo.
É necessário usar um objeto contentPlayback personalizado como parâmetro para
getAdsManager
. Para conferir um exemplo desse caso de uso, consulte Os problemas com a busca.
Observação:quando o conteúdo terminar de ser reproduzido ou
o usuário interromper a reprodução, chame AdsLoader.contentComplete
para sinalizar ao SDK que o conteúdo foi concluído. Em seguida, o SDK vai reproduzir
o intervalo de anúncios pós-rolagem, se um tiver sido programado. O evento ALL_ADS_COMPLETED
é gerado quando TODOS os intervalos de anúncio são reproduzidos. Além disso, o rastreamento de conteúdo começa quando init()
é chamado, e você precisa
sempre chamar init()
antes de reproduzir o conteúdo.
Desativar a reprodução automática de intervalos de anúncio
Em algumas circunstâncias, talvez seja necessário impedir que o SDK reproduza intervalos de anúncios até
que você esteja pronto para eles. Nesse cenário, é possível desativar a reprodução automática de intervalos de anúncio
para informar ao SDK quando você estiver pronto para exibir um intervalo de anúncio. Com essa
configuração, depois que o SDK carrega um intervalo de anúncio, ele dispara um
evento AD_BREAK_READY
. Quando o player estiver pronto para iniciar o intervalo de anúncios,
chame adsManager.start():
function requestAds() {} ... adsLoader.getSettings().setAutoPlayAdBreaks(false); ... } function onAdsManagerLoaded() { ... // For non-auto ad breaks, listen for ad break ready adsManager.addEventListener( google.ima.AdEvent.Type.AD_BREAK_READY, adBreakReadyHandler); ... } function adBreakReadyHandler() { // Once we're ready to play ads. To skip this ad break, simply return // from this handler without calling adsManager.start(). adsManager.start(); }
Faça um teste
Confira o código abaixo para ver uma implementação funcional.
O problema com a busca
Se você usa regras de anúncio, pode encontrar um problema com a busca de clique e arrasto. Especificamente, depois que um usuário clica e arrasta para procurar no vídeo depois de vários vídeos, ele pode ver dois ou mais desses vídeos sendo reproduzidos um após o outro antes de o conteúdo ser retomado. Isso é causado pela atualização do tempo do indicador de reprodução do vídeo enquanto o usuário está buscando. Se o SDK detectar o tempo atual enquanto o usuário passa por um anúncio, ele pode pensar que o anúncio precisa ser reproduzido. Quando o conteúdo é retomado, ele exibe esse anúncio e, em seguida, o mais recente desde a busca. Para uma representação visual desse problema, consulte o diagrama a seguir:

Salve a hora atual quando o usuário começar a buscar e informe essa hora quando o SDK pedir até que o usuário retome a reprodução normal. Para uma representação visual dessa solução, consulte o diagrama a seguir:

Com essa solução, você pula corretamente o anúncio intermediário de 0:10 e exibe apenas o de 0:20.
Isso é feito usando um rastreador de playhead personalizado no snippet de código abaixo. Esse código
contém modificações (mostradas em negrito) de ads.js
no exemplo avançado de
HTML5 disponível na
página de download.
var Ads = function(application, videoPlayer) { ... this.currentTime = 0; setInterval(this.updateCurrentTime, 1000); }; Ads.prototype.updateCurrentTime = function() { if (!this.videoPlayer_.contentPlayer.seeking) { this.currentTime = this.videoPlayer_.contentPlayer.currentTime; } }; Ads.prototype.onAdsManagerLoaded_ = function(adsManagerLoadedEvent) { this.application_.log('Ads loaded.'); this.adsManager_ = adsManagerLoadedEvent.getAdsManager(this); this.processAdsManager_(this.adsManager_); };
Problemas conhecidos com o Safari para dispositivos móveis
Esse método deve funcionar em todas as plataformas, exceto no Safari para dispositivos móveis. No Safari para dispositivos móveis, a propriedade de busca da tag de vídeo não é implementada corretamente (ela sempre retorna "false"). Para contornar isso, você precisa fazer sua própria verificação para verificar se o usuário está avançando o vídeo. Confira o exemplo de código para este método. Novamente, as linhas em negrito são modificações no código atual.
var Ads = function(application, videoPlayer) { ... this.currentTime = 0; setInterval(this.updateCurrentTime, 1000); this.seeking = false; this.seekCheckInterval = 1000; // You may need to adjust this value, depending on your platform this.seekThreshold = 100; this.previousTime = 0; setInterval( Application.bind(this, this.checkForSeeking), this.seekCheckInterval); }; Ads.prototype.updateCurrentTime = function() { if (!this.seeking) { this.currentTime = this.videoPlayer_.contentPlayer.currentTime; } }; Ads.prototype.checkForSeeking = function() { var currentTime = this.videoPlayer_.contentPlayer.currentTime; // How much time has passed since you last ran this method, in milliseconds var diff = (currentTime - this.previousTime) * 1000; // If that difference is greater than the time since you last ran this method, // plus the threshold, the user was seeking if (Math.abs(diff) > this.interval + this.threshold) { this.seeking = true; } else { this.seeking = false; } // Grab the current video time again to make up for time spent in this method previousTime = this.videoPlayer_.contentPlayer.currentTime; }; Ads.prototype.onAdsManagerLoaded_ = function(adsManagerLoadedEvent) { this.application_.log('Ads loaded.'); this.adsManager_ = adsManagerLoadedEvent.getAdsManager(this); this.processAdsManager_(this.adsManager_); };
Com essas mudanças, o SDK agora usa a propriedade currentTime do objeto Ads
para determinar quando reproduzir intervalos de anúncios, e não a propriedade currentTime
do
player de vídeo de conteúdo.