สร้างคลาสตัวจัดการโฆษณา

ใน ads_manager.js ให้กําหนดคลาส Wrapper สําหรับ IMA SDK StreamManager ที่ส่งคําขอสตรีม รับไฟล์ Manifest ของพ็อดโฆษณา ฟังเหตุการณ์สตรีม IMA และส่งเหตุการณ์ emsg ไปยัง IMA SDK

ใน ads_manager.js แอปตัวอย่าง IMA HbbTV จะตั้งค่าวิธีการต่อไปนี้

  • requestStream()
  • onStreamEvent()
  • onEmsgEvent()
  • loadAdPodManifest()

เริ่มต้นใช้งานตัวจัดการโฆษณา

เริ่มต้นคลาสตัวจัดการโฆษณาและตั้งค่า Listener สำหรับเหตุการณ์สตรีม IMA ในสายนี้ ให้ตั้งค่าตัวแฮนเดิลเหตุการณ์ emsg ด้วยเมธอด VideoPlayer.setEmsgEventHandler()

/**
 * Wraps IMA SDK ad stream manager.
 * @param {!VideoPlayer} videoPlayer Reference an instance of the wrapper from
 * video_player.js.
 */
var AdManager = function(videoPlayer) {
  this.streamData = null;
  this.videoPlayer = videoPlayer;
  // Ad UI is not supported for HBBTV, so no 'adUiElement' is passed in the
  // StreamManager constructor.
  this.streamManager = new google.ima.dai.api.StreamManager(
      this.videoPlayer.videoElement);
  this.streamManager.addEventListener(
      [
        google.ima.dai.api.StreamEvent.Type.STREAM_INITIALIZED,
        google.ima.dai.api.StreamEvent.Type.ERROR,
        google.ima.dai.api.StreamEvent.Type.CLICK,
        google.ima.dai.api.StreamEvent.Type.STARTED,
        google.ima.dai.api.StreamEvent.Type.FIRST_QUARTILE,
        google.ima.dai.api.StreamEvent.Type.MIDPOINT,
        google.ima.dai.api.StreamEvent.Type.THIRD_QUARTILE,
        google.ima.dai.api.StreamEvent.Type.COMPLETE,
        google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED,
        google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED,
        google.ima.dai.api.StreamEvent.Type.AD_PROGRESS,
        google.ima.dai.api.StreamEvent.Type.PAUSED,
        google.ima.dai.api.StreamEvent.Type.RESUMED
      ],
      this.onStreamEvent.bind(this),
      false);

  this.videoPlayer.setEmsgEventHandler(this.onEmsgEvent, this);
};

สร้างคำขอสตรีมพ็อดโฆษณา

สร้างเมธอด AdManager.requestStream() เพื่อสร้างออบเจ็กต์ PodStreamRequest โดยใช้โค้ดเครือข่าย Google Ad Manager และคีย์เนื้อหาที่กำหนดเองของสตรีม ทดสอบแอป HbbTV โดยใช้สตรีมที่ให้บริการพ็อด DASH ตัวอย่างของ IMA ที่มีพารามิเตอร์สตรีมต่อไปนี้

  • รหัสเครือข่าย: '21775744923'
  • คีย์เนื้อหาที่กำหนดเอง: 'hbbtv-dash'
/**
 * Makes a pod stream request.
 * @param {string} networkCode The network code.
 * @param {string} customAssetKey The custom asset key.
 */
AdManager.prototype.requestStream = function(networkCode, customAssetKey) {
  var streamRequest = new google.ima.dai.api.PodStreamRequest();
  streamRequest.networkCode = networkCode;
  streamRequest.customAssetKey = customAssetKey;
  streamRequest.format = 'dash';
  debugView.log('AdsManager: make PodStreamRequest');
  this.streamManager.requestStream(streamRequest);
};

ฟังเหตุการณ์สตรีมโฆษณา

สร้างเมธอด AdManager.onStreamEvent() เพื่อจัดการการตอบสนองของแอปต่อเหตุการณ์สตรีม IMA ซึ่งได้แก่ STREAM_INITIALIZED, AD_BREAK_STARTED และ AD_BREAK_ENDED

/**
 * Handles IMA playback events.
 * @param {!Event} event The event object.
 */
