Roku에서 IMA DAI SDK 사용

Google Cloud Video Stitcher API에 등록된 라이브 스트림 재생

이 가이드에서는 Roku용 IMA DAI SDK를 사용하여 Google Cloud Video Stitcher API에 등록된 이벤트의 라이브 스트림을 요청하고 재생하는 방법과 재생 중에 광고 시점을 삽입하는 방법을 설명합니다.

이 가이드에서는 IMA DAI용 시작 가이드의 기본 예시를 설명합니다.

다른 플랫폼과 통합하거나 IMA 클라이언트 측 SDK를 사용하는 방법에 대한 자세한 내용은 양방향 미디어 광고 SDK를 참조하세요.

Google Cloud 프로젝트 설정

IMA SDK에서 사용할 다음 변수를 입력합니다.

위치
라이브 구성이 생성된 Google Cloud 리전: LOCATION
프로젝트 번호
Video Stitcher API를 사용하는 Google Cloud 프로젝트 번호: PROJECT_NUMBER
OAuth 토큰

Video Stitcher 사용자 역할이 포함된 서비스 계정의 단기 OAuth 토큰:

OAUTH_TOKEN

서비스 계정의 단기 사용자 인증 정보 만들기에 대해 자세히 알아보세요. OAuth 토큰은 만료되지 않은 한 여러 요청에서 재사용될 수 있습니다.

네트워크 코드

광고 요청에 사용되는 Ad Manager 네트워크 코드: NETWORK_CODE

라이브 구성 ID
라이브 스트림 이벤트를 만들 때 지정한 라이브 구성 ID: LIVE_CONFIG_ID
커스텀 애셋 키
Video Stitcher API를 사용하여 라이브 스트림 이벤트 구성을 만드는 과정에서 생성된 Ad Manager 커스텀 애셋 키: CUSTOM_ASSET_KEY

기본 예시 다운로드

IMA Roku DAI 기본 예시를 다운로드하여 실행합니다. 동영상 플레이어에서 재생 버튼을 클릭하여 30초 간격으로 광고 시점이 포함된 단편 영화 'Tears of Steel'을 시작합니다.

라이브 스트림 요청

샘플 스트림을 Cloud Video Stitcher 라이브 스트림으로 바꾸려면 sdk.createVideoStitcherLiveStreamRequest() 함수를 사용합니다. DAI 세션이 활성화되면 Google Ad Manager UI를 사용하여 모니터링 및 디버깅 목적으로 생성된 DAI 세션을 찾을 수 있습니다.

기존 샘플에서는 VOD StreamRequest 또는 라이브 StreamRequest를 구성할지 여부를 결정하는 조건문이 있습니다. Google Cloud Video Stitcher API를 사용하려면 이전에 생성된 값을 사용하여 Cloud Video Stitcher 라이브 StreamRequest를 구성하는 새 경로를 추가합니다.

예시

basic_example/components/MainScene.xml

<?xml version="1.0" encoding="utf-8" ?>
<component name="MainScene" extends="Scene" initialFocus = "myVideo">
<script type="text/brightscript">
<![CDATA[
  function init()
    m.video = m.top.findNode("myVideo")
    m.video.notificationinterval = 1
    m.testLiveStream = {
      title: "Livestream",
      assetKey: "c-rArva4ShKVIAkNfy6HUQ",
      apiKey: "",
      type: "live"
    }
    m.testVodStream = {
      title: "VOD stream"
      contentSourceId: "2548831",
      videoId: "tears-of-steel",
      apiKey: "",
      type: "vod"
    }
    m.testVideoStitcherLiveStream = {
      title: "Video Stitcher Livestream",
      customAssetKey: "CUSTOM_ASSET_KEY",
      networkCode: "NETWORK_CODE",
      liveConfigId: "LIVE_CONFIG_ID",
      region: "LOCATION",
      projectNumber: "PROJECT_NUMBER",
      oAuthToken: "OAUTH_TOKEN",
      apiKey: "",
      type: "stitcherLive"
    }
    loadImaSdk()
  end function

  function loadImaSdk() as void
    m.sdkTask = createObject("roSGNode", "imasdk")
    m.sdkTask.observeField("sdkLoaded", "onSdkLoaded")
    m.sdkTask.observeField("errors", "onSdkLoadedError")

    ' Set this to the stream data you would like to play.
    selectedStream = m.testVideoStitcherLiveStream
    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

basic_example/components/Sdk.xml

  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 if streamData.type = "stitcherLive"
      request = sdk.CreateVideoStitcherLiveStreamRequest(
        streamData.customAssetKey,
        streamData.networkCode,
        streamData.liveConfigId,
        streamData.region,
        streamData.projectNumber,
        streamData.oAuthToken
      )
    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

변경사항을 추가한 후 앱을 새로고침하여 커스텀 라이브 스트림을 요청하고 재생합니다.

(선택사항) 스트리밍 세션 옵션 추가

StreamRequest 객체에 videoStitcherSessionOptions 매개변수를 채워 기본 Cloud Video Stitcher API 구성을 재정의하는 세션 옵션을 추가하여 스트림 요청을 맞춤설정합니다.

인식할 수 없는 옵션을 제공하면 Cloud Video Stitcher API에서 HTTP 400 오류로 응답합니다. 도움이 필요하면 문제 해결 가이드를 참조하세요.

예를 들어 다음 코드 스니펫으로 매니페스트 옵션을 재정의할 수 있으며 이 옵션에서는 가장 낮은 비트 전송률에서 가장 높은 비트 전송률 순으로 변환되는 스트림 매니페스트 2개를 요청합니다.


request = sdk.CreateVideoStitcherLiveStreamRequest(customAssetKey, networkCode, liveConfigId, region, projectNumber, oAuthToken)

request.player = m.player
request.adUiNode = m.top.video

sessionOptions = {
  "manifestOptions": {
    "includeRenditions":[
      {"bitrateBps": 3000, "codecs": "hvc1.1.4.L126.B0, mp4a.40.2"},
      {"bitrateBps": 2000, "codecs": "avc1.64001f, mp4a.40.2"},
    ]
  }
}
request.videoStitcherSessionOptions = sessionOptions

requestResult = sdk.requestStream(request)

광고 시점 삽입

Google Cloud Video Stitcher API는 각 광고 시점의 광고 태그에서 검색된 광고를 삽입합니다. 광고 시점은 광고 마커를 사용하여 매니페스트에 표시됩니다. 라이브 스트림 인코더에서 광고 마커를 삽입합니다.

  • 자체 라이브 스트림을 사용하는 경우 사용자가 광고 마커를 삽입해야 합니다. 지원되는 HLS 및 DASH 광고 마커에 대한 자세한 내용은 광고 마커 문서를 참조하세요.

  • Google Cloud Livestream API를 사용하여 라이브 스트림을 만든 경우 광고 시점 채널 이벤트를 삽입합니다.

광고 시점이 삽입되면 바로 광고가 재생됩니다.

삭제

이제 Google Cloud Video Stitcher API를 사용하여 라이브 스트림을 성공적으로 호스팅하고 Roku용 IMA DAI SDK를 사용하여 요청했으므로 모든 제공 리소스를 삭제해야 합니다.

라이브 스트림 삭제 가이드에 따라 불필요한 리소스와 애셋을 삭제합니다.