این راهنما نحوه پخش کردن جاریسازی «ویدیو بهدرخواست» یا زنده «ارائه پاد» درج آگهی پویا را بااستفاده از «کیت توسعه نرمافزار» درج آگهی پویا IMA برای Roku نشان میدهد. برای مشاهده یا دنبال کردن یک نمونه ادغام تکمیلشده، نمونه ارائه Pod را بارگیری کنید.
نمای کلی «ارائه پاد درج آگهی پویا» در IMA
پیادهسازی «ارائه Pod» بااستفاده از IMA DAI شامل دو مؤلفه اصلی کیت توسعه نرمافزار است که در این راهنما نشان داده شده است:
StreamRequest.createPodLiveStreamRequest()/StreamRequest.createPodVodStreamRequest(): شیئی ایجاد میکند که درخواست جاریسازی به سرورهای تبلیغات Google را تعریف میکند. این درخواستها کد شبکه را مشخص میکنند و Pod Liveima.StreamRequestهمچنین به کلید دارایی سفارشی و کلید میانای برنامهسازی کاربردی اختیاری نیاز دارد.StreamManager: شیئی که ارتباط بین جاریسازی ویدیو و کیت توسعه نرمافزار IMA DAI را مدیریت میکند، مانند ارسال پینگهای ردیابی و بازارسال رویدادهای جاریسازی به ناشر.
علاوهبراین، باید درخواستی به سرور دستکاری مانیفست خود ارسال کنید تا مانیفست جاریسازی را برای نمایش در برنامهتان بازیابی کند. فرایند دقیق ممکن است از یک شریک فناوری ویدیو (VTP) به شریک دیگر متفاوت باشد.
پیشنیازها
- صفحه سازگاری ما را بخوانید تا مطمئن شوید مورد استفاده مدنظرتان پشتیبانی میشود.
- کد پخشکننده نمونه Roku ما را بارگیری کنید.
- کد پخشکننده نمونه را در دستگاه Roku مستقر کنید تا مطمئن شوید که راهاندازی توسعه شما کار میکند.
پخش کردن ویدیو
پخشکننده ویدیو نمونه ارائهشده، ویدیو محتوا را بهطور پیشفرض پخش میکند. پخشکننده نمونه را در دستگاه Roku خود مستقر کنید تا مطمئن شوید محیط توسعه شما بهدرستی راهاندازی شده است.
تبدیل کردن پخشکننده ویدیو به پخشکننده جاریسازی IMA DAI
برای پیادهسازی پخشکننده جاریسازی، این مراحل را دنبال کنید.
ایجاد Sdk.xml
فایل جدیدی به نام Sdk.xml درکنار MainScene.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، بار کردن و مقداردهی اولیه کیت توسعه نرمافزار «درج آگهی پویا» IMA است. موارد زیر اسکریپت IMA DAI SDK را مقداردهی اولیه میکند.
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>
ارائه پاد جاریسازی ویدیو بهدرخواست
برای جاریسازیهای ویدیو بهدرخواست، این پخشکننده جاریسازی چهار روش فراخوانی را اجرا میکند:
streamInitialized، loadUrl، adBreakStarted، و adBreakEnded. در
streamInitialized فراخوانی برگشتی، حتماً
StreamManager.loadThirdPartyStream() را فراخوانی کنید. انجام ندادن این کار باعث میشود کیت توسعه نرمافزار
تابع loadUrl را راهاندازی نکند.
در این مرحله، همچنین نشانی وب جاریسازی را از شریک فناوری ویدیویی (VTP) خود با شناسه جاریسازی بهدستآمده در loadAdPodStream() درخواست میکنید. سپس،
StreamManager.loadThirdPartyStream() را با مانیفست دسته آگهی و هرگونه
زیرنویس برگرداندهشده توسط VTP خود فراخوانی کنید.
همچنین، هنگام بار شدن جاریسازی، پخش سریع را غیرفعال کنید. این کار از رد کردن پیشپخش توسط کاربران در لحظه شروع آن، قبلاز فعال شدن رویداد شروع وقفه آگهی، جلوگیری میکند.
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>
ایجاد و اجرای درخواست جاریسازی «ارائه Pod» زنده یا «ویدیو بهدرخواست»
پساز داشتن پخشکننده جاریسازی، میتوانید درخواست جاریسازی ایجاد و اجرا کنید.
این نمونه دادههایی برای جاریسازی «ارائه پاد» دارد که در
m.testPodServingStream ذخیره شده است.
ارائه پاد جاریسازی زنده
در شیء m.testPodServingStream، پارامترهایی را که Google Ad Manager برای شناسایی جاریسازی موردنظر نیاز دارد، مانند کد شبکه و کلید دارایی سفارشی، ذخیره کنید. همچنین نشانی وب مانیفست را که برای دسترسی به سرور دستکاری مانیفست استفاده میشود ذخیره کنید. در این حالت، نشانی وب مانیفست باید شناسه Google Stream را داشته باشد که پساز برگرداندن درخواست جاریسازی اضافه شده است.
برای اینکه بتوانید از 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 به کیت توسعه نرمافزار. مهم است که همه پیامها را به کیت توسعه نرمافزار بازارسال کنید تا مطمئن شوید آگهی بهدرستی بازپخش میشود. انجام ندادن این کار منجر به گزارش نادرست بازدیدهای آگهی میشود.
در این مرحله، تابعی نیز برای جایگزین کردن ماکرو [[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 به کیت توسعه نرمافزار. مهم است که همه پیامها را به کیت توسعه نرمافزار بازارسال کنید تا مطمئن شوید بازپخش آگهی بهدرستی انجام میشود. عدم انجام این کار باعث میشود بازدیدهای آگهی بهطور نادرست گزارش شود.
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