AdManager.prototype.onStreamEvent = function(event) {
  switch (event.type) {
    // Once the stream response data is received, generate pod manifest url
    // for the video stream.
    case google.ima.dai.api.StreamEvent.Type.STREAM_INITIALIZED:
      debugView.log('IMA SDK: stream initialized');
      this.streamData = event.getStreamData();
      break;
    case google.ima.dai.api.StreamEvent.Type.ERROR:
      break;
    // Hide video controls while ad is playing.
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED:
      debugView.log('IMA SDK: ad break started');
      this.adPlaying = true;
      this.adBreakStarted = true;
      break;
    // Show video controls when ad ends.
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED:
      debugView.log('IMA SDK: ad break ended');
      this.adPlaying = false;
      this.adBreakStarted = false;
      break;
    // Update ad countdown timers.
    case google.ima.dai.api.StreamEvent.Type.AD_PROGRESS:
      break;
    default:
      debugView.log('IMA SDK: ' + event.type);
      break;
  }
};

จัดการข้อมูลเมตาของสตรีมโฆษณา

หากต้องการส่งข้อมูลเหตุการณ์อีเมลไปยัง IMA ให้สร้างเมธอด AdManager.onEmsgEvent() โดยใช้เมธอด StreamManager.processMetadata() คลาสโปรแกรมเล่นวิดีโอเรียกใช้เมธอดนี้ด้วยเมธอด VideoPlayer.setEmsgEventHandler()

/**
 * Callback on Emsg event.
 * Instructs IMA SDK to fire back VAST events accordingly.
 * @param {!Event} event The event object.
 */
AdManager.prototype.onEmsgEvent = function(event) {
  var data = event.event.messageData;
  var pts = event.event.calculatedPresentationTime;
  if ((data instanceof Uint8Array) && data.byteLength > 0) {
    this.streamManager.processMetadata('ID3', data, pts);
  }
};

โหลดไฟล์ Manifest ของพ็อดโฆษณา

สร้างเมธอด AdManager.loadAdPodManifest() เพื่อโหลดไฟล์ Manifest ของพ็อดโฆษณาล่วงหน้าด้วยโปรแกรมเล่นวิดีโอ สร้าง URL ของไฟล์ Manifest โดยใช้โครงสร้างในเมธอด: ไฟล์ Manifest ของพ็อด DASH

/**
 * Creates DAI pod url and instructs video player to load manifest.
 * @param {string} networkCode The network code.
 * @param {string} customAssetKey The custom asset key.
 * @param {number} podDuration The duration of the ad pod.
 */
AdManager.prototype.loadAdPodManifest =
    function(networkCode, customAssetKey, podDuration) {
  if (!this.streamData) {
    debugView.log('IMA SDK: No DAI pod session registered.');
    return;
  }

  var MANIFEST_BASE_URL = 'https://dai.google.com/linear/pods/v1/dash/network/';
  // Method: DASH pod manifest reference docs:
  // https://developers.google.com/ad-manager/dynamic-ad-insertion/api/pod-serving/reference/live#method_dash_pod_manifest
  var manifestUrl = MANIFEST_BASE_URL + networkCode + '/custom_asset/' +
    customAssetKey + '/stream/' + this.streamData.streamId + '/pod/' +
    this.getPodId() + '/manifest.mpd?pd=' + podDuration;
  this.videoPlayer.preload(manifestUrl);
};

แอปตัวอย่าง HbbTV ใช้ podId ที่ไม่ซ้ำกันซึ่งสร้างขึ้นแบบสุ่ม ในแอปเวอร์ชันที่ใช้งานจริง podId คือจำนวนเต็มที่เริ่มต้นที่ 1 และเพิ่มทีละ 1 ค่าสำหรับช่วงพักโฆษณาแต่ละช่วง ตรวจสอบว่า podId มีค่าเดียวกันสำหรับผู้ชมทุกคนของช่วงพักโฆษณา หากต้องการรับ podId เราขอแนะนำให้ใช้ การแจ้งเตือนช่วงพักโฆษณาล่วงหน้า (EABN) API ในสภาพแวดล้อมเวอร์ชันที่ใช้งานจริง ให้ใส่ podId และ podDuration ในเหตุการณ์สตรีม HbbTV AD_BREAK_ANNOUNCE

ถัดไป ให้สร้างคลาสแอปพลิเคชันหลักสำหรับแอป HbbTV ที่โต้ตอบกับการออกอากาศ HbbTV