IMA SDK ช่วยให้คุณผสานรวมโฆษณามัลติมีเดียเข้ากับเว็บไซต์และแอปได้อย่างง่ายดาย IMA SDK สามารถขอโฆษณาจากเซิร์ฟเวอร์โฆษณาที่เป็นไปตาม VAST และจัดการการแสดงโฆษณาในแอปของคุณได้ เมื่อใช้ IMA DAI SDK แอปจะส่งคําขอสตรีมสําหรับโฆษณาและเนื้อหาวิดีโอ ไม่ว่าจะเป็น VOD หรือเนื้อหาสด จากนั้น SDK จะแสดงสตรีมวิดีโอแบบรวม คุณจึงไม่ต้องจัดการการสลับใช้ระหว่างโฆษณาวิดีโอกับเนื้อหาวิดีโอภายในแอป
คู่มือนี้สาธิตวิธีผสานรวม IMA SDK เข้ากับแอปโปรแกรมเล่นวิดีโอแบบง่าย หากต้องการดูหรือทําตามวิธีการผสานรวมตัวอย่างที่สมบูรณ์ ให้ดาวน์โหลดตัวอย่างพื้นฐานจาก GitHub
ภาพรวมของ IMA DAI
การใช้ IMA DAI ประกอบด้วยคอมโพเนนต์ SDK หลัก 2 ส่วนซึ่งจะแสดงในคู่มือนี้
StreamRequest
: ออบเจ็กต์ที่กําหนดคําขอสตรีม คําขอสตรีมอาจเป็นได้ทั้งวิดีโอออนดีมานด์หรือสตรีมแบบสด คําขอจะระบุรหัสเนื้อหา รวมถึงคีย์ API หรือโทเค็นการตรวจสอบสิทธิ์และพารามิเตอร์อื่นๆStreamManager
: ออบเจ็กต์ที่จัดการสตรีมการแทรกโฆษณาแบบไดนามิกและการโต้ตอบกับแบ็กเอนด์ DAI ผู้จัดการสตรีมยังจัดการคําสั่ง ping สําหรับการติดตามและส่งต่อสตรีมและเหตุการณ์โฆษณาไปยังผู้เผยแพร่โฆษณาอีกด้วย
สิ่งที่ต้องดำเนินการก่อน
ก่อนที่จะเริ่มต้น คุณต้องดําเนินการดังนี้
- อ่านหน้าความเข้ากันได้เพื่อให้แน่ใจว่าระบบรองรับกรณีการใช้งานที่คุณต้องการ
- ดาวน์โหลดโค้ดโปรแกรมเล่น Roku ตัวอย่าง
- ติดตั้งใช้งานโค้ดโปรแกรมเล่นตัวอย่างข้างต้นในอุปกรณ์ Roku เพื่อยืนยันว่าการตั้งค่าการพัฒนาทํางานอยู่
เล่นวิดีโอ
โปรแกรมเล่นวิดีโอตัวอย่างจะเล่นวิดีโอเนื้อหาตั้งแต่แกะกล่อง นําโปรแกรมเล่นตัวอย่างไปใช้กับโปรแกรมเล่น Roku เพื่อให้แน่ใจว่ามีการตั้งค่าสภาพแวดล้อมการพัฒนาอย่างเหมาะสม
เปลี่ยนโปรแกรมเล่นวิดีโอเป็นโปรแกรมเล่นสตรีมการแทรกโฆษณาแบบไดนามิกของ IMA
สร้าง Sdk.xml
เพิ่มไฟล์ใหม่ลงในโปรเจ็กต์ควบคู่ไปกับ MainScene.xml
ที่ชื่อว่า Sdk.xml
จากนั้นเพิ่ม Boilerplate ต่อไปนี้
Sdk.xml
<?xml version = "1.0" encoding = "utf-8" ?> <component name = "imasdk" extends = "Task"> <interface> </interface> <script type = "text/brightscript"> <![CDATA[ ' Your code goes here. ]]> </script> </component>
คุณจําเป็นต้องแก้ไขทั้ง 2 ไฟล์นี้ในคู่มือนี้ ส่วนหัวเหนือข้อมูลโค้ดแต่ละรายการ จะระบุว่าไฟล์ใดที่คุณต้องการเพิ่มข้อมูลโค้ดนั้น
โหลดเฟรมเวิร์กการโฆษณา Roku
IMA SDK ขึ้นอยู่กับเฟรมเวิร์กการโฆษณาของ Roku หากต้องการโหลดเฟรมเวิร์ก ให้เพิ่มค่าต่อไปนี้ใน manifest
และ Sdk.xml
ไฟล์ Manifest
bs_libs_required=roku_ads_lib,googleima3
Sdk.xml
Library "Roku_Ads.brs" Library "IMA3.brs"
โหลด IMA SDK
ขั้นตอนแรกในการโหลดสตรีมการแทรกโฆษณาแบบไดนามิกของ IMA คือการโหลดและเริ่มต้น IMA SDK สิ่งต่อไปนี้โหลดสคริปต์ IMA SDK
Sdk.xml
<interface> <field id="sdkLoaded" type="Boolean" /> <field id="errors" type="stringarray" /> </interface>
sub init() m.top.functionName = "runThread" End Sub sub runThread() if not m.top.sdkLoaded loadSdk() End If End Sub sub loadSdk() If m.sdk = invalid m.sdk = New_IMASDK() End If m.top.sdkLoaded = true End Sub
แล้วเริ่มงานนี้ใน MainScene.xml
และนําการโทรออกเพื่อโหลดสตรีมเนื้อหา
MainScene.xml
function init() m.video = m.top.findNode("myVideo") m.video.notificationinterval = 1 loadImaSdk() end function function loadImaSdk() as void m.sdkTask = createObject("roSGNode", "imasdk") m.sdkTask.observeField("sdkLoaded", "onSdkLoaded") m.sdkTask.observeField("errors", "onSdkLoadedError") m.sdkTask.control = "RUN" end function Sub onSdkLoaded(message as Object) print "----- onSdkLoaded --- control ";message End Sub Sub onSdkLoadedError(message as Object) print "----- errors in the sdk loading process --- ";message End Sub
สร้างโปรแกรมเล่นสตรีม IMA
ถัดไป คุณจะต้องใช้ roVideoScreen
ที่มีอยู่เพื่อสร้างโปรแกรมเล่นสตรีม IMA
โปรแกรมเล่นสตรีมนี้ใช้วิธีการเรียกกลับ 3 วิธี ได้แก่ loadUrl
,
adBreakStarted
และ adBreakEnded
ปิดใช้การเล่นกล
เมื่อมีการโหลดสตรีม วิธีนี้ช่วยป้องกันไม่ให้ผู้ใช้ข้ามโฆษณาตอนต้นในเวลาที่เริ่มไปแล้วก่อนที่เหตุการณ์ช่วงพักโฆษณาจะเริ่ม
Sdk.xml
<interface> <field id="sdkLoaded" type="Boolean" /> <field id="errors" type="stringarray" /> <field id="urlData" type="assocarray" /> <field id="adPlaying" type="Boolean" /> <field id="video" type="Node" /> </interface> ... sub setupVideoPlayer() sdk = m.sdk m.player = sdk.createPlayer() m.player.top = m.top m.player.loadUrl = Function(urlData) m.top.video.enableTrickPlay = false m.top.urlData = urlData End Function m.player.adBreakStarted = Function(adBreakInfo as Object) print "---- Ad Break Started ---- " m.top.adPlaying = True m.top.video.enableTrickPlay = false End Function m.player.adBreakEnded = Function(adBreakInfo as Object) print "---- Ad Break Ended ---- " m.top.adPlaying = False m.top.video.enableTrickPlay = true End Function m.player.seek = Function(timeSeconds as Float) print "---- SDK requested seek to ----" ; timeSeconds m.top.video.seekMode = "accurate" m.top.video.seek = timeSeconds End Function End Sub
สร้างและเรียกใช้คําขอสตรีม
เมื่อมีโปรแกรมเล่นสตรีมแล้ว คุณจะสร้างและเรียกใช้คําขอสตรีมได้
ตัวอย่างนี้มีข้อมูลสําหรับสตรีมแบบสดและสตรีม VOD กําลังใช้สตรีม VOD อยู่
หากต้องการใช้การถ่ายทอดสดแทน VOD ให้เปลี่ยน selectedStream
จาก m.testVodStream
เป็น m.testLiveStream
เพื่อให้สามารถรองรับ AdUI เช่น ไอคอนตัวเลือกโฆษณาอื่นๆ คุณต้องส่งการอ้างอิงไปยังโหนดที่มีวิดีโอเนื้อหาของคุณเป็นส่วนหนึ่งของคําขอด้วย
MainScene.xml
function init() m.video = m.top.findNode("myVideo") m.video.notificationinterval = 1 m.testLiveStream = { title: "Live Stream", assetKey: "sN_IYUG8STe1ZzhIIE_ksA", apiKey: "", type: "live" } m.testVodStream = { title: "VOD stream" contentSourceId: "2528370", videoId: "tears-of-steel", apiKey: "", type: "vod" } loadImaSdk() end function function loadImaSdk() as void m.sdkTask = createObject("roSGNode", "imasdk") m.sdkTask.observeField("sdkLoaded", "onSdkLoaded") m.sdkTask.observeField("errors", "onSdkLoadedError") selectedStream = m.testVodStream m.videoTitle = selectedStream.title m.sdkTask.streamData = selectedStream m.sdkTask.video = m.video m.sdkTask.control = "RUN" end function
Sdk.xml
<interface> <field id="sdkLoaded" type="Boolean" /> <field id="errors" type="stringarray" /> <field id="urlData" type="assocarray" /> <field id="adPlaying" type="Boolean" /> <field id="video" type="Node" /> <field id="streamData" type="assocarray" /> <field id="streamManagerReady" type="Boolean" /> </interface>
sub runThread() if not m.top.sdkLoaded loadSdk() End If if not m.top.streamManagerReady loadStream() End If End Sub Sub loadStream() sdk = m.sdk sdk.initSdk() setupVideoPlayer() request = {} if m.top.streamData.type = "live" request = sdk.CreateLiveStreamRequest(m.top.streamData.assetKey, m.top.streamData.apiKey) else if m.top.streamData.type = "vod" request = sdk.CreateVodStreamRequest(m.top.streamData.contentSourceId, m.top.streamData.videoId, m.top.streamData.apiKey) else request = sdk.CreateStreamRequest() end if request.player = m.player request.adUiNode = m.top.video request.videoObject = m.top.video requestResult = sdk.requestStream(request) If requestResult <> Invalid print "Error requesting stream ";requestResult Else m.streamManager = Invalid While m.streamManager = Invalid sleep(50) m.streamManager = sdk.getStreamManager() End While If m.streamManager = Invalid or m.streamManager["type"] <> Invalid or m.streamManager["type"] = "error" errors = CreateObject("roArray", 1, True) print "error ";m.streamManager["info"] errors.push(m.streamManager["info"]) m.top.errors = errors Else m.top.streamManagerReady = True addCallbacks() m.streamManager.start() End If End If End Sub
เพิ่ม Listener เหตุการณ์และเริ่มสตรีม
หลังจากขอสตรีมแล้ว มีเพียงไม่กี่อย่างที่ต้องทํา ได้แก่ เพิ่ม Listener เหตุการณ์เพื่อติดตามความคืบหน้าของโฆษณา เริ่มสตรีม และส่งต่อข้อความ Roku ไปยัง SDK คุณต้องส่งต่อข้อความทั้งหมดไปยัง SDK เพื่อให้แน่ใจว่าการเล่นโฆษณาเป็นไปอย่างถูกต้อง
MainScene.xml
function loadImaSdk() as void m.sdkTask = createObject("roSGNode", "imasdk") m.sdkTask.observeField("sdkLoaded", "onSdkLoaded") m.sdkTask.observeField("errors", "onSdkLoadedError") selectedStream = m.testVodStream m.videoTitle = selectedStream.title m.sdkTask.streamData = selectedStream m.sdkTask.observeField("urlData", "urlLoadRequested") m.sdkTask.video = m.video m.sdkTask.control = "RUN" end function Sub urlLoadRequested(message as Object) print "Url Load Requested ";message data = message.getData() playStream(data.manifest) End Sub Sub playStream(url as Object) vidContent = createObject("RoSGNode", "ContentNode") vidContent.url = url vidContent.title = m.videoTitle vidContent.streamformat = "hls" m.video.content = vidContent m.video.setFocus(true) m.video.visible = true m.video.control = "play" m.video.EnableCookies() End Sub
Sdk.xml
sub runThread() if not m.top.sdkLoaded loadSdk() End If if not m.top.streamManagerReady loadStream() End If If m.top.streamManagerReady runLoop() End If End Sub Sub runLoop() m.top.video.timedMetaDataSelectionKeys = ["*"] m.port = CreateObject("roMessagePort") ' Listen to all fields. ' IMPORTANT: Failure to listen to the position and timedmetadata fields ' could result in ad impressions not being reported. fields = m.top.video.getFields() for each field in fields m.top.video.observeField(field, m.port) end for while True msg = wait(1000, m.port) if m.top.video = invalid print "exiting" exit while end if m.streamManager.onMessage(msg) currentTime = m.top.video.position If currentTime > 3 And not m.top.adPlaying m.top.video.enableTrickPlay = true End If end while End Sub Function addCallbacks() as Void m.streamManager.addEventListener(m.sdk.AdEvent.ERROR, errorCallback) m.streamManager.addEventListener(m.sdk.AdEvent.START, startCallback) m.streamManager.addEventListener(m.sdk.AdEvent.FIRST_QUARTILE, firstQuartileCallback) m.streamManager.addEventListener(m.sdk.AdEvent.MIDPOINT, midpointCallback) m.streamManager.addEventListener(m.sdk.AdEvent.THIRD_QUARTILE, thirdQuartileCallback) m.streamManager.addEventListener(m.sdk.AdEvent.COMPLETE, completeCallback) End Function Function startCallback(ad as Object) as Void print "Callback from SDK -- Start called - " End Function Function firstQuartileCallback(ad as Object) as Void print "Callback from SDK -- First quartile called - " End Function Function midpointCallback(ad as Object) as Void print "Callback from SDK -- Midpoint called - " End Function Function thirdQuartileCallback(ad as Object) as Void print "Callback from SDK -- Third quartile called - " End Function Function completeCallback(ad as Object) as Void print "Callback from SDK -- Complete called - " End Function Function errorCallback(error as Object) as Void print "Callback from SDK -- Error called - "; error m.errorState = True End Function