Pakiety IMA SDK ułatwiają integrację reklam multimedialnych z witrynami i aplikacjami. Pakiety IMA SDK mogą żądania reklam z Serwer reklam zgodny i zarządzanie odtwarzaniem reklam w aplikacjach. Dzięki pakietom SDK IMA DAI aplikacje żądania strumieniowego przesyłania danych reklamy i treści wideo – VOD lub treści na żywo. SDK zwraca wtedy typ połączony strumień wideo, dzięki czemu nie trzeba przełączać się między reklamą a treścią wideo. w Twojej aplikacji.
Wybierz rozwiązanie DAI, które Cię interesuje
DAI z pełną obsługą
Ten przewodnik pokazuje, jak zintegrować pakiet IMA DAI SDK z prostym odtwarzaczem wideo . Jeśli chcesz zobaczyć gotowy fragment lub zapoznać się z nim należy pobrać podstawowy program przykład z GitHuba.
Omówienie IMA DAI
Implementacja IMA DAI obejmuje 2 główne komponenty SDK, co pokazujemy przewodnik:
StreamRequest
: Obiekt definiujący żądanie strumienia. Żądania strumienia mogą dotyczyć wideo na żądanie lub na żywo. strumienie. Żądania określają identyfikator treści, a także klucz interfejsu API lub token uwierzytelniania oraz inne dane. .StreamManager
: Obiekt, który obsługuje strumienie dynamicznego wstawiania reklam i interakcje z backendem DAI. zarządza też pingami śledzącymi oraz przekazuje strumienie i zdarzenia reklamowe do wydawcy.
Wymagania wstępne
- Przeczytaj naszą stronę zgodności, by sprawdzić, czy Twój przypadek użycia jest obsługiwany.
- Pobierz przykładowy odtwarzacz Roku kod
- Wdróż przykładowy kod odtwarzacza na urządzeniu Roku, aby sprawdzić, czy która działa.
Odtwarzanie filmu
Udostępniony przykładowy odtwarzacz wideo od razu odtwarza film. Wdrażanie użyj przykładowego odtwarzacza do odtwarzacza Roku, aby upewnić się, że środowisko programistyczne być poprawnie skonfigurowane.
Przekształcanie odtwarzacza wideo w odtwarzacz strumienia IMA DAI
Aby wdrożyć odtwarzacz transmisji, wykonaj te czynności.
Utwórz plik Sdk.xml
Dodaj do projektu nowy plik o nazwie Sdk.xml
(oprócz MainScene.xml
),
i dodajemy taki schemat:
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>
W trakcie tego przewodnika musisz edytować oba te pliki.
Wczytaj platformę reklamową Roku
Pakiet IMA DAI SDK korzysta z platformy reklamowej Roku. Aby wczytać platformę,
dodaj do manifest
i Sdk.xml
te elementy:
manifestuj
bs_libs_required=roku_ads_lib,googleima3
Sdk.xml
Library "Roku_Ads.brs"
Library "IMA3.brs"
Wczytaj pakiet IMA DAI SDK
Pierwszym krokiem do załadowania strumienia IMA dynamicznego wstawiania reklam jest wczytanie zainicjuj pakiet IMA DAI SDK. Poniżej wczytujemy skrypt pakietu IMA DAI 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
Teraz rozpocznij to zadanie w aplikacji MainScene.xml
i usuń wywołanie umożliwiające wczytanie treści
.
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
Tworzenie odtwarzacza strumieni IMA
Następnie musisz użyć istniejącego roVideoScreen
, aby utworzyć strumień IMA
. Ten odtwarzacz strumienia wykorzystuje 3 metody wywołania zwrotnego: loadUrl
,
adBreakStarted
i adBreakEnded
. Wyłącz też zabawę sztuczek podczas transmisji
został wczytany. Dzięki temu użytkownicy nie będą mogli pominąć reklamy przed filmem, gdy tylko
przed wywołaniem zdarzenia rozpoczęcia przerwy na reklamę.
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
Tworzenie i wykonywanie żądania strumienia
Gdy masz już odtwarzacz strumieniowy, możesz utworzyć i wykonać żądanie strumienia.
Ten przykład zawiera dane transmisji na żywo i VOD. Wykorzystuje VOD
możesz transmitować na żywo, ale możesz korzystać z transmisji na żywo, zmieniając ustawienie selectedStream
z
m.testVodStream
do m.testLiveStream
.
Aby obsługiwać AdUI, np. ikony adChoices, musisz również przekazać wskazuje węzeł zawierający film z Twoim żądaniem.
MainScene.xml
function init()
m.video = m.top.findNode("myVideo")
m.video.notificationinterval = 1
m.testLiveStream = {
title: "Livestream",
assetKey: "sN_IYUG8STe1ZzhIIE_ksA",
apiKey: "",
type: "live"
}
m.testVodStream = {
title: "VOD stream"
contentSourceId: "2548831",
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
Dodaj detektory zdarzeń i uruchom strumień
Po przesłaniu prośby o transmisję musisz wykonać tylko kilka czynności: dodać wydarzenie detektory do śledzenia postępów reklam, rozpoczęcia transmisji i przekazywania wiadomości Roku do pakietu 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
Dodaj obsługę reklam możliwych do pominięcia (opcjonalnie)
Aby obsługiwać reklamy możliwe do pominięcia, musisz dodać metodę seek
do:
odtwarzacz pakietu IMA DAI SDK
który automatycznie wyszukuje film do określonej lokalizacji
w sekwencjach zmiennoprzecinkowych.
Aby obsługiwać reklamy możliwe do pominięcia, musisz też ustawić
adUiNode
w Twoim żądaniu.
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