IMA SDKগুলি আপনার ওয়েবসাইট এবং অ্যাপগুলিতে মাল্টিমিডিয়া বিজ্ঞাপনগুলিকে একীভূত করা সহজ করে তোলে৷ IMA SDK যেকোন VAST-সঙ্গী বিজ্ঞাপন সার্ভার থেকে বিজ্ঞাপনের অনুরোধ করতে পারে এবং আপনার অ্যাপে বিজ্ঞাপন প্লেব্যাক পরিচালনা করতে পারে। IMA DAI SDK-এর সাথে, অ্যাপগুলি বিজ্ঞাপন এবং বিষয়বস্তু ভিডিওর জন্য একটি স্ট্রিম অনুরোধ করে—হয় VOD বা লাইভ সামগ্রী। SDK তারপরে একটি সম্মিলিত ভিডিও স্ট্রিম ফেরত দেয়, যাতে আপনাকে আপনার অ্যাপের মধ্যে বিজ্ঞাপন এবং বিষয়বস্তু ভিডিওর মধ্যে স্যুইচিং পরিচালনা করতে হবে না।
এই নির্দেশিকাটি দেখায় কিভাবে একটি সাধারণ ভিডিও প্লেয়ার অ্যাপে IMA SDK সংহত করা যায়। আপনি যদি একটি সম্পূর্ণ নমুনা ইন্টিগ্রেশন সহ দেখতে বা অনুসরণ করতে চান, GitHub থেকে মৌলিক উদাহরণ ডাউনলোড করুন।
IMA DAI ওভারভিউ
IMA DAI বাস্তবায়নে দুটি প্রধান SDK উপাদান জড়িত, যা এই নির্দেশিকায় প্রদর্শিত হয়েছে:
-
StreamRequest
: একটি বস্তু যা একটি স্ট্রিম অনুরোধ সংজ্ঞায়িত করে। স্ট্রিম অনুরোধ ভিডিও-অন-ডিমান্ড বা লাইভ স্ট্রিমের জন্য হতে পারে। অনুরোধগুলি একটি বিষয়বস্তু আইডি, সেইসাথে একটি API কী বা প্রমাণীকরণ টোকেন এবং অন্যান্য পরামিতি নির্দিষ্ট করে৷ -
StreamManager
: একটি বস্তু যা গতিশীল বিজ্ঞাপন সন্নিবেশ স্ট্রীম এবং DAI ব্যাকএন্ডের সাথে মিথস্ক্রিয়া পরিচালনা করে। স্ট্রিম ম্যানেজার ট্র্যাকিং পিং এবং ফরোয়ার্ড স্ট্রিম এবং বিজ্ঞাপন ইভেন্টগুলি প্রকাশকের কাছে পরিচালনা করে।
পূর্বশর্ত
আপনি শুরু করার আগে, আপনার প্রয়োজন:
- আপনার উদ্দেশ্য ব্যবহার কেস সমর্থিত তা নিশ্চিত করতে আমাদের সামঞ্জস্য পৃষ্ঠাটি পড়ুন।
- আমাদের Roku নমুনা প্লেয়ার কোড ডাউনলোড করুন.
- আপনার ডেভেলপমেন্ট সেট আপ কাজ করছে কিনা তা যাচাই করতে উপরের নমুনা প্লেয়ার কোডটি একটি Roku ডিভাইসে স্থাপন করুন।
আপনার ভিডিও চালান
প্রদত্ত নমুনা ভিডিও প্লেয়ার বাক্সের বাইরে একটি বিষয়বস্তু ভিডিও চালায়। আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট সঠিকভাবে সেট আপ করা হয়েছে তা নিশ্চিত করতে আপনার রোকু প্লেয়ারে নমুনা প্লেয়ারটি স্থাপন করুন।
আপনার ভিডিও প্লেয়ারটিকে একটি IMA ডায়নামিক অ্যাড ইনসার্শন স্ট্রিম প্লেয়ারে পরিণত করুন৷
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 বিজ্ঞাপনের ফ্রেমওয়ার্ক লোড করুন
IMA SDK Roku বিজ্ঞাপন ফ্রেমওয়ার্কের উপর নির্ভর করে। ফ্রেমওয়ার্ক লোড করতে, manifest
এবং Sdk.xml
এ নিম্নলিখিত যোগ করুন:
প্রকাশ
bs_libs_required=roku_ads_lib,googleima3
Sdk.xml
Library "Roku_Ads.brs" Library "IMA3.brs"
IMA SDK লোড করুন
আপনার IMA ডায়নামিক অ্যাড সন্নিবেশ স্ট্রীম লোড করার প্রথম ধাপ হল IMA SDK লোড করা এবং আরম্ভ করা। নিম্নলিখিতগুলি IMA SDK স্ক্রিপ্ট লোড করে৷
Sdk.xml
<interface> <field id="sdkLoaded" type="Boolean" /> <field id="errors" type="stringarray" /> </interface>
sub init() m.top.functionName = "runThread" End Sub sub runThread() if not m.top.sdkLoaded loadSdk() End If End Sub sub loadSdk() If m.sdk = invalid m.sdk = New_IMASDK() End If m.top.sdkLoaded = true End Sub
এখন MainScene.xml
এ এই কাজটি শুরু করুন এবং কন্টেন্ট স্ট্রিম লোড করার জন্য কলটি সরিয়ে দিন।
MainScene.xml
function init() m.video = m.top.findNode("myVideo") m.video.notificationinterval = 1 loadImaSdk() end function function loadImaSdk() as void m.sdkTask = createObject("roSGNode", "imasdk") m.sdkTask.observeField("sdkLoaded", "onSdkLoaded") m.sdkTask.observeField("errors", "onSdkLoadedError") m.sdkTask.control = "RUN" end function 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 স্ট্রিম প্লেয়ার তৈরি করতে আপনাকে আপনার বিদ্যমান roVideoScreen
ব্যবহার করতে হবে। এই স্ট্রীম প্লেয়ার তিনটি কলব্যাক পদ্ধতি প্রয়োগ করে: loadUrl
, adBreakStarted
এবং adBreakEnded
। স্ট্রীম লোড হলে ট্রিক প্লে অক্ষম করুন। এটি ব্যবহারকারীদের বিজ্ঞাপন বিরতি শুরু হওয়ার ইভেন্টটি বরখাস্ত হওয়ার আগে এটি শুরু হওয়ার সাথে সাথে একটি প্রি-রোল এড়িয়ে যেতে বাধা দেয়৷
Sdk.xml
<interface> <field id="sdkLoaded" type="Boolean" /> <field id="errors" type="stringarray" /> <field id="urlData" type="assocarray" /> <field id="adPlaying" type="Boolean" /> <field id="video" type="Node" /> </interface> ... sub setupVideoPlayer() sdk = m.sdk m.player = sdk.createPlayer() m.player.top = m.top m.player.loadUrl = Function(urlData) 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 End Sub
একটি স্ট্রিম অনুরোধ তৈরি করুন এবং চালান
এখন আপনার কাছে একটি স্ট্রিম প্লেয়ার আছে, আপনি একটি স্ট্রিম অনুরোধ তৈরি করতে এবং চালাতে পারেন৷ এই উদাহরণে একটি লাইভ স্ট্রিম এবং একটি VOD স্ট্রিমের ডেটা রয়েছে৷ বর্তমানে VOD স্ট্রিম ব্যবহার করা হচ্ছে। VOD-এর পরিবর্তে লাইভ ব্যবহার করতে, selectedStream
m.testVodStream
থেকে m.testLiveStream
এ পরিবর্তন করুন।
AdUI সমর্থন করতে সক্ষম হতে, যেমন adChoices আইকন, আপনাকে অবশ্যই আপনার অনুরোধের অংশ হিসাবে আপনার বিষয়বস্তু ভিডিও ধারণকারী নোডের একটি রেফারেন্স পাস করতে হবে।
MainScene.xml
function init() m.video = m.top.findNode("myVideo") m.video.notificationinterval = 1 m.testLiveStream = { title: "Live Stream", assetKey: "sN_IYUG8STe1ZzhIIE_ksA", apiKey: "", type: "live" } m.testVodStream = { title: "VOD stream" contentSourceId: "2528370", videoId: "tears-of-steel", apiKey: "", type: "vod" } loadImaSdk() end function function loadImaSdk() as void m.sdkTask = createObject("roSGNode", "imasdk") m.sdkTask.observeField("sdkLoaded", "onSdkLoaded") m.sdkTask.observeField("errors", "onSdkLoadedError") selectedStream = m.testVodStream m.videoTitle = selectedStream.title m.sdkTask.streamData = selectedStream m.sdkTask.video = m.video m.sdkTask.control = "RUN" end function
Sdk.xml
<interface> <field id="sdkLoaded" type="Boolean" /> <field id="errors" type="stringarray" /> <field id="urlData" type="assocarray" /> <field id="adPlaying" type="Boolean" /> <field id="video" type="Node" /> <field id="streamData" type="assocarray" /> <field id="streamManagerReady" type="Boolean" /> </interface>
sub runThread() if not m.top.sdkLoaded loadSdk() End If if not m.top.streamManagerReady loadStream() End If End Sub Sub loadStream() sdk = m.sdk sdk.initSdk() setupVideoPlayer() request = {} streamData = m.top.streamData if streamData.type = "live" request = sdk.CreateLiveStreamRequest(streamData.assetKey, streamData.apiKey) else if streamData.type = "vod" request = sdk.CreateVodStreamRequest(streamData.contentSourceId, streamData.videoId, streamData.apiKey) else request = sdk.CreateStreamRequest() end if request.player = m.player request.videoObject = m.top.video ' Required to support UI elements for 'Why This Ad?' and skippability 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
ইভেন্ট শ্রোতা যোগ করুন এবং স্ট্রীম শুরু করুন
আপনার স্ট্রীম অনুরোধ করার পরে, শুধুমাত্র কিছু কাজ বাকি আছে: বিজ্ঞাপনের অগ্রগতি ট্র্যাক করতে ইভেন্ট শ্রোতাদের যোগ করুন, আপনার স্ট্রীম শুরু করুন এবং SDK-এ Roku বার্তা ফরওয়ার্ড করুন৷ সঠিক বিজ্ঞাপন প্লেব্যাক নিশ্চিত করতে আপনার সমস্ত বার্তা SDK-এ ফরোয়ার্ড করা অত্যন্ত গুরুত্বপূর্ণ।
MainScene.xml
function loadImaSdk() as void m.sdkTask = createObject("roSGNode", "imasdk") m.sdkTask.observeField("sdkLoaded", "onSdkLoaded") m.sdkTask.observeField("errors", "onSdkLoadedError") selectedStream = m.testVodStream m.videoTitle = selectedStream.title m.sdkTask.streamData = selectedStream m.sdkTask.observeField("urlData", "urlLoadRequested") m.sdkTask.video = m.video m.sdkTask.control = "RUN" end function Sub urlLoadRequested(message as Object) print "Url Load Requested ";message data = message.getData() playStream(data.manifest) End Sub Sub playStream(url as Object) vidContent = createObject("RoSGNode", "ContentNode") vidContent.url = url vidContent.title = m.videoTitle vidContent.streamformat = "hls" 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.sdkLoaded loadSdk() End If if not m.top.streamManagerReady loadStream() End If If m.top.streamManagerReady runLoop() End If End Sub Sub runLoop() m.top.video.timedMetaDataSelectionKeys = ["*"] m.port = CreateObject("roMessagePort") ' Listen to all fields. ' IMPORTANT: Failure to listen to the position and timedmetadata fields ' could result in ad impressions not being reported. 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 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 m.errorState = True End Function
এড়িয়ে যাওয়া বিজ্ঞাপনগুলির জন্য সমর্থন যোগ করুন (ঐচ্ছিক)
বাদ দেওয়া যায় এমন বিজ্ঞাপনগুলিকে সমর্থন করার জন্য, আপনাকে IMA SDK-এর প্লেয়ার অবজেক্টে একটি seek
পদ্ধতি যোগ করতে হবে যা প্রোগ্রাম্যাটিকভাবে ভিডিওটিকে নির্দিষ্ট স্থানে, ফ্লোটিং-পয়েন্ট সেকেন্ডের মধ্যে খোঁজে।
Sdk.xml
... m.player.loadUrl = Function(urlData) m.top.video.enableTrickPlay = false m.top.urlData = urlData End Function m.player.seek = Function(timeSeconds as Float) print "---- SDK requested seek to ----" ; timeSeconds m.top.video.seekMode = "accurate" m.top.video.seek = timeSeconds End Function m.player.adBreakStarted = Function(adBreakInfo as Object) print "---- Ad Break Started ---- " m.top.adPlaying = True m.top.video.enableTrickPlay = false End Function ...