Menyiapkan IMA SDK untuk DAI

Pilih platform: HTML5 Android iOS tvOS Cast Roku

IMA SDK mempermudah integrasi iklan multimedia ke dalam situs dan aplikasi Anda. IMA SDK dapat meminta iklan dari server iklan yang kompatibel dengan VAST dan mengelola pemutaran iklan di aplikasi Anda. Dengan IMA DAI SDK, aplikasi membuat permintaan streaming untuk video iklan dan konten—baik konten VOD maupun live. Kemudian, SDK akan menampilkan streaming video gabungan, sehingga Anda tidak perlu mengelola peralihan antara video iklan dan konten dalam aplikasi Anda.

Pilih solusi DAI yang Anda minati

DAI layanan lengkap

Panduan ini menunjukkan cara mengintegrasikan IMA DAI SDK ke dalam aplikasi pemutar video sederhana. Jika Anda ingin melihat atau mengikuti contoh integrasi yang telah selesai, download contoh dasar dari GitHub.

Ringkasan IMA DAI

Penerapan DAI IMA melibatkan dua komponen SDK utama seperti yang ditunjukkan dalam panduan ini:

  • StreamRequest: Objek yang menentukan permintaan streaming. Permintaan streaming dapat berupa video-on-demand atau live stream. Permintaan live stream menentukan kunci aset, sedangkan permintaan VOD menentukan ID CMS dan ID video. Kedua jenis permintaan dapat secara opsional menyertakan kunci API yang diperlukan untuk mengakses streaming tertentu, dan kode jaringan Google Ad Manager agar IMA SDK menangani ID iklan seperti yang ditentukan dalam setelan Google Ad Manager.
  • StreamManager: Objek yang menangani streaming penyisipan iklan dinamis dan interaksi dengan backend DAI. Pengelola streaming juga menangani pelacakan ping dan meneruskan peristiwa streaming dan iklan ke penayang.

Prasyarat

  • Baca halaman kompatibilitas kami untuk memastikan kasus penggunaan yang Anda inginkan didukung.
  • Download kode pemutar contoh Roku kami
  • Deploy kode pemutar contoh ke perangkat Roku untuk memverifikasi bahwa penyiapan pengembangan Anda berfungsi.

Memutar video Anda

Pemutar video contoh yang disediakan memutar video konten secara langsung. Deploy pemutar contoh ke pemutar Roku Anda untuk memastikan lingkungan pengembangan Anda disiapkan dengan benar.

Mengubah pemutar video Anda menjadi pemutar streaming DAI IMA

Ikuti langkah-langkah berikut untuk menerapkan pemutar streaming.

Buat Sdk.xml

Tambahkan file baru ke project Anda di samping MainScene.xml yang bernama Sdk.xml, lalu tambahkan boilerplate berikut:

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>

Anda perlu mengedit kedua file ini di sepanjang panduan ini.

Memuat Roku Advertising Framework

IMA DAI SDK bergantung pada Roku Advertising Framework. Untuk memuat framework, tambahkan kode berikut ke manifest dan Sdk.xml:

bs_libs_required=roku_ads_lib,googleima3
Library "Roku_Ads.brs"
Library "IMA3.brs"

Memuat IMA DAI SDK

Untuk memuat IMA DAI SDK, lakukan hal berikut:

  1. Lakukan inisialisasi IMA SDK dengan panggilan New_IMASDK():

    sub loadSdk()
      If m.sdk = invalid
        m.sdk = New_IMASDK()
      End If
      m.top.sdkLoaded = true
    End Sub
    
  2. Lacak apakah IMA telah dimuat dengan membuat kolom boolean sdkLoaded:

    <field id="sdkLoaded" type="Boolean" />
    
  3. Panggil subrutin loadSdk() dari subrutin runThread() utama:

    if not m.top.sdkLoaded
      loadSdk()
    End If
    
  4. Buat fungsi loadImaSdk() di MainScene.xml untuk membuat dan menjalankan objek sdkTask:

    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. Panggil fungsi loadImaSdk() dari fungsi init().

  6. Buat subrutin pemroses onSdkLoaded() dan onSdkLoadedError() untuk merespons peristiwa pemuatan 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
    

Membuat pemutar streaming IMA

Untuk membuat pemutar streaming IMA, lakukan hal berikut:

  1. Buat subrutin setupVideoPlayer() yang melakukan hal berikut:

    1. Gunakan metode createPlayer() untuk membuat pemutar streaming.

    2. Minta pemutar streaming tersebut menerapkan tiga metode callback: loadUrl, adBreakStarted, dan adBreakEnded.

    3. Nonaktifkan pemutaran trik saat streaming dimuat untuk mencegah pengguna melewati pre-roll saat streaming dimulai, sebelum peristiwa mulai jeda iklan diaktifkan.

    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
    

    Tambahkan metode callback seek untuk mendukung iklan yang dapat dilewati. Untuk mengetahui detail selengkapnya, lihat Menambahkan dukungan untuk iklan yang dapat dilewati.

  2. Tambahkan kolom urlData, adPlaying, dan video yang digunakan dalam subrutin setupVideoPlayer():

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

Membuat dan menjalankan permintaan streaming

Untuk meminta streaming DAI, lakukan hal berikut:

  1. Buat subrutin loadStream() untuk membuat dan meminta streaming. Untuk mendukung UI iklan, seperti ikon adChoices, Anda juga harus meneruskan referensi ke node yang berisi video konten sebagai bagian dari permintaan Anda:

    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. Tambahkan kolom streamData dan streamManagerReady yang digunakan dalam subrutin loadStream():

    <field id="streamManagerReady" type="Boolean" />
    <field id="streamData" type="assocarray" />
    
  3. Jika pengelola streaming tidak tersedia, panggil subrutin loadStream() dari subrutin runThread():

    if not m.top.streamManagerReady
      loadStream()
    End If
    
  4. Pilih antara VOD atau livestream. Contoh berikut memiliki parameter streaming untuk livestream dan streaming 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"
    }
    

    Secara default, panduan ini menggunakan streaming VOD. Anda dapat menggunakan livestream sebagai gantinya dengan mengubah variabel selectedStream dari objek m.testVodStream menjadi objek m.testLiveStream.

Mulai streaming

Buat subrutin urlLoadRequested() untuk memproses data streaming dan panggil subrutin playStream():

Sub urlLoadRequested(message as Object)
  print "Url Load Requested ";message
  data = message.getData()

  playStream(data.manifest, data.format)
End Sub

Buat playStream() untuk memulai pemutaran streaming:

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

Mendengarkan metadata streaming

Buat subrutin runLoop() dengan loop while untuk dijalankan selama pemutaran streaming dan kirim metadata streaming ke IMA menggunakan 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

Memproses peristiwa iklan

Sekarang setelah Anda meneruskan metadata aliran ke IMA, IMA dapat memancarkan peristiwa iklan selama jeda iklan. Buat pemroses peristiwa iklan sesuai kebutuhan untuk merespons peristiwa iklan:

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

Menambahkan dukungan untuk iklan yang dapat dilewati (opsional)

Untuk mendukung iklan yang dapat dilewati, Anda perlu menambahkan metode seek ke objek player IMA DAI SDK yang secara terprogram mencari video ke lokasi yang ditentukan, dalam detik floating-point.

Untuk mendukung iklan yang dapat dilewati, Anda juga harus memastikan Anda menetapkan adUiNode dalam permintaan Anda.

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