کیتهای توسعه نرمافزار IMA ادغام آگهیهای چندرسانهای در وبسایتها و برنامههایتان را آسان میکنند. کیتهای توسعه نرمافزار IMA میتوانند از هر سرور آگهی مطابق با VAST درخواست آگهی کنند و بازپخش آگهی را در برنامههایتان مدیریت کنند. با کیتهای توسعه نرمافزار IMA DAI، برنامهها درخواست جاریسازی برای ویدیو آگهی و محتوا (چه ویدیو بهدرخواست و چه محتوای زنده) ارسال میکنند. سپس کیت توسعه نرمافزار یک جریان ویدیویی ترکیبی برمیگرداند، بنابراین لازم نیست جابهجایی بین ویدیو آگهی و محتوا را در برنامهتان مدیریت کنید.
راهحل DAI موردعلاقهتان را انتخاب کنید
این راهنما نشان میدهد که چگونه بااستفاده از کیت توسعه نرمافزار IMA DAI برای Roku، یک جاریسازی زنده یا VOD را با ارائه واحد آگهی DAI پخش کنید. برای مشاهده یا دنبال کردن یکپارچهسازی نمونه تکمیلشده، نمونه ارائه واحد تبلیغات را بارگیری کنید.
نمای کلی ارائه واحد IMA DAI
پیادهسازی «ارائه Pod» بااستفاده از IMA DAI شامل دو مؤلفه اصلی کیت توسعه نرمافزار است که در این راهنما نشان داده شده است:
StreamRequest.createPodLiveStreamRequest()/StreamRequest.createPodVodStreamRequest(): شیئی ایجاد میکند که درخواست جاریسازی به سرورهای تبلیغات Google را تعریف میکند. این درخواستها کد شبکه را مشخص میکنند و «پخش زنده واحد تبلیغات»ima.StreamRequestهمچنین به کلید دارایی سفارشی و یک کلید API اختیاری نیاز دارد.StreamManager: شیئی که ارتباط بین جاریسازی ویدیو و کیت توسعه نرمافزار IMA DAI را مدیریت میکند، مثل ارسال پیامهای ردیابی و انتقال رویدادهای جاریسازی به ناشر.
علاوهبراین، باید درخواستی به سرور دستکاری مانیفست خود ارسال کنید تا مانیفست جاریسازی را برای نمایش برنامه خود بازیابی کنید. فرایند دقیق ممکن است از یک شریک فناوری ویدیو (VTP) به VTP دیگر متفاوت باشد.
پیشنیازها
- صفحه سازگاری ما را بخوانید تا مطمئن شوید مورد استفاده موردنظرتان پشتیبانی میشود.
- کد پخشکننده نمونه Roku را بارگیری کنید.
- کد پخشکننده نمونه را در دستگاه Roku پیادهسازی کنید تا مطمئن شوید که راهاندازی توسعه شما کار میکند.
پخش ویدیو
بازیکن ویدیو نمونه ارائهشده یک ویدیو محتوا را بهصورت پیشفرض پخش میکند. بازیکن نمونه را در دستگاه Roku خود مستقر کنید تا مطمئن شوید محیط توسعه شما بهدرستی تنظیم شده است.
تبدیل کردن پخشکننده ویدیو به پخشکننده جاریسازی IMA DAI
برای پیادهسازی پخشکننده جاریسازی، این مراحل را دنبال کنید.
ایجاد Sdk.xml
فایل جدیدی به پروژه در کنار MainScene.xml بهنام Sdk.xml اضافه کن، و
عبارت کلیشهای زیر را اضافه کن:
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>
باید هر دو فایل (MainScene.xml و Sdk.xml) را در سراسر این راهنما ویرایش کنید.
بار کردن چارچوب کیت توسعه نرمافزار درج آگهی پویا در آگهیهای رسانهای تعاملی
برای بار کردن چارچوب، موارد زیر را به manifest و Sdk.xml اضافه کنید:
مانیفست
bs_libs_required=googleima3
Sdk.xml
<?xml version = "1.0" encoding = "utf-8" ?>
<component name = "imasdk" extends = "Task">
<interface>
</interface>
<script type = "text/brightscript">
<![CDATA[
Library "IMA3.brs"
]]>
</script>
</component>
کیت توسعه نرمافزار IMA DAI را مقداردهی اولیه کنید
اولین قدم برای بارگذاری جاریسازی «درج آگهی پویا» IMA، بارگذاری و مقداردهی اولیه کیت توسعه نرمافزار IMA DAI است. کد زیر اسکریپت کیت توسعه نرمافزار IMA DAI را مقداردهی اولیه میکند.
Sdk.xml
<?xml version="1.0" encoding="utf-8" ?>
<component name="IMASDKTask" extends="Task">
<interface>
<field id="IMASDKInitialized" type="Boolean" />
<field id="errors" type="stringarray" />
</interface>
<script type = "text/brightscript">
<![CDATA[
Library "IMA3.brs"
sub init()
m.top.functionName = "runThread"
end sub
sub runThread()
if not m.top.IMASDKInitialized
initializeIMASDK()
end if
end sub
sub initializeIMASDK()
if m.sdk = invalid
m.sdk = New_IMASDK()
end if
m.top.IMASDKInitialized = true
end sub
]]>
</script>
</component>
اکنون این تکلیف را در MainScene.xml شروع کنید و فراخوانی برای بار کردن جاریسازی محتوا را بردارید.
MainScene.xml
<?xml version="1.0" encoding="utf-8" ?>
<component extends="Scene" initialFocus="myVideo" name="MainScene">
<script type="text/brightscript">
<![CDATA[
function init()
m.video = m.top.findNode("myVideo")
m.video.notificationinterval = 1
runIMASDKTask()
end function
function runIMASDKTask()
m.IMASDKTask = createObject("roSGNode", "IMASDKTask")
m.IMASDKTask.observeField("IMASDKInitialized", "handleIMASDKInitialized")
m.IMASDKTask.observeField("errors", "handleIMASDKErrors")
m.IMASDKTask.control = "RUN"
end function
sub handleIMASDKInitialized()
' Follow your manifest manipulator (VTP) documentation to register a user
' streaming session if needed.
end sub
sub handleIMASDKErrors(message as object)
print "------ IMA DAI SDK failed ------"
if message <> invalid and message.getData() <> invalid
print "IMA DAI SDK Error ";message.getData()
end if
end sub
]]>
</script>
<children>
<Video height="720" id="myVideo" visible="false" width="1280"/>
</children>
</component>
ایجاد پخشکننده جاریسازی IMA
سپس، باید از roVideoScreen موجود خود برای ایجاد پخشکننده جاریسازی IMA استفاده کنید.
ارائه واحد جاریسازی زنده
برای جاریسازیهای زنده، این پخشکننده جاریسازی سه روش بازخوانی را پیادهسازی میکند:
streamInitialized، adBreakStarted، و adBreakEnded.
همچنین هنگام بارگیری جاریسازی، پخش فریبکارانه را غیرفعال کنید. این کار از رد کردن پیشنمایش توسط کاربران در لحظه شروع آن، قبلاز شروع رویداد وقفه آگهی جلوگیری میکند.
Sdk.xml
<?xml version="1.0" encoding="utf-8" ?>
<component name="IMASDKTask" extends="Task">
<interface>
<field id="IMASDKInitialized" type="Boolean" />
<field id="errors" type="stringarray" />
<field id="urlData" type="assocarray" />
<field id="adPlaying" type="Boolean" />
<field id="videoNode" type="Node" />
</interface>
<script type="text/brightscript">
...
sub runThread()
if not m.top.IMASDKInitialized
initializeIMASDK()
end if
setupPlayerCallbacks()
end sub
...
sub initializeIMASDK()
if m.ima = invalid
ima = New_IMASDK()
ima.initSdk()
m.ima = ima
end if
m.top.IMASDKInitialized = true
end sub
sub setupPlayerCallbacks()
m.player = m.ima.createPlayer()
m.player.top = m.top
m.player.streamInitialized = function(urlData)
m.top.videoNode.enableTrickPlay = false
m.top.urlData = urlData
end function
m.player.adBreakStarted = function(adBreakInfo)
print "------ Ad break started ------"
m.top.adPlaying = true
m.top.videoNode.enableTrickPlay = false
end function
m.player.adBreakEnded = function(adBreakInfo)
print "------ Ad break ended ------"
m.top.adPlaying = false
m.top.videoNode.enableTrickPlay = true
end function
end sub
</script>
...
</component>
ارائه پاد جاریسازی ویدیو بهدرخواست
برای جاریسازیهای VOD، این پخشکننده جاریسازی چهار روش برگشتی را پیادهسازی میکند:
streamInitialized، loadUrl، adBreakStarted، و adBreakEnded. در
streamInitialized پاسخبهتماس، حتماً
StreamManager.loadThirdPartyStream() را فراخوانی کنید. انجام ندادن این کار باعث میشود کیت توسعه نرمافزار
تابع loadUrl را راهاندازی نکند.
در این مرحله، همچنین نشانی وب جاریسازی را از شریک فناوری ویدیو (VTP) خود با شناسه جاریسازی که در loadAdPodStream() دریافت کردهاید درخواست میکنید. سپس، با مانیفست واحد آگهی و هر زیرنویسی که توسط VTP شما برگردانده شده است، با
StreamManager.loadThirdPartyStream() تماس بگیرید.
همچنین هنگام بارگیری جاریسازی، پخش فریبکارانه را غیرفعال کنید. این کار از رد کردن پیشنمایش توسط کاربران در لحظه شروع آن، قبلاز رویداد شروع وقفه آگهی جلوگیری میکند.
Sdk.xml
<?xml version="1.0" encoding="utf-8" ?>
<component name="IMASDKTask" extends="Task">
<interface>
<field id="IMASDKInitialized" type="Boolean" />
<field id="errors" type="stringarray" />
<field id="adStitchedStreamInfo" type="assocarray" />
<field id="adPlaying" type="Boolean" />
<field id="videoNode" type="Node" />
<field id="streamParameters" type="assocarray" />
</interface>
<script type="text/brightscript">
...
sub runThread()
if not m.top.IMASDKInitialized
initializeIMASDK()
end if
setupPlayerCallbacks()
end sub
...
sub initializeIMASDK()
if m.ima = invalid
ima = New_IMASDK()
ima.initSdk()
m.ima = ima
end if
m.top.IMASDKInitialized = true
end sub
sub loadThirdPartyStream(adStitchedManifest as string, subtitleConfig as dynamic)
m.streamManager.loadThirdPartyStream(adStitchedManifest, subtitleConfig)
end sub
sub setupPlayerCallbacks()
m.player = m.ima.createPlayer()
m.player.top = m.top
m.player.streamInitialized = function(urlData)
adStitchedManifest = m.top.streamParameters.VTPManifest.replace("[[STREAMID]]", urlData.streamId)
loadThirdPartyStream(adStitchedManifest, m.top.streamParameters.subtitleConfig)
end function
m.player.loadUrl = function(streamInfo)
m.top.adStitchedStreamInfo = streamInfo
end function
m.player.adBreakStarted = function(adBreakInfo)
print "------ Ad break started ------"
m.top.adPlaying = true
m.top.videoNode.enableTrickPlay = false
end function
m.player.adBreakEnded = function(adBreakInfo)
print "------ Ad break ended ------"
m.top.adPlaying = false
m.top.videoNode.enableTrickPlay = true
end function
end sub
</script>
...
</component>
ایجاد و اجرای درخواست جاریسازی زنده یا VOD Pod Serving
پساز داشتن پخشکننده جاریسازی، میتوانید درخواست جاریسازی ایجاد و اجرا کنید.
این نمونه دادههایی برای جاریسازی «ارائه پاد» دارد که در
m.testPodServingStream ذخیره شده است.
ارائه پاد جاریسازی زنده
در شیء m.testPodServingStream، پارامترهایی را که Google Ad
Manager برای شناسایی جاریسازی موردنظر نیاز دارد، مثل کد شبکه و
کلید دارایی سفارشی، ذخیره کنید. نشانی وب مانیفست مورداستفاده برای دسترسی به سرور دستکاری مانیفست را نیز ذخیره کنید. در این مورد، نشانی وب مانیفست باید پساز برگشت درخواست جاریسازی، شناسه جاریسازی Google را اضافه کند.
برای اینکه بتوانید از AdUI، مانند نمادهای adChoices، پشتیبانی کنید، باید ارجاع به گره حاوی ویدیو محتوای خود را نیز بهعنوان بخشی از درخواستتان ارسال کنید.
MainScene.xml
function init()
m.video = m.top.findNode("myVideo")
m.video.notificationinterval = 1
m.testPodServingStream = {
title: "Test live stream for DAI Pod Serving",
assetKey: "test-live-stream",
networkCode: "your-network-code",
manifest: "https://.../master.m3u8?stream_id=[[STREAMID]]",
apiKey: ""
}
runIMASDKTask()
end function
function runIMASDKTask()
m.IMASDKTask = createObject("roSGNode", "IMASDKTask")
m.IMASDKTask.streamParameters = m.testPodservingStream
m.IMASDKTask.videoNode = m.video
m.IMASDKTask.observeField("IMASDKInitialized", "handleIMASDKInitialized")
m.IMASDKTask.observeField("errors", "handleIMASDKErrors")
m.IMASDKTask.control = "RUN"
end function
Sdk.xml
<interface>
<field id="IMASDKInitialized" type="Boolean" />
<field id="errors" type="stringarray" />
<field id="urlData" type="assocarray" />
<field id="adPlaying" type="Boolean" />
<field id="videoNode" type="Node" />
<field id="streamParameters" type="assocarray" />
</interface>
...
sub runThread()
if not m.top.IMASDKInitialized
initializeIMASDK()
end if
setupPlayerCallbacks()
loadAdPodStream()
end sub
sub loadAdPodStream()
request = m.ima.CreatePodLiveStreamRequest(m.top.streamParameters.assetKey, m.top.streamParameters.networkCode, m.top.streamParameters.apiKey)
' Set the player object so that the request can trigger the player's
' callbacks at stream initialization or playback events.
request.player = m.player
' Set the video node for the IMA DAI SDK to create ad UI as its child nodes.
request.adUiNode = m.top.video
requestResult = m.ima.requestStream(request)
if requestResult <> invalid
print "Error requesting stream ";requestResult
return
end if
m.streamManager = invalid
while m.streamManager = invalid
sleep(50)
m.streamManager = m.ima.getStreamManager()
end while
if m.streamManager = invalid
errors = CreateObject("roArray", 1, True)
invalidStreamManagerError = "Invalid stream manager"
print invalidStreamManagerError
errors.push(invalidStreamManagerError)
m.top.errors = errors
return
end if
if m.streamManager["type"] <> invalid and m.streamManager["type"] = "error"
errors = CreateObject("roArray", 1, True)
print "Stream request returns an error. " ; m.streamManager["info"]
errors.push(m.streamManager["info"])
m.top.errors = errors
return
end if
setupStreamManager()
m.streamManager.start()
end sub
ارائه واحد تبلیغات جاریسازی ویدیو بهدرخواست
در شیء m.testPodServingStream، کد شبکه استفادهشده در درخواست جاریسازی را ذخیره میکنید تا Google Ad Manager بتواند شناسه جاریسازی ارائه دهد. همچنین نشانی وب مانیفست استفادهشده برای دسترسی به مانیفست ویژه کاربر را در سرور دستکاری مانیفست خود ذخیره کنید.
برای اینکه بتوانید از AdUI (مانند نمادهای adChoices) پشتیبانی کنید، باید ارجاعی به گره حاوی ویدیو محتوایتان را نیز بهعنوان بخشی از درخواستتان ارسال کنید.
MainScene.xml
sub init()
m.video = m.top.findNode("myVideo")
m.video.notificationinterval = 1
m.testPodServingStream = {
title: "Pod Serving VOD Stream",
networkCode: "your-network-code",
VTPManifest: "https://.../manifest.m3u8?gam-stream-id=[[STREAMID]]",
subtitleConfig: []
}
runIMASDKTask()
end sub
sub runIMASDKTask()
m.IMASDKTask = createObject("roSGNode", "IMASDKTask")
m.IMASDKTask.streamParameters = m.testPodservingStream
m.IMASDKTask.videoNode = m.video
m.IMASDKTask.observeField("IMASDKInitialized", "handleIMASDKInitialized")
m.IMASDKTask.observeField("errors", "handleIMASDKErrors")
m.IMASDKTask.control = "RUN"
end sub
Sdk.xml
sub runThread()
if not m.top.IMASDKInitialized
initializeIMASDK()
end if
setupPlayerCallbacks()
loadAdPodStream()
end sub
sub loadAdPodStream()
request = m.ima.CreatePodVodStreamRequest(m.top.streamParameters.networkCode)
' Set the player object so that the request can trigger the player
' callbacks at stream initialization or playback events.
request.player = m.player
' Set the video node for the IMA DAI SDK to create ad UI as its child nodes.
request.adUiNode = m.top.video
requestResult = m.ima.requestStream(request)
if requestResult <> invalid
print "Error requesting stream ";requestResult
return
end if
m.streamManager = invalid
while m.streamManager = invalid
sleep(50)
m.streamManager = m.ima.getStreamManager()
end while
if m.streamManager = invalid
errors = CreateObject("roArray", 1, True)
invalidStreamManagerError = "Invalid stream manager"
print invalidStreamManagerError
errors.push(invalidStreamManagerError)
m.top.errors = errors
return
end if
if m.streamManager["type"] <> invalid and m.streamManager["type"] = "error"
errors = CreateObject("roArray", 1, True)
print "Stream request returns an error. " ; m.streamManager["info"]
errors.push(m.streamManager["info"])
m.top.errors = errors
return
end if
setupStreamManager()
m.streamManager.start()
end sub
شنوندگان رویداد را اضافه کنید و جاریسازی را شروع کنید
ارائه واحد جاریسازی زنده
پساز درخواست جاریسازی، فقط چند کار باقی میماند: افزودن شنوندگان رویداد برای پیگیری پیشرفت آگهی و ارسال پیامهای Roku به SDK. مهم است که همه پیامها را به کیت توسعه نرمافزار بازارسال کنید تا مطمئن شوید آگهی بهدرستی بازپخش میشود. انجام ندادن این کار باعث میشود بازدیدهای آگهی بهدرستی گزارش نشود.
در این مرحله، تابعی نیز برای جایگزین کردن ماکرو [[STREAMID]] با شناسه جاریسازی اضافه میکنید و نشانی وب درخواست مانیفست تکمیلشده را به پخشکننده ویدیو ارسال میکنید.
این پیادهسازی شناسه جاریسازی را در این مرحله دریافت میکند، اما بسته به ادغام VTP شما، ممکن است قبلاز این مرحله دردسترس باشد.
MainScene.xml
function runIMASDKTask()
m.IMASDKTask = createObject("roSGNode", "IMASDKTask")
m.IMASDKTask.streamParameters = m.testPodservingStream
m.IMASDKTask.videoNode = m.video
m.IMASDKTask.observeField("IMASDKInitialized", "handleIMASDKInitialized")
m.IMASDKTask.observeField("errors", "handleIMASDKErrors")
m.sdkTask.observeField("adStitchedStreamInfo", "loadAdStitchedStream")
m.sdkTask.control = "RUN"
end function
sub loadAdStitchedStream(message as object)
print "Ad pod stream information ";message
adPodStreamInfo = message.getData()
manifest = m.testPodservingStream.manifest.Replace("[[STREAMID]]", adPodStreamInfo.streamId)
playStream(manifest, adPodStreamInfo.format)
end sub
sub playStream(url as string, format as string)
vidContent = createObject("RoSGNode", "ContentNode")
vidContent.url = url
vidContent.title = m.testPodservingStream.title
vidContent.streamformat = format
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.IMASDKInitialized
initializeIMASDK()
end if
setupPlayerCallbacks()
loadAdPodStream()
if m.streamManager <> invalid
runLoop()
end if
end sub
sub runLoop()
m.top.videoNode.timedMetaDataSelectionKeys = ["*"]
' IMPORTANT: Failure to listen to the position and timedmetadata fields
' could result in ad impressions not being reported.
m.port = CreateObject("roMessagePort")
m.top.videoNode.observeField("position", m.port)
m.top.videoNode.observeField("timedMetaData", m.port)
m.top.videoNode.observeField("timedMetaData2", m.port)
m.top.videoNode.observeField("state", m.port)
while True
msg = wait(1000, m.port)
if m.top.videoNode = invalid
print "exiting"
exit while
end if
m.streamManager.onMessage(msg)
currentTime = m.top.videoNode.position
if currentTime > 3 And not m.top.adPlaying
m.top.videoNode.enableTrickPlay = true
end if
end while
end sub
sub setupStreamManager()
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 sub
sub startCallback(ad as object)
print "Callback from SDK -- Start called - "
end sub
sub firstQuartileCallback(ad as object)
print "Callback from SDK -- First quartile called - "
end sub
sub midpointCallback(ad as object)
print "Callback from SDK -- Midpoint called - "
end sub
sub thirdQuartileCallback(ad as object)
print "Callback from SDK -- Third quartile called - "
end sub
sub completeCallback(ad as object)
print "Callback from SDK -- Complete called - "
end sub
function errorCallback(error as object)
print "Callback from SDK -- Error called - " ; error
m.errorState = True
end function
ارائه واحد تبلیغات جاریسازی ویدیو بهدرخواست
پساز درخواست جاریسازی، فقط چند کار باقی میماند: افزودن شنوندگان رویداد برای پیگیری پیشرفت آگهی و ارسال پیامهای Roku به SDK. مهم است که همه پیامها را به کیت توسعه نرمافزار بازارسال کنید تا مطمئن شوید بازپخش آگهی بهدرستی انجام میشود. انجام ندادن این کار باعث میشود بازدیدهای آگهی بهدرستی گزارش نشود.
MainScene.xml
sub runIMASDKTask()
m.IMASDKTask = createObject("roSGNode", "IMASDKTask")
m.IMASDKTask.streamParameters = m.testPodservingStream
m.IMASDKTask.videoNode = m.video
m.IMASDKTask.observeField("IMASDKInitialized", "handleIMASDKInitialized")
m.IMASDKTask.observeField("errors", "handleIMASDKErrors")
m.sdkTask.observeField("adStitchedStreamInfo", "loadAdStitchedStream")
m.sdkTask.control = "RUN"
end sub
sub loadAdStitchedStream(message as object)
print "Ad pod stream information ";message
adPodStreamInfo = message.getData()
end sub
sub playStream(url as string, format as string, subtitleConfig as object)
vidContent = createObject("RoSGNode", "ContentNode")
vidContent.title = m.testPodservingStream.title
vidContent.url = url
vidContent.subtitleConfig = subtitleConfig
vidContent.streamformat = format
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.IMASDKInitialized
initializeIMASDK()
end if
setupPlayerCallbacks()
loadAdPodStream()
if m.streamManager <> invalid
runLoop()
end if
end sub
sub runLoop()
m.top.videoNode.timedMetaDataSelectionKeys = ["*"]
' IMPORTANT: Failure to listen to the position and timedmetadata fields
' could result in ad impressions not being reported.
m.port = CreateObject("roMessagePort")
m.top.videoNode.observeField("position", m.port)
m.top.videoNode.observeField("timedMetaData", m.port)
m.top.videoNode.observeField("timedMetaData2", m.port)
m.top.videoNode.observeField("state", m.port)
while True
msg = wait(1000, m.port)
if m.top.videoNode = invalid
exit while
end if
m.streamManager.onMessage(msg)
currentTime = m.top.videoNode.position
if currentTime > 3 and not m.top.adPlaying
m.top.videoNode.enableTrickPlay = true
end if
end while
end sub
sub setupStreamManager()
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 sub
sub startCallback(ad as object)
print "Callback from SDK -- Start called - "
end sub
sub firstQuartileCallback(ad as object)
print "Callback from SDK -- First quartile called - "
end sub
sub midpointCallback(ad as object)
print "Callback from SDK -- Midpoint called - "
end sub
sub thirdQuartileCallback(ad as object)
print "Callback from SDK -- Third quartile called - "
end sub
sub completeCallback(ad as object)
print "Callback from SDK -- Complete called - "
end sub
sub errorCallback(error as object)
print "Callback from SDK -- Error called - " ; error
m.errorState = True
end sub