IMA SDK ادغام تبلیغات چندرسانه ای را در وب سایت ها و برنامه های شما آسان می کند. IMA SDK میتواند از هر سرور تبلیغاتی سازگار با VAST آگهی درخواست کند و پخش آگهی را در برنامههای شما مدیریت کند. با IMA DAI SDK، برنامهها درخواست پخش جریانی برای آگهی و ویدیوی محتوا را ارائه میکنند - اعم از VOD یا محتوای زنده. سپس SDK یک جریان ویدیوی ترکیبی را برمیگرداند، به طوری که نیازی به مدیریت جابجایی بین آگهی و ویدیوی محتوا در برنامه خود ندارید.
راه حل DAI مورد علاقه خود را انتخاب کنید
خدمات کامل DAI
این راهنما نحوه ادغام IMA DAI SDK را در یک برنامه پخش کننده ویدیوی ساده نشان می دهد. اگر میخواهید نمونه یکپارچهسازی کامل شده را مشاهده یا دنبال کنید، نمونه اولیه را از GitHub دانلود کنید.
نمای کلی IMA DAI
پیاده سازی IMA DAI شامل دو جزء اصلی SDK است که در این راهنما نشان داده شده است:
-
StreamRequest
: یک شی که یک درخواست جریان را تعریف می کند. درخواستهای جریان میتواند برای ویدیوی درخواستی یا پخش مستقیم باشد. درخواستهای پخش زنده یک کلید دارایی را مشخص میکنند، در حالی که درخواستهای VOD یک شناسه CMS و شناسه ویدیو را مشخص میکنند. هر دو نوع درخواست میتوانند به صورت اختیاری شامل یک کلید API مورد نیاز برای دسترسی به جریانهای مشخص شده، و یک کد شبکه Google Ad Manager برای IMA SDK برای مدیریت شناسههای تبلیغاتی که در تنظیمات Google Ad Manager مشخص شدهاند، باشند. -
StreamManager
: شیئی که جریانهای درج آگهی پویا و تعاملات با باطن DAI را مدیریت می کند. مدیر جریان همچنین پینگهای ردیابی را مدیریت میکند و جریانها و رویدادهای تبلیغاتی را به ناشر ارسال میکند.
پیش نیازها
- صفحه سازگاری ما را بخوانید تا مطمئن شوید مورد استفاده مورد نظر شما پشتیبانی می شود.
- کد پخش کننده نمونه Roku ما را دانلود کنید
- کد پخش کننده نمونه را در دستگاه Roku مستقر کنید تا تأیید کنید که تنظیمات توسعه شما کار می کند.
ویدیوی خود را پخش کنید
پخش کننده ویدیوی نمونه ارائه شده یک ویدیوی محتوایی را خارج از جعبه پخش می کند. پخش کننده نمونه را در پخش کننده Roku خود مستقر کنید تا مطمئن شوید که محیط توسعه شما به درستی تنظیم شده است.
پخش کننده ویدیوی خود را به یک پخش کننده جریانی IMA DAI تبدیل کنید
این مراحل را برای پیاده سازی پخش کننده استریم دنبال کنید.
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>
شما باید هر دوی این فایل ها را در این راهنما ویرایش کنید.
چارچوب تبلیغاتی Roku را بارگیری کنید
IMA DAI SDK به چارچوب تبلیغات Roku بستگی دارد. برای بارگیری چارچوب، موارد زیر را به manifest
و Sdk.xml
اضافه کنید:
bs_libs_required=roku_ads_lib,googleima3
Library "Roku_Ads.brs"
Library "IMA3.brs"
IMA DAI SDK را بارگیری کنید
برای بارگیری IMA DAI SDK، موارد زیر را انجام دهید:
IMA SDK را با فراخوانی
New_IMASDK()
راه اندازی کنید:sub loadSdk() If m.sdk = invalid m.sdk = New_IMASDK() End If m.top.sdkLoaded = true End Sub
با ایجاد یک فیلد بولی
sdkLoaded
، بارگیری IMA را پیگیری کنید:<field id="sdkLoaded" type="Boolean" />
زیربرنامه
loadSdk()
را از زیربرنامه اصلیrunThread()
فراخوانی کنید:if not m.top.sdkLoaded loadSdk() End If
برای ایجاد و اجرای شی
sdkTask
تابعloadImaSdk()
را درMainScene.xml
ایجاد کنید:function loadImaSdk() as void m.sdkTask = createObject("roSGNode", "imasdk") m.sdkTask.observeField("sdkLoaded", "onSdkLoaded") m.sdkTask.observeField("errors", "onSdkLoadedError") ' Change to m.testLiveStream to demo live instead of VOD. selectedStream = m.testVodStream m.videoTitle = selectedStream.title m.sdkTask.streamData = selectedStream m.sdkTask.observeField("urlData", "urlLoadRequested") m.sdkTask.video = m.video ' Setting control to run starts the task thread. m.sdkTask.control = "RUN" end function
تابع
loadImaSdk()
را از تابعinit()
فراخوانی کنید.زیرروال های شنونده
onSdkLoaded()
وonSdkLoadedError()
را برای پاسخ به رویدادهای بارگذاری SDK ایجاد کنید: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 ایجاد کنید
برای ایجاد یک پخش کننده جریان IMA، موارد زیر را انجام دهید:
یک زیر روال
setupVideoPlayer()
ایجاد کنید که کارهای زیر را انجام می دهد:از متد
createPlayer()
برای ایجاد پخش کننده استریم استفاده کنید.از پخش کننده استریم بخواهید سه روش پاسخ به تماس را اجرا کند:
loadUrl
،adBreakStarted
، وadBreakEnded
.وقتی پخش جریانی بارگیری میشود، پخش ترفند را غیرفعال کنید تا از رد شدن پیشپول توسط کاربران در لحظه شروع جریان، قبل از فعال شدن رویداد شروع استراحت، جلوگیری شود.
sub setupVideoPlayer() sdk = m.sdk m.player = sdk.createPlayer() m.player.top = m.top m.player.loadUrl = Function(urlData) ' This line prevents users from scanning during buffering ' or during the first second of the ad before we have a callback from roku. ' If there are no prerolls disabling trickplay isn't needed. 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 Double) print "---- SDK requested seek to ----" ; timeSeconds m.top.video.seekMode = "accurate" m.top.video.seek = timeSeconds End Function End Sub
برای پشتیبانی از تبلیغات قابل رد شدن، روش
seek
تماس اضافه کنید. برای جزئیات بیشتر، به افزودن پشتیبانی برای تبلیغات قابل رد شدن مراجعه کنید.فیلدهای
urlData
،adPlaying
وvideo
را که در زیربرنامهsetupVideoPlayer()
استفاده شده است، اضافه کنید:<field id="urlData" type="assocarray" /> <field id="adPlaying" type="Boolean" /> <field id="video" type="Node" />
یک درخواست جریان ایجاد و اجرا کنید
برای درخواست جریان DAI خود، موارد زیر را انجام دهید:
برای ایجاد و درخواست یک جریان، یک زیربرنامه
loadStream()
ایجاد کنید. برای پشتیبانی از رابط کاربری تبلیغات، مانند نمادهای انتخاب تبلیغات ، همچنین باید به عنوان بخشی از درخواست خود، یک مرجع به گره حاوی ویدیوی محتوای خود ارسال کنید:Sub loadStream() sdk = m.sdk sdk.initSdk() setupVideoPlayer() request = {} streamData = m.top.streamData if streamData.type = "live" request = sdk.CreateLiveStreamRequest(streamData.assetKey, streamData.apiKey, streamData.networkCode) else if streamData.type = "vod" request = sdk.CreateVodStreamRequest(streamData.contentSourceId, streamData.videoId, streamData.apiKey, streamData.networkCode) else request = sdk.CreateStreamRequest() end if request.player = m.player request.adUiNode = 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
فیلدهای
streamData
وstreamManagerReady
مورد استفاده در زیر روالloadStream()
را اضافه کنید:<field id="streamManagerReady" type="Boolean" /> <field id="streamData" type="assocarray" />
اگر مدیر جریان در دسترس نیست، زیربرنامه
loadStream()
را از زیرروالrunThread()
فراخوانی کنید:if not m.top.streamManagerReady loadStream() End If
بین VOD یا پخش زنده انتخاب کنید. مثال زیر دارای پارامترهای جریان برای پخش زنده و جریان VOD است:
m.testLiveStream = { title: "Live Stream", assetKey: "c-rArva4ShKVIAkNfy6HUQ", networkCode: "21775744923", apiKey: "", type: "live" } m.testVodStream = { title: "VOD stream" contentSourceId: "2548831", videoId: "tears-of-steel", networkCode: "21775744923", apiKey: "", type: "vod" }
به طور پیش فرض، این راهنما از جریان VOD استفاده می کند. به جای آن میتوانید با تغییر متغیر
selectedStream
از شیm.testVodStream
به شیm.testLiveStream
از پخش زنده استفاده کنید.
استریم را شروع کنید
زیر روال urlLoadRequested()
را برای گوش دادن به داده های جریان ایجاد کنید و زیرروال playStream()
را فراخوانی کنید:
Sub urlLoadRequested(message as Object)
print "Url Load Requested ";message
data = message.getData()
playStream(data.manifest, data.format)
End Sub
برای شروع پخش جریان، playStream()
ایجاد کنید:
Sub playStream(url as String, format as String)
vidContent = createObject("RoSGNode", "ContentNode")
vidContent.url = url
vidContent.title = m.videoTitle
vidContent.streamformat = format
m.video.content = vidContent
m.video.setFocus(true)
m.video.visible = true
m.video.control = "play"
m.video.EnableCookies()
End Sub
به فراداده جریان گوش دهید
زیر روال runLoop()
را با یک حلقه while ایجاد کنید تا در حین پخش جریان اجرا شود و با استفاده از StreamManager.onMessage()
فراداده جریان را به IMA ارسال کنید:
Sub runLoop()
' Forward all timed metadata events.
m.top.video.timedMetaDataSelectionKeys = ["*"]
' Cycle through all the fields and just listen to them all.
m.port = CreateObject("roMessagePort")
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
' Only enable trickplay after a few seconds, in case we start with an ad,
' to prevent users from skipping through that ad.
If currentTime > 3 And not m.top.adPlaying
m.top.video.enableTrickPlay = true
End If
end while
End Sub
به رویدادهای تبلیغاتی گوش دهید
اکنون که ابردادههای جریان را به IMA ارسال میکنید، IMA میتواند رویدادهای تبلیغاتی را در طول وقفههای تبلیغاتی منتشر کند. شنوندگان رویداد تبلیغاتی را در صورت نیاز برای پاسخ به رویدادهای تبلیغاتی ایجاد کنید:
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
' errors are critical and should terminate the stream.
m.errorState = True
End Function
افزودن پشتیبانی برای تبلیغات قابل رد شدن (اختیاری)
به منظور پشتیبانی از تبلیغات قابل پرش، باید یک روش seek
را به شی پخش کننده IMA DAI SDK اضافه کنید که به صورت برنامهریزی ویدیو را در مکان مشخص شده در ثانیه ممیز شناور جستجو کند.
برای پشتیبانی از تبلیغات قابل پرش، باید مطمئن شوید که adUiNode
در درخواست خود تنظیم کرده اید.
m.player.seek = Function(timeSeconds as Double)
print "---- SDK requested seek to ----" ; timeSeconds
m.top.video.seekMode = "accurate"
m.top.video.seek = timeSeconds
End Function