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:
- 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
- Lacak apakah IMA telah dimuat dengan membuat kolom boolean - sdkLoaded:- <field id="sdkLoaded" type="Boolean" />
- Panggil subrutin - loadSdk()dari subrutin- runThread()utama:- if not m.top.sdkLoaded loadSdk() End If
- Buat fungsi - loadImaSdk()di- MainScene.xmluntuk 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
- Panggil fungsi - loadImaSdk()dari fungsi- init().
- 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:
- Buat subrutin - setupVideoPlayer()yang melakukan hal berikut:- Gunakan metode - createPlayer()untuk membuat pemutar streaming.
- Minta pemutar streaming tersebut menerapkan tiga metode callback: - loadUrl,- adBreakStarted, dan- adBreakEnded.
- 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 - seekuntuk mendukung iklan yang dapat dilewati. Untuk mengetahui detail selengkapnya, lihat Menambahkan dukungan untuk iklan yang dapat dilewati.
- Tambahkan kolom - urlData,- adPlaying, dan- videoyang 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:
- 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
- Tambahkan kolom - streamDatadan- streamManagerReadyyang digunakan dalam subrutin- loadStream():- <field id="streamManagerReady" type="Boolean" /> <field id="streamData" type="assocarray" />
- Jika pengelola streaming tidak tersedia, panggil subrutin - loadStream()dari subrutin- runThread():- if not m.top.streamManagerReady loadStream() End If
- 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 - selectedStreamdari objek- m.testVodStreammenjadi 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