ตั้งค่า IMA SDK สําหรับ DAI

IMA SDK ช่วยให้ผสานรวมโฆษณามัลติมีเดียเข้ากับเว็บไซต์และแอปได้อย่างง่ายดาย IMA SDK สามารถ ขอโฆษณาจากเซิร์ฟเวอร์โฆษณา ที่รองรับ VAST และจัดการการเล่นโฆษณาในแอปได้ เมื่อใช้ IMA DAI SDK แอปจะส่ง คำขอสตรีมสำหรับโฆษณาและเนื้อหาวิดีโอ ไม่ว่าจะเป็นเนื้อหา VOD หรือเนื้อหาสด จากนั้น SDK จะแสดงสตรีมวิดีโอที่รวมกัน เพื่อให้คุณไม่ต้องจัดการการสลับระหว่างโฆษณาและวิดีโอเนื้อหา ภายในแอป

เลือกโซลูชัน DAI ที่คุณสนใจ

DAI แบบครบวงจร

คู่มือนี้แสดงวิธีผสานรวม IMA DAI SDK เข้ากับแอปวิดีโอเพลเยอร์ หากต้องการดูหรือทำตามตัวอย่างการผสานรวมที่เสร็จสมบูรณ์แล้ว ให้ดาวน์โหลดตัวอย่างแบบง่ายจาก GitHub

ภาพรวม IMA DAI

การติดตั้งใช้งาน IMA DAI SDK มีองค์ประกอบหลัก 2 อย่างตามที่แสดงใน คู่มือนี้

  • StreamRequest VODStreamRequest หรือ LiveStreamRequest: ออบเจ็กต์ที่กำหนดคำขอสตรีม คำขอสตรีมอาจเป็นคำขอสำหรับวิดีโอออนดีมานด์หรือไลฟ์สดก็ได้ คำขอไลฟ์สดจะระบุคีย์เนื้อหา ส่วนคำขอ VOD จะระบุรหัส CMS และรหัสวิดีโอ คำขอทั้ง 2 ประเภทอาจมีคีย์ API ที่จำเป็นต่อการเข้าถึงสตรีมที่ระบุ และรหัสเครือข่าย Google Ad Manager สำหรับ IMA SDK เพื่อจัดการตัวระบุโฆษณาตามที่ระบุในการตั้งค่า Google Ad Manager
  • StreamManager: ออบเจ็กต์ที่จัดการสตรีมการแทรกโฆษณาแบบไดนามิกและการโต้ตอบกับแบ็กเอนด์ DAI นอกจากนี้ ตัวจัดการสตรีมยังจัดการการติดตาม Ping และส่งต่อเหตุการณ์สตรีมและโฆษณาไปยัง ผู้เผยแพร่โฆษณาด้วย

ข้อกำหนดเบื้องต้น

  • ไฟล์ว่าง 3 ไฟล์
    • dai.html
    • dai.css
    • dai.js
  • ติดตั้ง Python ในคอมพิวเตอร์หรือเว็บเซิร์ฟเวอร์เพื่อใช้ในการทดสอบ

เริ่มเซิร์ฟเวอร์การพัฒนา

เนื่องจาก IMA DAI SDK โหลดการขึ้นต่อกันโดยใช้โปรโตคอลเดียวกับหน้าเว็บที่โหลด SDK คุณจึงต้องใช้เว็บเซิร์ฟเวอร์เพื่อทดสอบแอป วิธีที่รวดเร็วในการเริ่มต้นเซิร์ฟเวอร์การพัฒนาในเครื่องคือการใช้เซิร์ฟเวอร์ในตัวของ Python

  1. ใช้บรรทัดคำสั่งจากไดเรกทอรีที่มีไฟล์ index.html เรียกใช้คำสั่งต่อไปนี้

    python -m http.server 8000
  2. ในเว็บเบราว์เซอร์ ให้ไปที่ http://localhost:8000/

    คุณยังใช้เว็บเซิร์ฟเวอร์อื่นๆ เช่น Apache HTTP Server ได้ด้วย

