廣告規則

IMA HTML5 SDK 支援全自動廣告播放清單。這項功能 可將廣告插播時間點插入內容 Google Ad Manager 所需的資訊這也大幅簡化了影片播放器程式碼 包括片頭廣告、片中廣告和片尾廣告。

  • 建立 AdsManager 時,contentPlayback 物件會透過 getAdsManager 傳入 呼叫。這個物件必須 具有會傳回目前播放頭的 currentTime 屬性 影片的位置。如果您使用 HTML5 video 元素 就可以將該元素傳遞至 SDK。這個物件 可用來追蹤內容播放進度, 在 Ad Manager 中指定的時間自動插入您也需要讓 SDK 知道您想要由 SDK 代為處理內容狀態。
    var adsRenderingSettings = new google.ima.AdsRenderingSettings();
    adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true;
    adsManager = adsManagerLoadedEvent.getAdsManager(
        videoContent, adsRenderingSettings); // See API reference for
        
        contentPlayback.
    
  • 為確保片尾廣告能順利播放,您需要讓 SDK 得知內容 更新完畢。這有點棘手,因為 SDK 有時會使用您的影片 播放器來播放廣告,因此您必須確定只在 而非廣告結束播放。方法是使用 程式碼如下:
    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);
      ...
    }
  • CONTENT_PAUSE_REQUESTEDCONTENT_RESUME_REQUESTED 事件,以便在廣告出現時暫停並繼續播放內容。
  • 如果您的影片播放器支援拖曳功能,且目前時間屬性 影片播放器會在使用者拖曳時更新,但 SDK 無法區分 之間的空缺。 您必須使用自訂 contentPlayback 物件做為 getAdsManager 的參數。 如需這個用途的範例,請參閱「探索問題」。

注意:內容播放完畢或是 使用者停止播放,請務必呼叫 AdsLoader.contentComplete 用來向 SDK 指出內容已完成。接著,SDK 會播放 片尾廣告時段 (如果已排程的話)。ALL_ADS_COMPLETED 事件。另外,請注意 而內容追蹤會在呼叫 init() 時開始,而 在播放內容前一律呼叫 init()

停用廣告插播自動播放功能

在某些情況下,您可能希望 SDK 不要在廣告出現前, 才能一探究竟在這種情況下,你可以停用自動播放廣告插播功能 ,藉此通知 SDK 準備好要播放廣告插播時間點。使用這項 SDK 載入廣告時段後,就會觸發 AD_BREAK_READY事件。播放器準備好要開始廣告插播後 可以呼叫 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();
}

立即試用

您可以在下方查看運作中的實作方式。

跳轉時發生問題

如果您使用廣告規則,可能會遇到按住拖曳手勢的問題, 具體來說,當使用者點擊並拖曳影片時,在多個影片中跳過多個片段後 片中廣告的廣告連播數量中,可能會看到 2 個以上的 Pod 重複播放 內容繼續播放。這是因為在 使用者尋找的內容當使用者進行 SDK 輪詢時 避開了廣告,系統可能會認為應播放廣告。當內容 此時,系統會播放該廣告,然後播放上次跳轉後的最新廣告。換 這個問題的示意圖,如下圖所示:

要解決這個問題,最簡單的方法就是在使用者開始玩遊戲時節省時間 並回報 SDK 要求的時間 就會恢復正常播放。如需此解決方案的示意圖,請參閱 下圖:

只要使用這個解決方案,你就能適當略過 0:10 的片中廣告,只播放 0:20 的片中廣告。 請使用自訂播放頭追蹤程式進行這項操作,如下所示。以下程式碼 包含進階 HTML5 中的 ads.js 修改內容 (以粗體顯示) 您可以在 下載網頁

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

Safari 行動版的已知問題

這個方法適用於行動版 Safari 以外的所有表單。使用行動裝置 Safari,因為影片廣告代碼的尋找屬性並未正確導入 ( 一律傳回 false)。因此你必須自行檢查 看看使用者是否看完整部影片這個方法的程式碼範例 後面。再次提醒您,下方以粗體顯示的程式碼是修改現有程式碼。

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

經過這些變更,SDK 現已使用 Ads 的 currentTime 屬性 物件以決定何時播放廣告插播,而不是currentTime 內容影片播放器