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

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

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

DAI Pod Serving

คู่มือนี้แสดงวิธีเล่นสตรีม DAI Pod Serving สำหรับเนื้อหาแบบสดหรือ VOD โดยใช้ IMA DAI SDK สำหรับ HTML5 กับวิดีโอเพลเยอร์ที่ใช้ hls.js สำหรับการเล่น หากต้องการดูหรือทำตามตัวอย่างการผสานรวมที่เสร็จสมบูรณ์ซึ่งรองรับ ทั้ง HLS.js และการเล่นใน Safari โปรดดู ตัวอย่างการแสดงโฆษณาพ็อดใน HLS หากต้องการการสนับสนุน DASH.js โปรดดูตัวอย่างการแสดงพ็อด DASH คุณดาวน์โหลดตัวอย่างแอปเหล่านี้ได้จากหน้าการเผยแพร่ HTML5 DAI ใน GitHub

ภาพรวม DAI Pod Serving

การใช้ Pod Serving โดยใช้ IMA DAI SDK มีองค์ประกอบหลัก 2 อย่าง ซึ่งจะแสดงในคู่มือนี้

  • PodStreamRequest / PodVodStreamRequest: ออบเจ็กต์ที่กำหนดคำขอสตรีมไปยัง เซิร์ฟเวอร์โฆษณาของ Google คำขอจะระบุรหัสเครือข่าย และ PodStreamRequest ต้องมีคีย์ชิ้นงานที่กำหนดเองและคีย์ API (ไม่บังคับ) ด้วย ทั้ง 2 รายการมีพารามิเตอร์อื่นๆ ที่ไม่บังคับ

  • StreamManager: ออบเจ็กต์ที่จัดการการสื่อสารระหว่าง วิดีโอสตรีมกับ IMA DAI SDK เช่น การทริกเกอร์พิงการติดตามและ การส่งต่อเหตุการณ์สตรีมไปยังผู้เผยแพร่โฆษณา

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

ก่อนเริ่มต้น คุณต้องมีสิ่งต่อไปนี้

  • ไฟล์ว่าง 3 ไฟล์

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

กำหนดค่าสภาพแวดล้อมในการพัฒนา

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

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

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

    นอกจากนี้ คุณยังใช้สภาพแวดล้อมการพัฒนาหรือเว็บเซิร์ฟเวอร์ที่โฮสต์อื่นๆ ได้ด้วย เช่น Apache HTTP Server

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

โดยใช้ไลบรารีที่เหมาะสม เช่น Shaka Player หรือ DASH.js

ก่อนอื่น ให้แก้ไข dai.html เพื่อสร้างองค์ประกอบวิดีโอ HTML5 และองค์ประกอบ div เพื่อ ใช้สำหรับองค์ประกอบ UI ของโฆษณา นอกจากนี้ ให้เพิ่มแท็กที่จำเป็นเพื่อโหลดไฟล์ dai.css และ dai.js รวมถึงนำเข้าhls.jsวิดีโอเพลเยอร์

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

ค่าคงที่ของคำขอสตรีมมีดังนี้

  • BACKUP_STREAM: URL สำหรับสตรีมสำรองที่จะเล่นในกรณีที่กระบวนการโฆษณา พบข้อผิดพลาดร้ายแรง

  • STREAM_URL: ใช้สำหรับไลฟ์สดเท่านั้น URL สตรีมวิดีโอที่ได้รับจาก ผู้จัดการไฟล์ Manifest หรือพาร์ทเนอร์บุคคลที่สามที่ใช้ Pod Serving โดยคุณจะต้อง แทรกรหัสสตรีมที่ได้รับจาก IMA DAI SDK ก่อนที่จะ ส่งคำขอ ในกรณีนี้ URL ของสตรีมจะมีตัวยึดตำแหน่ง [[STREAMID]] ซึ่งจะแทนที่ด้วยรหัสสตรีมก่อนที่จะส่งคำขอ

  • NETWORK_CODE: รหัสเครือข่ายสำหรับบัญชี Ad Manager 360

  • CUSTOM_ASSET_KEY: ใช้สำหรับไลฟ์สดเท่านั้น คีย์ของชิ้นงานที่กำหนดเองซึ่ง ระบุเหตุการณ์การแสดงโฆษณาพ็อดใน Ad Manager 360 โดยสามารถสร้างได้โดย เครื่องมือจัดการไฟล์ Manifest หรือพาร์ทเนอร์ Pod Serving บุคคลที่สาม

  • API_KEY: ใช้สำหรับไลฟ์สดเท่านั้น คีย์ API ที่ไม่บังคับซึ่งอาจ ต้องใช้เพื่อดึงรหัสสตรีมจาก IMA DAI SDK

dai.html

<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
  <script src="dai.js"></script>
  <link rel="stylesheet" href="dai.css" type="text/css">