สร้างวิดีโอเพลเยอร์

ก่อนอื่น ให้แก้ไข dai.html เพื่อสร้างองค์ประกอบวิดีโอ HTML5 และ div เพื่อใช้สำหรับการคลิกผ่าน ตัวอย่างต่อไปนี้จะนำเข้า IMA DAI SDK ดูรายละเอียดเพิ่มเติมได้ที่นำเข้า IMA DAI SDK

นอกจากนี้ ให้เพิ่มแท็กที่จำเป็นเพื่อโหลดไฟล์ dai.css และ dai.js รวมถึงเพื่อนำเข้าวิดีโอเพลเยอร์ hls.js จากนั้น แก้ไข dai.css เพื่อระบุขนาดและตำแหน่งขององค์ประกอบหน้าเว็บ สุดท้ายใน dai.js ให้กำหนดตัวแปรเพื่อเก็บข้อมูลคำขอสตรีม ฟังก์ชัน initPlayer() ที่จะเรียกใช้เมื่อหน้าเว็บโหลด และตั้งค่า ปุ่มเล่นเพื่อขอสตรีมเมื่อคลิก

<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
  <script src="//imasdk.googleapis.com/js/sdkloader/ima3_dai.js"></script>
  <script src="dai.js"></script>
  <link rel="stylesheet" href="dai.css">
</head>
<body onLoad="initPlayer()">
  <h2>IMA SDK DAI Demo (HLS.JS)</h2>
  <video id="video"></video>
  <div id="adUi"></div>
  <button id="play-button">Play</button>
</body>
</html>

#video,
#adUi {
  width: 640px;
  height: 360px;
  position: absolute;
  top: 35px;
  left: 0;
}

#adUi {
  cursor: pointer;
}

#play-button {
  position: absolute;
  top: 400px;
  left: 15px;
}
// This stream will be played if ad-enabled playback fails.
const BACKUP_STREAM =
    'http://storage.googleapis.com/testtopbox-public/video_content/bbb/' +
    'master.m3u8';

// Live stream asset key.
// const TEST_ASSET_KEY = 'c-rArva4ShKVIAkNfy6HUQ';

// VOD content source and video IDs.
const TEST_CONTENT_SOURCE_ID = '2548831';
const TEST_VIDEO_ID = 'tears-of-steel';

// Ad Manager network code.
const NETWORK_CODE = '21775744923';
const API_KEY = null;

// StreamManager which will be used to request ad-enabled streams.
let streamManager;

// hls.js video player
const hls = new Hls();

// Video element
let videoElement;

// Ad UI element
let adUiElement;

// The play/resume button
let playButton;

// Whether the stream is currently in an ad break.
let adBreak = false;

/**
 * Initializes the video player.
 */
function initPlayer() {
  videoElement = document.getElementById('video');
  playButton = document.getElementById('play-button');
  adUiElement = document.getElementById('adUi');
  createStreamManager();
  listenForMetadata();

  // Show the video controls when the video is paused during an ad break,
  // and hide them when ad playback resumes.
  videoElement.addEventListener('pause', () => {
    if (adBreak) {
      showVideoControls();
    }
  });
  videoElement.addEventListener('play', () => {
    if (adBreak) {
      hideVideoControls();
    }
  });

  playButton.addEventListener('click', () => {
    console.log('initiatePlayback');
    requestStream();
    // Hide this play button after the first click to request the stream.
    playButton.style.display = 'none';
  });
}

หากต้องการเล่นต่อในระหว่างช่วงพักโฆษณาที่หยุดชั่วคราว ให้ตั้งค่าเครื่องมือฟังเหตุการณ์สำหรับเหตุการณ์ pause และ start ขององค์ประกอบวิดีโอ เพื่อแสดงและซ่อนตัวควบคุมวิดีโอเพลเยอร์

/**
 * Hides the video controls.
 */
