ใน 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