リニア DAI ストリームで時間指定メタデータを処理する

Interactive Media Ads(IMA)Dynamic Ad Insertion SDK(DAI)は、ストリームのメディア セグメント(バンド内メタデータ)またはストリーミング マニフェスト ファイル(マニフェスト内メタデータ)に埋め込まれたメタデータ情報を利用して、視聴者の現在地とクライアントサイドの広告イベントを追跡します。メタデータは、再生中のストリームのタイプに応じて、DAI ストリームからさまざまな形式で取得できます。Roku IMA SDK は、単一の API ですべてのメタデータ形式を処理します。

メタデータの取得と IMA DAI SDK への転送はアプリ側で行います。SDK には、この情報を渡すための StreamManager.onMessage() メソッドが用意されています。このメソッドは、roVideo ポートで提供される msg オブジェクトの形式でメタデータを転送します。その後、これらのオブジェクトが IMA DAI SDK で処理され、広告イベントのタイミングが決定されます。このメソッドは 1 つの引数を取ります。

  • msg: roVideo ポートが提供する msg タイプのオブジェクト。

メタデータのサンプルコード

次に、roVideo ポートからのメタデータを処理し、StreamManager.onMessage() を使用して IMA SDK に渡す方法の例を示します。

Sub runLoop()
  ' Forward all timed metadata events to IMA.
  m.top.video.timedMetaDataSelectionKeys = ["*"]

  ' Cycle through all the fields and set listeners.
  ' IMPORTANT: Failure to listen to the position and timedmetadata fields could
  ' result in ad impressions not being reported.
  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
    If currentTime > 3 And not m.top.adPlaying
       m.top.video.enableTrickPlay = true
    End If
  end while
End Sub

ループ処理のストリーム メタデータをアプリに組み込む方法について詳しくは、IMA Roku スタートガイドをご覧ください。ガイドのイベント リスナーとストリーム開始のセクションには、メタデータ処理ループが含まれています。

HLS CMAF ストリーム

Common Media Application Framework(CMAF)を使用するリニア DAI HLS ストリームでは、ID3 から CMAF 標準に準拠したインバンド eMSGv1 ボックスを通じて時間指定メタデータを渡します。これらの eMSG ボックスは各メディア セグメントの最初に埋め込まれ、各 ID3 eMSG にはストリーム内の最後の不連続性に対する PTS が含まれます。

IMA Roku の場合、すべての HLS CMAF ストリームは eMSGv0 形式を使用してインバンド ID3 データを送信します。 IMA は、eMSGv0 形式の情報と動画オブジェクトの情報を組み合わせます。

HLS CMAF ストリーム ID3 イベントを適切に解析できるようにするには、StreamRequest.videoObject を使用してストリーム リクエストで動画オブジェクトを送信する必要があります。