IMA SDK की मदद से, अपनी वेबसाइटों और ऐप्लिकेशन में मल्टीमीडिया विज्ञापन आसानी से इंटिग्रेट किए जा सकते हैं. IMA SDK, VAST के साथ काम करने वाले किसी भी विज्ञापन सर्वर से विज्ञापनों का अनुरोध कर सकते हैं. साथ ही, आपके ऐप्लिकेशन में विज्ञापन चलाने की सुविधा को मैनेज कर सकते हैं. IMA DAI SDK की मदद से, ऐप्लिकेशन विज्ञापन और कॉन्टेंट वीडियो के लिए स्ट्रीम का अनुरोध करते हैं. यह कॉन्टेंट, वीओडी या लाइव कॉन्टेंट में से कोई भी हो सकता है. इसके बाद, SDK टूल एक साथ वीडियो स्ट्रीम दिखाता है, ताकि आपको अपने ऐप्लिकेशन में विज्ञापन और कॉन्टेंट वीडियो के बीच स्विच करने की ज़रूरत न पड़े.
वह DAI समाधान चुनें जिसमें आपकी दिलचस्पी है
डीएआई की पूरी सेवा
इस गाइड में, IMA DAI SDK को किसी सामान्य वीडियो प्लेयर ऐप्लिकेशन में इंटिग्रेट करने का तरीका बताया गया है. अगर आपको इंटिग्रेशन का पूरा सैंपल देखना है या उसे फ़ॉलो करना है, तो GitHub से बुनियादी उदाहरण डाउनलोड करें.
IMA DAI की खास जानकारी
IMA DAI को लागू करने के लिए, दो मुख्य एसडीके कॉम्पोनेंट की ज़रूरत होती है. इनके बारे में इस गाइड में बताया गया है:
- StreamRequest: यह एक ऐसा ऑब्जेक्ट है जो स्ट्रीम के अनुरोध के बारे में बताता है. स्ट्रीम करने के अनुरोध, वीडियो ऑन डिमांड या लाइव स्ट्रीम के लिए किए जा सकते हैं. लाइव स्ट्रीम के अनुरोधों में, ऐसेट की के बारे में बताया जाता है. वहीं, वीडियो ऑन डिमांड के अनुरोधों में, सीएमएस आईडी और वीडियो आईडी के बारे में बताया जाता है. दोनों तरह के अनुरोधों में, एपीआई कुंजी शामिल की जा सकती है. इसकी ज़रूरत, तय की गई स्ट्रीम को ऐक्सेस करने के लिए होती है. साथ ही, इसमें Google Ad Manager नेटवर्क कोड भी शामिल किया जा सकता है, ताकि IMA SDK, Google Ad Manager की सेटिंग में बताए गए विज्ञापन आइडेंटिफ़ायर को मैनेज कर सके.
- StreamManager: यह एक ऐसा ऑब्जेक्ट है जो डाइनैमिक ऐड इंसर्शन वाली स्ट्रीम और डीएआई बैकएंड के साथ इंटरैक्शन को मैनेज करता है. स्ट्रीम मैनेजर, ट्रैकिंग पिंग को भी मैनेज करता है. साथ ही, स्ट्रीम और विज्ञापन इवेंट को पब्लिशर को भेजता है.
ज़रूरी शर्तें
- डिवाइस के साथ काम करने वाले पेज को पढ़ें. इससे आपको यह पक्का करने में मदद मिलेगी कि आपके इस्तेमाल के उदाहरण के लिए, डिवाइस के साथ काम करने की सुविधा उपलब्ध है या नहीं.
- 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>
आपको इस गाइड में इन दोनों फ़ाइलों में बदलाव करना होगा.
Roku Advertising Framework लोड करना
IMA DAI SDK, Roku Advertising Framework पर निर्भर करता है. फ़्रेमवर्क लोड करने के लिए, manifest और Sdk.xml में यह कोड जोड़ें:
bs_libs_required=roku_ads_lib,googleima3
Library "Roku_Ads.brs"
Library "IMA3.brs"
IMA DAI SDK लोड करना
IMA DAI SDK को लोड करने के लिए, यह तरीका अपनाएं:
- New_IMASDK()कॉल के साथ IMA SDK को शुरू करें:- 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" />
- मुख्य - runThread()सबरूटीन से- loadSdk()सबरूटीन को कॉल करें:- if not m.top.sdkLoaded loadSdk() End If
- sdkTaskऑब्जेक्ट बनाने और उसे चलाने के लिए,- MainScene.xmlमें- loadImaSdk()फ़ंक्शन बनाएं:- 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
- init()फ़ंक्शन से- loadImaSdk()फ़ंक्शन को कॉल करें.
- SDK लोड इवेंट के जवाब देने के लिए, - onSdkLoaded()और- onSdkLoadedError()लिसनर सबरूटीन बनाएं:- 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कॉलबैक तरीका जोड़ें. ज़्यादा जानकारी के लिए, स्किप किए जा सकने वाले विज्ञापनों के लिए सहायता जोड़ना लेख पढ़ें.
- setupVideoPlayer()सब-रूटिन में इस्तेमाल किए गए- urlData,- adPlaying, और- videoफ़ील्ड जोड़ें:- <field id="urlData" type="assocarray" /> <field id="adPlaying" type="Boolean" /> <field id="video" type="Node" />
स्ट्रीम का अनुरोध बनाना और उसे पूरा करना
अपनी DAI स्ट्रीम का अनुरोध करने के लिए, यह तरीका अपनाएं:
- स्ट्रीम बनाने और उसका अनुरोध करने के लिए, - loadStream()सबरूटीन बनाएं. विज्ञापन के यूज़र इंटरफ़ेस (यूआई), जैसे कि AdChoices आइकॉन को सपोर्ट करने के लिए, आपको अपने अनुरोध के हिस्से के तौर पर, कॉन्टेंट वीडियो वाले नोड का रेफ़रंस भी पास करना होगा:- 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
- loadStream()सब-रूटीन में इस्तेमाल किए गए- streamDataऔर- streamManagerReadyफ़ील्ड जोड़ें:- <field id="streamManagerReady" type="Boolean" /> <field id="streamData" type="assocarray" />
- अगर स्ट्रीम मैनेजर उपलब्ध नहीं है, तो - loadStream()सबरूटीन से- loadStream()सबरूटीन को कॉल करें:- runThread()- if not m.top.streamManagerReady loadStream() End If
- वीओडी या लाइव स्ट्रीम में से कोई एक चुनें. यहां दिए गए उदाहरण में, लाइव स्ट्रीम और वीओडी स्ट्रीम के लिए स्ट्रीम पैरामीटर दिए गए हैं: - 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" }- डिफ़ॉल्ट रूप से, यह गाइड वीओडी स्ट्रीम का इस्तेमाल करती है. लाइव स्ट्रीम का इस्तेमाल करने के लिए, - m.testVodStreamऑब्जेक्ट से- selectedStreamवैरिएबल को- 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
स्किप किए जा सकने वाले विज्ञापनों के लिए सहायता जोड़ें (ज़रूरी नहीं)
स्किप किए जा सकने वाले विज्ञापनों को दिखाने के लिए, आपको IMA DAI SDK के player ऑब्जेक्ट में seek तरीका जोड़ना होगा. यह तरीका, वीडियो को फ़्लोटिंग-पॉइंट सेकंड में बताई गई जगह पर प्रोग्राम के हिसाब से ले जाता है.
स्किप किए जा सकने वाले विज्ञापनों को दिखाने के लिए, आपको यह भी पक्का करना होगा कि आपने अपने अनुरोध में 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