</head>
<body onLoad="initPlayer()">
  <h2>IMA DAI SDK Demo (HLS.JS)</h2>
    <video id="video"></video>
    <div id="adUi"></div>
</body>
</html>

dai.css

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

#adUi {
  cursor: pointer;
}

dai.js

var BACKUP_STREAM =
    'https://storage.googleapis.com/interactive-media-ads/media/bbb.m3u8'

// Stream Config.
const STREAM_URL = "";
const NETWORK_CODE = "";
const CUSTOM_ASSET_KEY = "";
const API_KEY = "";

var hls = new Hls(); // hls.js video player
var videoElement;
var adUiElement;

function initPlayer() {
  videoElement = document.getElementById('video');
  adUiElement = document.getElementById('adUi');
}

โหลด IMA DAI SDK

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

แอปที่ใช้งานจริง

dai.html

<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
  <script type="text/javascript" src="//imasdk.googleapis.com/js/sdkloader/ima3_dai.js"></script>
  <script src="dai.js"></script>
  <link rel="stylesheet" href="dai.css" type="text/css">
</head>
...

เริ่มต้น StreamManager และส่งคำขอสตรีมแบบสดหรือ VOD

การแสดงพ็อดไลฟ์สด

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

จากนั้นกำหนดฟังก์ชันเพื่อขอไลฟ์สด Pod Serving ฟังก์ชันนี้ จะสร้าง PodStreamRequest ก่อน จากนั้นกำหนดค่าด้วยพารามิเตอร์ streamRequest ที่ระบุในขั้นตอนที่ 2 แล้วเรียกใช้ streamManager.requestStream() ด้วยออบเจ็กต์คำขอนั้น

dai.js

function initPlayer() {
  videoElement = document.getElementById('video');
  adUiElement = document.getElementById('adUi');
  streamManager = new google.ima.dai.api.StreamManager(videoElement, adUiElement)

  requestLivePodStream(NETWORK_CODE, CUSTOM_ASSET_KEY, API_KEY);
}

function requestLivePodStream(networkCode, customAssetKey, apiKey) {
  // clear HLS.js instance, if in use
  if (hls) {
    hls.destroy();
  }

  // Generate a Pod Serving live Stream Request
  const streamRequest = new google.ima.dai.api.PodStreamRequest();
  streamRequest.networkCode = networkCode;
  streamRequest.customAssetKey = customAssetKey;
  streamRequest.apiKey = apiKey;
  streamRequest.format = 'hls';
  streamManager.requestStream(streamRequest);
}

VOD Pod Serving

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

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

dai.js

function initPlayer() {
  videoElement = document.getElementById('video');
  adUiElement = document.getElementById('adUi');
  streamManager = new google.ima.dai.api.StreamManager(videoElement, adUiElement)

  requestVodPodStream(NETWORK_CODE);
}

function requestVodPodStream(networkCode) {
  // clear HLS.js instance, if in use
  if (hls) {
    hls.destroy();
  }

  // Generate a Pod Serving VOD Stream Request
  const streamRequest = new google.ima.dai.api.PodVodStreamRequest();
  streamRequest.networkCode = networkCode;
  streamRequest.format = 'hls';
  streamManager.requestStream(streamRequest);
}

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

การแสดงพ็อดไลฟ์สด

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

dai.js

var isAdBreak;