function hideVideoControls() {
  videoElement.controls = false;
  adUiElement.style.display = 'block';
}

/**
 * Shows the video controls.
 */
function showVideoControls() {
  videoElement.controls = true;
  adUiElement.style.display = 'none';
}

โหลด IMA DAI SDK

จากนั้นเพิ่มเฟรมเวิร์ก IMA โดยใช้แท็กสคริปต์ใน dai.html ก่อนแท็กสำหรับ dai.js

<script src="//imasdk.googleapis.com/js/sdkloader/ima3_dai.js"></script>

เริ่มต้น StreamManager

หากต้องการขอชุดโฆษณา ให้สร้าง ima.dai.api.StreamManager ซึ่ง มีหน้าที่รับผิดชอบในการขอและจัดการสตรีม DAI ตัวสร้างจะใช้องค์ประกอบวิดีโอและองค์ประกอบ UI ของโฆษณาเพื่อจัดการการคลิกโฆษณา

/**
 * Create the StreamManager and listen to stream events.
 */
function createStreamManager() {
  streamManager =
      new google.ima.dai.api.StreamManager(videoElement, adUiElement);
  streamManager.addEventListener(
      google.ima.dai.api.StreamEvent.Type.LOADED, onStreamEvent);
  streamManager.addEventListener(
      google.ima.dai.api.StreamEvent.Type.ERROR, onStreamEvent);
  streamManager.addEventListener(
      google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED, onStreamEvent);
  streamManager.addEventListener(
      google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED, onStreamEvent);
}

ส่งคำขอสตรีม

กำหนดฟังก์ชันเพื่อขอสตรีม ตัวอย่างนี้มีฟังก์ชันสำหรับ ทั้ง VOD และสตรีมแบบสด ซึ่งสร้างอินสแตนซ์ของคลาส VODStreamRequest และคลาส LiveStreamRequest หลังจากมีอินสแตนซ์ streamRequest แล้ว ให้เรียกใช้เมธอด streamManager.requestStream() ด้วยอินสแตนซ์คำขอสตรีม

/**
 * Makes a stream request and plays the stream.
 */
function requestStream() {
  requestVODStream(TEST_CONTENT_SOURCE_ID, TEST_VIDEO_ID, NETWORK_CODE, API_KEY);
  // Uncomment line below and comment one above to request a LIVE stream.
  // requestLiveStream(TEST_ASSET_KEY, NETWORK_CODE, API_KEY);
}

/**
 * Requests a Live stream with ads.
 * @param {string} assetKey
 * @param {?string} networkCode
 * @param {?string} apiKey
 */
function requestLiveStream(assetKey, networkCode, apiKey) {
  const streamRequest = new google.ima.dai.api.LiveStreamRequest();
  streamRequest.assetKey = assetKey;
  streamRequest.networkCode = networkCode;
  streamRequest.apiKey = apiKey;
  streamManager.requestStream(streamRequest);
}

/**
 * Requests a VOD stream with ads.
 * @param {string} cmsId
 * @param {string} videoId
 * @param {?string} networkCode
 * @param {?string} apiKey
 */
function requestVODStream(cmsId, videoId, networkCode, apiKey) {
  const streamRequest = new google.ima.dai.api.VODStreamRequest();
  streamRequest.contentSourceId = cmsId;
  streamRequest.videoId = videoId;
  streamRequest.networkCode = networkCode;
  streamRequest.apiKey = apiKey;
  streamManager.requestStream(streamRequest);
}

ทั้ง 2 วิธีคำขอสตรีมใช้คีย์ API ที่ไม่บังคับ หากใช้ สตรีมที่ได้รับการปกป้อง คุณจะต้องสร้างคีย์การตรวจสอบสิทธิ์ DAI ดูรายละเอียดเพิ่มเติมได้ที่ ตรวจสอบสิทธิ์คำขอสตรีมวิดีโอ DAI สตรีมในตัวอย่างนี้ไม่ได้ป้องกันโดยใช้คีย์การตรวจสอบสิทธิ์ DAI ดังนั้นจึงไม่ได้ใช้ apiKey

