इस गाइड में, वीडियो प्लेयर ऐप्लिकेशन में आईएमए डीएआई एसडीके को इंटिग्रेट करने का तरीका बताया गया है. अगर आपको इंटिग्रेशन का पूरा सैंपल देखना है या उसे फ़ॉलो करना है, तो GitHub से बुनियादी उदाहरण डाउनलोड करें.
आईएमए डीएआई के बारे में खास जानकारी
आईएमए डीएआई को लागू करने के लिए, एसडीके के दो मुख्य कॉम्पोनेंट की ज़रूरत होती है. इनके बारे में इस गाइड में बताया गया है:
StreamRequest: यह एक ऐसा ऑब्जेक्ट है जो स्ट्रीम के अनुरोध के बारे में बताता है. स्ट्रीम के अनुरोध, मांग पर वीडियो या लाइव स्ट्रीम के लिए हो सकते हैं. लाइव स्ट्रीम के अनुरोधों में ऐसेट कुंजी की जानकारी दी जाती है. वहीं, वीओडी के अनुरोधों में कॉन्टेंट मैनेजमेंट सिस्टम आईडी और वीडियो आईडी की जानकारी दी जाती है. दोनों तरह के अनुरोधों में, एपीआई पासकोड को शामिल किया जा सकता है. इसकी ज़रूरत, चुनिंदा स्ट्रीम को ऐक्सेस करने के लिए होती है. साथ ही, इनमें Google Ad Manager नेटवर्क कोड को भी शामिल किया जा सकता है. इसकी ज़रूरत, IMA SDK को होती है, ताकि वह Google Ad Manager की सेटिंग में बताए गए विज्ञापन आइडेंटिफ़ायर को मैनेज कर सके.StreamManager: यह एक ऐसा ऑब्जेक्ट है जो डाइनैमिक ऐड इंसर्शन स्ट्रीम और डीएआई बैकएंड के साथ इंटरैक्शन को मैनेज करता है. स्ट्रीम मैनेजर, ट्रैकिंग पिंग को भी मैनेज करता है. साथ ही, स्ट्रीम और विज्ञापन इवेंट को पब्लिशर को फ़ॉरवर्ड करता है.
ज़रूरी शर्तें
- हमारे साथ काम करने वाले डिवाइसों की सूची वाले पेज पर जाकर पक्का करें कि आपका डिवाइस, इस सुविधा के साथ काम करता हो.
- Roku सैंपल प्लेयर कोड डाउनलोड करें
- सैंपल प्लेयर कोड को Roku डिवाइस पर डिप्लॉय करें, ताकि यह पुष्टि की जा सके कि आपका डेवलपमेंट सेट अप काम कर रहा है.
वीडियो चलाना
सैंपल वीडियो प्लेयर, कॉन्टेंट वीडियो को बिना किसी अतिरिक्त सेटअप के चलाता है. सैंपल प्लेयर को अपने Roku प्लेयर पर डिप्लॉय करें, ताकि यह पक्का किया जा सके कि आपका डेवलपमेंट एनवायरमेंट सही तरीके से सेट अप किया गया है.
अपने वीडियो प्लेयर को आईएमए डीएआई स्ट्रीम प्लेयर में बदलना
स्ट्रीम प्लेयर लागू करने के लिए, यह तरीका अपनाएं.
Create 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 लोड करना
आईएमए डीएआई एसडीके, Roku Advertising Framework पर निर्भर करता है. फ़्रेमवर्क लोड करने के लिए, manifest और Sdk.xml में यह जोड़ें:
bs_libs_required=roku_ads_lib,googleima3
Library "Roku_Ads.brs"
Library "IMA3.brs"
आईएमए डीएआई एसडीके लोड करना
आईएमए डीएआई एसडीके लोड करने के लिए, यह तरीका अपनाएं:
New_IMASDK()कॉल की मदद से, IMA SDK टूल को शुरू करें:sub loadSdk() If m.sdk = invalid m.sdk = New_IMASDK() End If m.top.sdkLoaded = true End SubsdkLoadedबूलियन फ़ील्ड बनाकर ट्रैक करें कि आईएमए लोड हुआ है या नहीं:<field id="sdkLoaded" type="Boolean" />मुख्य
runThread()सबरूटीन सेloadSdk()सबरूटीन को कॉल करें:if not m.top.sdkLoaded loadSdk() End IfsdkTaskऑब्जेक्ट बनाने और चलाने के लिए,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 functioninit()फ़ंक्शन से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
आईएमए स्ट्रीम प्लेयर बनाना
आईएमए स्ट्रीम प्लेयर बनाने के लिए, यह तरीका अपनाएं:
एक
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" />
स्ट्रीम का अनुरोध बनाना और उसे लागू करना
अपनी डीएआई स्ट्रीम का अनुरोध करने के लिए, यह तरीका अपनाएं:
स्ट्रीम बनाने और उसका अनुरोध करने के लिए,
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 SubloadStream()सबरूटीन में इस्तेमाल किए गएstreamDataऔरstreamManagerReadyफ़ील्ड जोड़ें:<field id="streamManagerReady" type="Boolean" /> <field id="streamData" type="assocarray" />अगर स्ट्रीम मैनेजर उपलब्ध नहीं है, तो
runThread()सबरूटीन सेloadStream()सबरूटीन को कॉल करें: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" }डिफ़ॉल्ट रूप से, यह गाइड वीओडी स्ट्रीम का इस्तेमाल करती है. इसके बजाय, लाइव स्ट्रीम का इस्तेमाल किया जा सकता है. इसके लिए,
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() का इस्तेमाल करके, आईएमए को स्ट्रीम का मेटाडेटा भेजें:
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
विज्ञापन इवेंट सुनना
आईएमए को स्ट्रीम का मेटाडेटा भेजने पर, आईएमए विज्ञापन के लिए ब्रेक के दौरान विज्ञापन इवेंट दिखा सकता है. विज्ञापन इवेंट का जवाब देने के लिए, ज़रूरत के मुताबिक विज्ञापन इवेंट लिसनर बनाएं:
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 तरीका जोड़ना होगा. यह तरीका, वीडियो को प्रोग्राम के हिसाब से तय की गई जगह पर ले जाता है. यह जगह, फ़्लोटिंग-पॉइंट सेकंड में होती है.
स्किप किए जा सकने वाले विज्ञापनों के लिए, आपको अपने अनुरोध में
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