راه اندازی IMA SDK برای DAI، راه اندازی IMA SDK برای DAI، راه اندازی IMA SDK برای DAI، راه اندازی IMA SDK برای DAI

پلتفرم را انتخاب کنید: HTML5 Android iOS tvOS Cast Roku

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، موارد زیر را انجام دهید:

  1. IMA SDK را با فراخوانی New_IMASDK() راه اندازی کنید:

    sub loadSdk()
      If m.sdk = invalid
        m.sdk = New_IMASDK()
      End If
      m.top.sdkLoaded = true
    End Sub
    
  2. با ایجاد یک فیلد بولی sdkLoaded ، بارگیری IMA را پیگیری کنید:

    <field id="sdkLoaded" type="Boolean" />
    
  3. زیربرنامه loadSdk() را از زیربرنامه اصلی runThread() فراخوانی کنید:

    if not m.top.sdkLoaded
      loadSdk()
    End If
    
  4. برای ایجاد و اجرای شی 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
    
  5. تابع loadImaSdk() را از تابع init() فراخوانی کنید.

  6. زیرروال های شنونده 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، موارد زیر را انجام دهید:

  1. یک زیر روال setupVideoPlayer() ایجاد کنید که کارهای زیر را انجام می دهد:

    1. از متد createPlayer() برای ایجاد پخش کننده استریم استفاده کنید.

    2. از پخش کننده استریم بخواهید سه روش پاسخ به تماس را اجرا کند: loadUrl ، adBreakStarted ، و adBreakEnded .

    3. وقتی پخش جریانی بارگیری می‌شود، پخش ترفند را غیرفعال کنید تا از رد شدن پیش‌پول توسط کاربران در لحظه شروع جریان، قبل از فعال شدن رویداد شروع استراحت، جلوگیری شود.

    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 تماس اضافه کنید. برای جزئیات بیشتر، به افزودن پشتیبانی برای تبلیغات قابل رد شدن مراجعه کنید.

  2. فیلدهای urlData ، adPlaying و video را که در زیربرنامه setupVideoPlayer() استفاده شده است، اضافه کنید:

    <field id="urlData" type="assocarray" />
    <field id="adPlaying" type="Boolean" />
    <field id="video" type="Node" />
    

یک درخواست جریان ایجاد و اجرا کنید

برای درخواست جریان DAI خود، موارد زیر را انجام دهید:

  1. برای ایجاد و درخواست یک جریان، یک زیربرنامه 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
    
  2. فیلدهای streamData و streamManagerReady مورد استفاده در زیر روال loadStream() را اضافه کنید:

    <field id="streamManagerReady" type="Boolean" />
    <field id="streamData" type="assocarray" />
    
  3. اگر مدیر جریان در دسترس نیست، زیربرنامه loadStream() را از زیرروال runThread() فراخوانی کنید:

    if not m.top.streamManagerReady
      loadStream()
    End If
    
  4. بین 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