แยกวิเคราะห์ข้อมูลเมตาของสตรีม

นอกจากนี้ คุณยังต้องเพิ่มตัวแฮนเดิลเพื่อฟังเหตุการณ์ข้อมูลเมตาที่กำหนดเวลาและส่งต่อ เหตุการณ์ไปยังคลาส StreamManager เพื่อให้ IMA ปล่อยเหตุการณ์โฆษณาระหว่างช่วงพักโฆษณา

/**
 * Set up metadata listeners to pass metadata to the StreamManager.
 */
function listenForMetadata() {
  // Timed metadata is handled differently by different video players, and the
  // IMA SDK provides two ways to pass in metadata,
  // StreamManager.processMetadata() and StreamManager.onTimedMetadata().
  //
  // Use StreamManager.onTimedMetadata() if your video player parses
  // the metadata itself.
  // Use StreamManager.processMetadata() if your video player provides raw
  // ID3 tags, as with hls.js.
  hls.on(Hls.Events.FRAG_PARSING_METADATA, function(event, data) {
    if (streamManager && data) {
      // For each ID3 tag in our metadata, we pass in the type - ID3, the
      // tag data (a byte array), and the presentation timestamp (PTS).
      data.samples.forEach(function(sample) {
        streamManager.processMetadata('ID3', sample.data, sample.pts);
      });
    }
  });
}

คู่มือนี้ใช้เพลเยอร์ hls.js สำหรับการเล่นสตรีม แต่การติดตั้งใช้งานข้อมูลเมตา จะขึ้นอยู่กับประเภทของเพลเยอร์ที่คุณใช้

จัดการเหตุการณ์สตรีม

ใช้ Listener เหตุการณ์สำหรับเหตุการณ์วิดีโอที่สำคัญ ตัวอย่างนี้จัดการเหตุการณ์ LOADED, ERROR, AD_BREAK_STARTED และ AD_BREAK_ENDED โดยการเรียกฟังก์ชัน onStreamEvent() ฟังก์ชันนี้จะจัดการการโหลดสตรีม ข้อผิดพลาดของสตรีม และการปิดใช้ตัวควบคุมเพลเยอร์ระหว่างการเล่นโฆษณา ซึ่งเป็นสิ่งที่ IMA SDK ต้องการ

/**
 * Responds to a stream event.
 * @param {!google.ima.dai.api.StreamEvent} e
 */
function onStreamEvent(e) {
  switch (e.type) {
    case google.ima.dai.api.StreamEvent.Type.LOADED:
      console.log('Stream loaded');
      loadUrl(e.getStreamData().url);
      break;
    case google.ima.dai.api.StreamEvent.Type.ERROR:
      console.log('Error loading stream, playing backup stream.' + e);
      loadUrl(BACKUP_STREAM);
      break;
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED:
      console.log('Ad Break Started');
      adBreak = true;
      hideVideoControls();
      break;
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED:
      console.log('Ad Break Ended');
      adBreak = false;
      showVideoControls();
      break;
    default:
      break;
  }
}

/**
 * Loads and plays a Url.
 * @param {string} url
 */
function loadUrl(url) {
  console.log('Loading:' + url);
  hls.loadSource(url);
  hls.attachMedia(videoElement);
  hls.on(Hls.Events.MANIFEST_PARSED, function() {
    console.log('Video Play');
    videoElement.play();
  });
}

เมื่อโหลดสตรีมแล้ว โปรแกรมเล่นวิดีโอจะโหลดและเล่น URL ที่ระบุ โดยใช้ฟังก์ชัน loadUrl()

เท่านี้ก็เรียบร้อย ตอนนี้คุณขอและแสดงโฆษณาด้วย IMA DAI SDK แล้ว หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ SDK ขั้นสูงอื่นๆ โปรดดูคำแนะนำอื่นๆ หรือตัวอย่างใน GitHub