function initPlayer() {
  videoElement = document.getElementById('video');
  adUiElement = document.getElementById('adUi');
  streamManager = new google.ima.dai.api.StreamManager(videoElement, adUiElement);
  
  streamManager.addEventListener(
    [google.ima.dai.api.StreamEvent.Type.STREAM_INITIALIZED,
    google.ima.dai.api.StreamEvent.Type.ERROR,
    google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED,
    google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED],
    onStreamEvent,
    false);
...
function onStreamEvent(e) {
  switch (e.type) {
    case google.ima.dai.api.StreamEvent.Type.STREAM_INITIALIZED:
      console.log('Stream initialized');
      loadStream(e.getStreamData().streamId);
      break;
    case google.ima.dai.api.StreamEvent.Type.ERROR:
      console.log('Error loading stream, playing backup stream.' + e);
      loadStream('');
      break;
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED:
      console.log('Ad Break Started');
      isAdBreak = true;
      videoElement.controls = false;
      adUiElement.style.display = 'block';
      break;
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED:
      console.log('Ad Break Ended');
      isAdBreak = false;
      videoElement.controls = true;
      adUiElement.style.display = 'none';
      break;
    default:
      break;
  }
}

function loadStream(streamID) {
  var url;
  if(streamID) {
    url = STREAM_URL.replace('[[STREAMID]]', streamID);
  } else {
    console.log('Stream Initialization Failed');
    url = BACKUP_STREAM;
  }
  console.log('Loading:' + url);
  hls.loadSource(url);
  hls.attachMedia(videoElement);
}

VOD Pod Serving

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

นอกจากนี้ สตรีม VOD Pod Serving ยังต้องเรียกใช้ StreamManager.loadStreamMetadata() เพื่อตอบสนองต่อเหตุการณ์ STREAM_INITIALIZED นอกจากนี้ คุณยังต้องขอ URL ของสตรีมจาก พาร์ทเนอร์เทคโนโลยีวิดีโอ (VTP) ด้วย เมื่อloadStreamMetadata()การเรียกสำเร็จ ระบบจะทริกเกอร์เหตุการณ์ LOADED ซึ่งคุณควรเรียกใช้ฟังก์ชัน loadStream() ด้วย URL ของสตรีมเพื่อโหลดและเล่นสตรีม

var isAdBreak;

function initPlayer() {
  videoElement = document.getElementById('video');
  adUiElement = document.getElementById('adUi');
  streamManager = new google.ima.dai.api.StreamManager(videoElement, adUiElement);
  
  streamManager.addEventListener(
    [google.ima.dai.api.StreamEvent.Type.STREAM_INITIALIZED,
    google.ima.dai.api.StreamEvent.Type.ERROR,
    google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED,
    google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED],
    onStreamEvent,
    false);
...
function onStreamEvent(e) {
  switch (e.type) {
    case google.ima.dai.api.StreamEvent.Type.STREAM_INITIALIZED:
      const streamId = e.getStreamData().streamId;
      // 'vtpInterface' is a place holder for your own video technology
      //  partner (VTP) API calls.
      vtpInterface.requestStreamURL({
        'streamId': streamId,
      })
      .then( (vtpStreamUrl) => {
        streamUrl = vtpStreamUrl;
        streamManager.loadStreamMetadata();
      }, (error) => {
        // Handle the error.
      });
      break;
    case google.ima.dai.api.StreamEvent.Type.LOADED:
      loadStream(streamUrl);
      break;
    case google.ima.dai.api.StreamEvent.Type.ERROR:
      console.log('Error loading stream, playing backup stream.' + e);
      loadStream();
      break;
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED:
      console.log('Ad Break Started');
      isAdBreak = true;
      videoElement.controls = false;
      adUiElement.style.display = 'block';
      break;
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED:
      console.log('Ad Break Ended');
      isAdBreak = false;
      videoElement.controls = true;
      adUiElement.style.display = 'none';
      break;
    default:
      break;
  }
}

function loadStream(url) {
  if(url) {
    console.log('Loading:' + url);
    hls.loadSource(url);
  } else {
    console.log('Stream Initialization Failed');
    hls.loadSource(BACKUP_STREAM);
  }
  hls.attachMedia(videoElement);
}

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

ในขั้นตอนนี้ คุณจะใช้ Listener เหตุการณ์สำหรับข้อมูลเมตาเพื่อแจ้ง SDK เมื่อมี เหตุการณ์โฆษณาเกิดขึ้น การฟังเหตุการณ์ข้อมูลเมตาในสตรีมอาจแตกต่างกันไป ขึ้นอยู่กับ รูปแบบสตรีม (HLS หรือ DASH), ประเภทสตรีม (สตรีมแบบสดหรือ VOD), ประเภท เพลเยอร์ และประเภทของแบ็กเอนด์ DAI ที่ใช้ ดูข้อมูลเพิ่มเติมได้ในคำแนะนำเกี่ยวกับข้อมูลเมตาที่กำหนดเวลา

รูปแบบสตรีม HLS (สตรีมแบบสดและ VOD, โปรแกรมเล่น HLS.js)

หากคุณใช้เพลเยอร์ HLS.js ให้ฟังเหตุการณ์ FRAG_PARSING_METADATA ของ HLS.js เพื่อรับข้อมูลเมตา ID3 และส่งไปยัง SDK ด้วย StreamManager.processMetadata()

หากต้องการเล่นวิดีโอโดยอัตโนมัติหลังจากโหลดทุกอย่างเสร็จสิ้นและพร้อมใช้งาน ให้ฟังเหตุการณ์ MANIFEST_PARSED ของ HLS.js เพื่อทริกเกอร์การเล่น

function loadStream(streamID) {
  hls.loadSource(url);
  hls.attachMedia(videoElement);
  
  // Timed metadata is passed HLS stream events to the streamManager.
  hls.on(Hls.Events.FRAG_PARSING_METADATA, parseID3Events);
  hls.on(Hls.Events.MANIFEST_PARSED, startPlayback);
}

function parseID3Events(event, data) {
  if (streamManager && data) {
    // For each ID3 tag in the metadata, pass in the type - ID3, the
    // tag data (a byte array), and the presentation timestamp (PTS).
    data.samples.forEach((sample) => {
      streamManager.processMetadata('ID3', sample.data, sample.pts);
    });
  }
}

function startPlayback() {
  console.log('Video Play');
  videoElement.play();
}

DASH.js (รูปแบบสตรีม DASH, ประเภทสตรีมแบบสดและ VOD)

หากใช้เพลเยอร์ DASH.js คุณต้องใช้สตริงอื่นเพื่อฟังข้อมูลเมตา ID3 สำหรับสตรีมสดหรือ VOD

  • ไลฟ์สด: 'https://developer.apple.com/streaming/emsg-id3'
  • สตรีม VOD: 'urn:google:dai:2018'

ส่งข้อมูลเมตา ID3 ไปยัง SDK ด้วย StreamManager.processMetadata()

หากต้องการแสดงตัวควบคุมวิดีโอโดยอัตโนมัติหลังจากโหลดทุกอย่างเสร็จสิ้นและพร้อมใช้งาน ให้ ฟังเหตุการณ์ MANIFEST_LOADED ของ DASH.js

const googleLiveSchema = 'https://developer.apple.com/streaming/emsg-id3';
const googleVodSchema = 'urn:google:dai:2018';
dashPlayer.on(googleLiveSchema, processMetadata);
dashPlayer.on(googleVodSchema, processMetadata);
dashPlayer.on(dashjs.MediaPlayer.events.MANIFEST_LOADED, loadlistener);

function processMetadata(metadataEvent) {
  const messageData = metadataEvent.event.messageData;
  const timestamp = metadataEvent.event.calculatedPresentationTime;

  // Use StreamManager.processMetadata() if your video player provides raw
  // ID3 tags, as with dash.js.
  streamManager.processMetadata('ID3', messageData, timestamp);
}

function loadlistener() {
  showControls();

  // This listener must be removed, otherwise it triggers as addional
  // manifests are loaded. The manifest is loaded once for the content,
  // but additional manifests are loaded for upcoming ad breaks.
  dashPlayer.off(dashjs.MediaPlayer.events.MANIFEST_LOADED, loadlistener);
}

Shaka Player ที่มีไลฟ์สด (รูปแบบสตรีม DASH)

หากคุณใช้ Shaka Player สำหรับ การเล่นไลฟ์สด ให้ใช้สตริง 'emsg' เพื่อรอฟังเหตุการณ์ข้อมูลเมตา จากนั้นใช้ข้อมูลข้อความเหตุการณ์ในการเรียกไปยัง StreamManager.onTimedMetadata()

shakaPlayer.addEventListener('emsg', (event) => onEmsgEvent(event));

function onEmsgEvent(metadataEvent) {
  // Use StreamManager.onTimedMetadata() if your video player provides
  // processed metadata, as with Shaka player livestreams.
  streamManager.onTimedMetadata({'TXXX': metadataEvent.detail.messageData});
}

Shaka Player ที่มีสตรีม VOD (รูปแบบสตรีม DASH)

หากคุณใช้ Shaka Player สำหรับ การเล่นสตรีม VOD ให้ใช้สตริง 'timelineregionenter' เพื่อฟัง เหตุการณ์ข้อมูลเมตา จากนั้นใช้ข้อมูลข้อความเหตุการณ์ในการเรียกไปยัง StreamManager.processMetadata() ด้วยสตริง 'urn:google:dai:2018'

shakaPlayer.addEventListener('timelineregionenter', (event) => onTimelineEvent(event));

function onTimelineEvent(metadataEvent) {
  const detail = metadataEvent.detail;
  if ( detail.eventElement.attributes &&
       detail.eventElement.attributes['messageData'] &&
       detail.eventElement.attributes['messageData'].value ) {
        const mediaId = detail.eventElement.attributes['messageData'].value;
        const pts = detail.startTime;
        // Use StreamManager.processMetadata() if your video player provides raw
        // ID3 tags, as with Shaka player VOD streams.
        streamManager.processMetadata('urn:google:dai:2018', mediaId, pts);
       }
}

จัดการเหตุการณ์ของผู้เล่น

เพิ่ม Listener เหตุการณ์ลงในเหตุการณ์ pause และ start ขององค์ประกอบวิดีโอเพื่อให้ ผู้ใช้เล่นต่อได้เมื่อ SDK หยุดชั่วคราวระหว่างช่วงพักโฆษณา

function loadStream(streamUrl) {
  ...
  
  videoElement.addEventListener('pause', onStreamPause);
  videoElement.addEventListener('play', onStreamPlay);
}

function onStreamPause() {
  console.log('paused');
  if (isAdBreak) {
    videoElement.controls = true;
    adUiElement.style.display = 'none';
  }
}

function onStreamPlay() {
  console.log('played');
  if (isAdBreak) {
    videoElement.controls = false;
    adUiElement.style.display = 'block';
  }
}

ล้างข้อมูลชิ้นงาน IMA DAI

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

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