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 subrutinrunThread()
utama:if not m.top.sdkLoaded loadSdk() End If
Buat fungsi
loadImaSdk()
diMainScene.xml
untuk membuat dan menjalankan objeksdkTask
: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 fungsiinit()
.Buat subrutin pemroses
onSdkLoaded()
danonSdkLoadedError()
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
, danadBreakEnded
.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.Tambahkan kolom
urlData
,adPlaying
, danvideo
yang digunakan dalam subrutinsetupVideoPlayer()
:<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
streamData
danstreamManagerReady
yang digunakan dalam subrutinloadStream()
:<field id="streamManagerReady" type="Boolean" /> <field id="streamData" type="assocarray" />
Jika pengelola streaming tidak tersedia, panggil subrutin
loadStream()
dari subrutinrunThread()
: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
selectedStream
dari objekm.testVodStream
menjadi objekm.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