ミッドロール挿入点

概要

Web Receiver SDK は、特定のメディア ストリーム内の広告ブレークとコンパニオン広告をネイティブにサポートしています。広告ブレークとそれに関連するブレーククリップについて、広告の位置、広告ソース、動作を設定するための API が用意されています。このガイドでは、Break は 1 つ以上の広告またはバンパーを含む再生の間隔を意味し、個々の広告またはバンパーは BreakClip と呼ばれます。挿入点は、読み込みまたは再生中のメディアに関連付けられます。

広告の種類

Web Receiver SDK は、クライアントサイド広告挿入(CSAI)とサーバー合成広告挿入(SSAI)をサポートしています。クライアント合成広告は、アプリケーションで手動で設定することも、VAST および VMAP テンプレート ファイルから抽出することもできます。サーバーで合成された広告は、コンテンツの読み込み前に埋め込み広告として手動で指定し、コンテンツの再生中に埋め込み拡張広告として動的に設定する必要があります。各広告タイプの実装方法について、以下で詳しく説明します。

手動クライアント合成

手動のクライアントによって合成された広告ブレークは、クライアントがつなぎ合わせる広告ブレークの一種です。アプリで SDK API を使用して手動で指定します。この広告タイプは、メイン コンテンツのストリームに埋め込まれていません。BreakClip では、広告コンテンツを指す URL である contentId、広告コンテンツの形式を表す contentTypetitle を指定する必要があります。

Break では、isEmbeddedexpanded をデフォルト値の false に設定する必要があります。position は、プレロールミッドロール、またはポストロールの広告ブレークに設定できます(詳しくは、広告ブレークの配置のセクションをご覧ください)。広告を再生するための準備を行う際、Web Receiver SDK は、広告コンテンツを読み込んで再生するための別のプレーヤー インスタンスを生成します。こうした挿入点には stitched timeline が必要で、静的に追加する必要があります(詳しくは、広告の挿入のセクションをご覧ください)。次のサンプルは、手動クライアント合成広告の基本的な実装を示しています。

// Create the BreakClip.
let clipClient = new cast.framework.messages.BreakClip('bc_client');
clipClient.title = 'The Ad Title to be displayed during playback';
clipClient.contentId = 'https://example.com/ad.m3u8';
clipClient.contentType = 'application/vnd.apple.mpegurl';

// Optional: Used when HLS ad container formats differ from the main content's.
clipClient.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.FMP4;

// Create the Break using the BreakClip id above.
let breakPostrollClient = new cast.framework.messages.Break(
    'break_postroll_client', ['bc_client'], -1);
breakPostrollClient.isEmbedded = false; // Optional: default is false.
breakPostrollClient.expanded = false; // Optional: default is false.

VAST

Web Receiver SDK では、IAB 標準の VAST(Video Ad Serving Template)広告の追加がサポートされています。指定すると、XML テンプレートが解析され、広告ブレークの開始時に、その後のクライアントが合成したブレーク クリップが生成されます。

VAST 広告を作成するには、レシーバー アプリで VastAdsRequest を作成し、BreakClip vastAdsRequest プロパティで指定する必要があります。VastAdsRequest オブジェクトには、adsResponse(XML テンプレート自体の文字列表現)または adTagUrl(XML テンプレートがホストされている URL)のプロパティを定義しておく必要があります。URL を指定すると、SDK がテンプレートの取得を処理します。カプセル化する Break は、クライアントが合成した広告の規則に従います。これらの広告は、同じ広告ブレークで、または同じコンテンツ用の別々のブレークで、クライアントが手動で合成した他の広告とともに追加できます。次のサンプルは、VAST 広告の基本的な実装を示しています。

// Create the VastAdsRequest.
let vastTemplate = new cast.framework.messages.VastAdsRequest();
vastTemplate.adTagUrl = 'https://example.com/ads.xml'

// Create the BreakClip.
let clipVast = new cast.framework.messages.BreakClip('bc_vast');
clipVast.vastAdsRequest = vastTemplate;

// Create the Break using the BreakClip id above.
let breakPostrollVast = new cast.framework.messages.Break(
    'break_postroll_vast', ['bc_vast'], -1);
breakPostrollVast.isEmbedded = false; // Optional: default is false.
breakPostrollVast.expanded = false; // Optional: default is false.

VAST BreakClip を含む Break を入力すると、Web Receiver SDK では必要に応じてテンプレートが取得され、解析されます。解析中に SDK は新しい BreakClip を生成し、テンプレートから抽出した値(contentIdcontentTypetitledurationwhenSkippableclickThroughUrl など)を入力します。生成されたブレーク クリップの idGENERATED:N に設定されます。N は、0 以降に作成された新しい VAST ブレーク クリップごとに 1 ずつ増加する整数です。生成された広告は BreakClip 配列に追加されます。現在の Break 内の各 VAST ブレーククリップの id が、対応する生成されたブレーククリップの id に置き換えられます。以下のスニペットは、このような休憩に入る前と後の広告に関連する MEDIA_STATUS メッセージの変更点を示しています。

VAST 広告で休憩に入る前の BreakBreakClip の情報。

"breaks": [
  {
    "id": "break_postroll_vast",
    "breakClipIds": [
      "bc_vast"
    ],
    "position": 0,
    "isWatched": false
  }
],
"breakClips": [
  {
    "id": "bc_vast"
  }
]

VAST 広告で休憩を入れた後の BreakBreakClip の情報。

"breaks": [
  {
    "id": "break_postroll_vast",
    "breakClipIds": [
      "GENERATED:0"
    ],
    "position": 0,
    "isWatched": true
  }
],
"breakClips": [
  {
    "id": "bc_vast"
  },
  {
    "id": "GENERATED:0",
    "contentId": "https://example.com/break-clip-1.mpd",
    "contentType": "application/dash+xml",
    "title": "Ad Title Extracted from Template",
    "duration": 10,
    "whenSkippable": 5,
    "clickThroughUrl": "https://example.com/ad-target"
  }
]

VMAP

Web Receiver SDK は、IAB VMAP(Video Multiple Ad Playback)標準をサポートしています。VMAP を指定すると、Web Receiver SDK は VMAP レスポンスを解析し、レスポンスの <AdBreak> エントリについてクライアント合成Break オブジェクトを生成します。また、VMAP で指定された各 <AdSource> エントリに対して vastAdsRequest オブジェクトを使用して適切な BreakClips を生成します。VMAP でコンテンツに広告を挿入できるようにするには、アプリケーションで VastAdsRequest オブジェクトを作成し、LoadRequestDataMediaInformationvmapAdsRequest プロパティに割り当てる必要があります。これらの広告は静的に挿入する必要があります(詳しくは、広告の挿入セクションをご覧ください)。VMAP リクエストの作成の概要を次に示します。

// Create the VastAdsRequest.
let vastTemplate = new cast.framework.messages.VastAdsRequest();
vastTemplate.adTagUrl = 'https://example.com/vmap.xml'

// Add it to the MediaInformation of the LoadRequest.
loadRequestData.media.vmapAdsRequest = vastTemplate;

埋め込み

埋め込みミッドロール挿入点は、メイン コンテンツのストリームにサーバーサイドで埋め込まれる広告ブレークの一種です。メディア時間を計算する際、Break の時間はメイン コンテンツの再生時間から差し引かれます。

BreakClip では、広告コンテンツの durationtitle を指定する必要があります。BreakisEmbeddedtrue に、expandedfalse に設定する必要があります。position は、プレロール広告またはミッドロール広告ブレークとして設定できます。ポストロールミッドロール挿入点は、正の正確な position 値でサポートされます。詳しくは、ブレークの配置のセクションをご覧ください。広告がトリガーされると、広告セグメントが埋め込まれている間、Web Receiver SDK はストリームの再生を継続します。この広告タイプには、追加の読み込みメカニズムはありません。プレイヘッドが休憩時間の範囲内に入ると、関連する広告メタデータがユーザーに表示されます。こうした挿入点には embedded timeline が必要で、静的に追加する必要があります(詳しくは、広告の挿入のセクションをご覧ください)。次のサンプルは、embedded 広告の基本的な実装を示しています。

// Create the BreakClip.
let clipEmbedded = new cast.framework.messages.BreakClip('bc_embedded');
clipEmbedded.title = 'The Ad Title to be displayed during playback';
clipEmbedded.duration = 15;

// Create the Break using the BreakClip id above.
let breakPrerollEmbedded = new cast.framework.messages.Break(
    'break_preroll_embedded', ['bc_embedded'], 0);
breakPrerollEmbedded.isEmbedded = true;
breakPrerollEmbedded.expanded = false; // Optional: default is false.

埋め込み 展開

埋め込み拡張ミッドロール挿入点は、メイン コンテンツのストリームにサーバー側で合成されるミッドロール挿入点です。Break の再生時間は、メディア時間を計算する際、メイン コンテンツの再生時間に含まれます。

BreakClip では、広告コンテンツの durationtitle を指定する必要があります。BreakisEmbeddedtrue に、expandedtrue に設定する必要があります。position は、プレロール広告またはミッドロール広告ブレークとして設定できます。ポストロールミッドロール挿入点は、正の position 値でサポートされます。詳しくは、ブレークの配置のセクションをご覧ください。広告がトリガーされると、広告セグメントが埋め込まれている間、Web Receiver SDK はストリームの再生を継続します。この広告タイプには、追加の読み込みメカニズムはありません。プレイヘッドが休憩時間の範囲内に入ると、関連する広告メタデータがユーザーに表示されます。ミッドロール挿入点は embedded timeline を必要とし、静的または動的に追加できます(詳しくは広告の挿入のセクションをご覧ください)。次のサンプルは、embedded expanded 広告の基本的な実装を示しています。

// Create the BreakClip.
let clipEmbeddedExpanded =
    new cast.framework.messages.BreakClip('bc_embedded_expanded');
clipEmbeddedExpanded.title = 'The Ad Title to be displayed during playback';
clipEmbeddedExpanded.duration = 15;

// Create the Break using the BreakClip id above.
let breakPrerollEmbeddedExpanded = new cast.framework.messages.Break(
    'break_preroll_embedded_expanded', ['bc_embedded_expanded'], 0);
breakPrerollEmbeddedExpanded.isEmbedded = true;
breakPrerollEmbeddedExpanded.expanded = true;

プレーヤーのタイムライン タイプ

プレーヤー インスタンスを作成すると、Web Receiver SDK は、コンテンツ再生中の広告再生をサポートするタイムライン タイプを選択します。各タイムラインでは、特定のミッドロール挿入点タイプを追加できます。タイムライン タイプは、LoadRequestDataMediaInformation で読み込み中に表示される広告タイプによって決まります。埋め込みミッドロール挿入点が存在する場合、embedded タイムラインが選択されます。クライアントが合成したミッドロール挿入点が存在する場合、stitched タイムラインが選択されます。広告が存在しない場合、SDK はデフォルトで embedded タイムラインを使用します。タイムラインを選択すると、現在のメディア アイテムの変更はできません。以下の表に、各タイムラインの詳細を示します。

タイムラインのタイプ 説明
埋め込みタイムライン メイン コンテンツに埋め込まれる広告(埋め込み広告埋め込み広告の挿入点)をサポートするメディア時間の表現。展開されない広告ブレークがある場合は、コンテンツの合計再生時間からその再生時間が差し引かれます。一方、エキスパンドミッドロール挿入点が存在する場合、その時間はメイン コンテンツの一部と見なされます。
合成タイムライン 外部メディア ファイルから供給される広告をサポートするメディア時間の表現(手動でのクライアント合成VAST および VMAP のミッドロール挿入点)。追加したミッドロール挿入点の時間は、メイン コンテンツの再生時間に含まれません。

以下の図 1 ~ 3 は、さまざまな広告タイプとそれぞれのタイムライン値を持つコンテンツを示しています。コンテンツは、2 つのブレーク クリップを含む「プレロール」ブレークと、1 つのブレーク クリップを含む「ミッドロール」および「ポストロール」ブレークで構成されます。コンテンツ再生開始からの実時間、メイン コンテンツのメディア時間、現在再生中のブレーク クリップの時刻は、それぞれの図の下揃えになされます。

クライアントが合成した広告のタイムライン
図 1: 一部のコンテンツと、そのコンテンツに対してクライアントによって合成された 3 つのミッドロール挿入点を示すタイムライン。


サーバー合成による埋め込み広告のタイムライン
図 2: 一部のコンテンツと、そのコンテンツにサーバー合成された 3 つの埋め込みミッドロール挿入点を示すタイムライン。


サーバー合成による埋め込みエキスパンド広告のタイムライン
図 3: 一部のコンテンツと、サーバー合成により埋め込まれた展開された 3 つのミッドロール挿入点を示すタイムライン。

挿入点の配置

Web Receiver SDK では、デベロッパーは Breakposition プロパティを設定することで、ミッドロール挿入点を配置する場所を指定できます。この値はメイン コンテンツのメディア時間に対応し、pre-rollmid-rollpost-roll のミッドロール挿入点の作成に使用できます。これらは次のように定義されます。

挿入位置 説明
プレロール メイン コンテンツの前に再生されるミッドロール挿入点。これは、breakPosition0 に設定することで示されます。
mid-roll コンテンツの途中で再生されるミッドロール挿入点。これは、breakPosition で、ブレークの開始時間をメイン コンテンツの開始より大きく、ブレークの終了時間をメイン コンテンツの終了時間よりも短く設定することによって示します。
ポストロール メイン コンテンツの後に再生されるミッドロール挿入点。これは、合成タイムラインbreakPosition-1 に設定することで示されます。埋め込みタイムラインの場合、breakPosition はメイン コンテンツの再生時間から休憩時間を差し引いた値に設定する必要があります。ライブ コンテンツではサポートされていません。

相互運用性マトリックス

ご参考までに、各広告タイプの概要と広告関連機能との互換性を表 1 に示します。

表 1: 広告の相互運用性マトリックス
機能サポート クライアントが合成した手動広告 VAST VMAP 埋め込み広告 埋め込みのエキスパンド広告
互換性 VAST 手動クライアント合成 なし 埋め込み 展開 埋め込み
タイムライン 縫製済み 縫製済み 縫製済み 埋め込み 埋め込み
広告の挿入 static static static static static、dynamic
広告の削除
プレロール広告
ミッドロール広告
ポストロール広告
広告スキップ
ブレークシーク インターセプタ
クリップ読み込みインターセプタのブレーク

イベント

キーブレーク イベントが発生すると、キャスト SDK は BreaksEvent タイプのイベントをディスパッチします。レシーバー アプリは、PlayerManager addEventListener API を使用してサブスクライブできます。

これらのイベントは、分析と広告再生トラッキングに使用できます。VMAP(Video Multiple Ad Playlist)広告と VAST(Video Ad Serving Template)広告が使用されている場合、レスポンスで提供される標準トラッキング イベントはすべて SDK によって自動的にディスパッチされます。

イベントの種類と発生するタイミングを、表 2 に詳しく記載しています。

ブレーク イベントのライフサイクル
図 4: ブレーク イベントのライフサイクル
表 2: ブレーク イベントとその説明
休憩イベント 説明
BREAK_STARTED メイン コンテンツの現在のメディア時刻が、視聴されていないブレークの position と等しい場合に発生します。
BREAK_CLIP_LOADING 合成タイムラインのブレーク クリップの読み込みが開始された場合にのみ呼び出されます。
BREAK_CLIP_STARTED ブレーク クリップの再生が開始されたときに発生します。
BREAK_CLIP_ENDED ブレーク クリップが終了すると呼び出されます。 endedReason は、次の場合に入力されます。
  • 合成されたタイムラインの区切りクリップが最後まで再生される。
  • 合成されたタイムラインブレーク クリップは、別のブレーク クリップにトランジションされます。
  • 休憩のクリップはスキップされます。
  • 最後のブレーク クリップは、ポストロール埋め込みのブレークですべて再生されました。
  • エラーが発生しました。
BREAK_ENDED ブレーク内の最後のブレーク クリップが終了すると呼び出されます。

広告の挿入

キャスト SDK を使用すると、キャスト セッションのさまざまなタイミングでアプリが広告を挿入したり、削除したりできます。広告挿入には、静的動的の 2 種類があります。静的広告挿入では、プレーヤーを作成する前に LoadRequestData で広告を指定する必要があります。動的広告挿入では、BreakManager addBreak API を使用して、読み込み済みのコンテンツに挿入できます。各タイプの挿入方法は、特定の広告の種類に対応しています。互換性の概要については、相互運用性マトリックスをご覧ください。

静的広告挿入

静的広告挿入では、プレーヤーの作成前に関連する広告メタデータが追加されることが特徴です。この情報は、LoadRequestDataMediaInformation で提供されます。たとえば、接続されている送信者の元の読み込みリクエストで設定するか、LOAD リクエストをインターセプトしてウェブ レシーバー アプリケーションによって挿入されます。LoadRequestData が処理のために Web Receiver SDK に返されると、プレーヤーが作成されます。詳しくは、メディアの読み込みをご覧ください。以下のサンプルでは、LOAD リクエスト インターセプタに追加されている手動クライアント合成広告を示しています。

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {

  // Create the BreakClip.
  let clipClient = new cast.framework.messages.BreakClip('bc_client');
  clipClient.title = 'The Ad Title to be displayed during playback';
  clipClient.contentId = 'https://example.com/ad.mp4';
  clipClient.contentType = 'video/mp4';

  // Create the Break using the BreakClip id above.
  let breakPostrollClient = new cast.framework.messages.Break(
      'break_postroll_client', ['bc_client'], -1);

  // Set the ad information in the load request data.
  let media = loadRequestData.media;
  media.breakClips = [clipClient];
  media.breaks = [breakPostrollClient];

  return loadRequestData;
});

ダイナミック広告挿入

ダイナミック広告挿入の特長は、コンテンツの再生中に広告ブレークを設定することです。これを行うには、BreakManager のインスタンスを取得し、addBreak API を呼び出します。これは少なくとも 2 つのパラメータ(埋め込み展開済み BreakBreakClip の配列)を取ります。オプションの 3 つ目のプロパティを使用して、true に設定されている場合に、接続されている送信者に変更を MediaStatus ブロードキャストを介して強制的に送信します。挿入点と挿入点クリップを追加する場合、対応する ID は一意である必要があります。これらの広告は、プレーヤーの作成後にのみ追加できます。プレーヤーが作成されると、Web Receiver SDK は PLAYER_LOADING イベントを呼び出します。以下のサンプルは、ストリームの ID3 メタデータの変更に応答し、Break オブジェクトと BreakClip オブジェクトを作成してタイムラインに挿入するイベント ハンドラの使用方法を示しています。

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
const breakManager = playerManager.getBreakManager();

playerManager.addEventListener(cast.framework.events.EventType.ID3, (event) => {

  // Create the BreakClip.
  let clipEmbeddedExpanded = parseBreakClipFromData(event.segmentData);
  let breakEmbeddedExpanded = parseExpandedBreakFromData(event.segmentData);

  // Add the break and break clip.
  breakManager.addBreak(breakEmbeddedExpanded, [clipEmbeddedExpanded]);
});

動的広告の削除

動的な中断を削除するには、アプリで再生中に removeBreakById を呼び出す必要があります。この関数は、タイムラインから削除するブレークの文字列 ID を受け取ります。指定する breakId は、埋め込み拡張ミッドロール挿入点を指す必要があります。他の種類のミッドロール挿入点が検出されると、その挿入点はタイムラインに残ります。以下の例では、休憩をなくしています。

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
const breakManager = playerManager.getBreakManager();

breakManager.removeBreakById('break_midroll_embedded_expanded');

休憩の動作

この SDK では、プレーヤーが休憩に入るときと休憩を取るときのデフォルト動作が定義されており、BreakManager で提供される API を使用してさらにカスタマイズする方法が用意されています。

デフォルトの中断動作

通常の再生または Break のシークによって Break が入力されると、SDK は isWatched プロパティをチェックして、ユーザーがすでに表示しているかどうかを評価します。作成時のこのプロパティのブレークのデフォルト値は false です。プロパティが true の場合、入力時にブレークは再生されず、メイン コンテンツの再生が継続されます。プロパティが false の場合、入力時にブレークが再生されます。

過去の中断をシークする場合、デフォルトの実装では、position がシーク オペレーションの seekFrom 値と seekTo 値の間にあるすべての Break アイテムが取得されます。SDK は、このブレークのリストから、positionseekTo 値に最も近い Break を再生し、isWatched プロパティが false に設定されます。すると、ブレークの isWatched プロパティが true に設定され、プレーヤーはブレーク クリップの再生を開始します。休憩が視聴されると、メイン コンテンツは seekTo の位置から再生を再開します。そのようなブレークが存在しない場合、ブレークは再生されず、メイン コンテンツの再生は seekTo の位置から再開されます。

ブレーク再生中に、SDK は MediaStatus で、接続されている送信側アプリに関連する更新をブロードキャストします。これらのアプリは、ブロードキャストを使用して breakStatus プロパティを読み取り、広告の UI を更新します。このプロパティは、ブレーク再生中にのみ定義されます。

また、レシーバー アプリは、PlayerManager getBreakClipCurrentTimeSec を呼び出すことで、表示される BreakClip の現在の時刻に関するプレイヘッドの位置に関する情報を直接クエリできます。同様に、アプリは getBreakClipDurationSec を呼び出すことで、現在の BreakClip の期間を照会できます。

カスタムブレーク動作

ブレーク クリップとブレーク クリップのデフォルトの動作は、BreakManager で提供される setBreakClipLoadInterceptor メソッドと setBreakSeekInterceptor メソッドを使用して変更できます。

シーク インターセプタの中断

ブレークシーク インターセプタを使用すると、アプリで広告ブレークをシークする動作を制御できます。この関数は、1 つ以上のブレークで前方または後方シークするシーク操作がリクエストされるとトリガーされます。呼び出されると、BreakSeekData がパラメータとしてコールバック関数に渡されます。BreakSeekData オブジェクトには Break オブジェクトの配列が含まれます。このオブジェクトの position プロパティは、seekFrom として定義されている現在のプレイヘッド時間とシーク目的地時間 seekTo の間の数値に設定されます。

このインターセプタを使用すると、それぞれのブレーク内の Break オブジェクトを変更できます。挿入時シーク インターセプタは、必要に応じて変更された BreakSeekData オブジェクトを返すことにより、再生する広告ブレークを指定する必要があります。プレーヤーは、戻り値に含まれるすべての休憩を再生します。値 null が返されるか、ブレーク シーク インターセプタから何も返されない場合、ブレークはスキップされます。

以下のサンプルのシンプルな実装例をご覧ください。インターセプタは、デフォルトの動作をオーバーライドして、すでに視聴されているブレークを除いて、シークされたすべての広告ブレークを監視します。

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
const breakManager = playerManager.getBreakManager();

breakManager.setBreakSeekInterceptor((breakSeekData) => {

  // Filter the breaks array by removing watched breaks.
  const unwatchedBreaks =
      breakSeekData.breaks.filter(adBreak => !adBreak.isWatched);
  breakSeekData.breaks = unwatchedBreaks;

  return breakSeekData;
});

クリップ読み込みインターセプタのブレーク

ブレーク クリップの読み込み インターセプタを使用すると、再生の開始前に BreakClip オブジェクトを変更できます。

ブレーク クリップの読み込みインターセプタは、合成されたタイムラインのブレークに対してのみ呼び出され、setBreakClipLoadInterceptor を使用して設定できます。Break に入る前に、このインターセプタは、そのブレークで定義された BreakClip ごとに 1 回呼び出されます。SDK は元の BreakClip オブジェクトをコールバック関数のパラメータとして渡します。アプリはこの BreakClip を変更して返すことができます。これにより、SDK は更新された構成でブレーク クリップを取得して表示できるようになります。null が返されないか何も返されない場合、ブレーク クリップはスキップされます。

以下に、ユーティリティ関数呼び出し getUrlFromClipId を使用してブレーク クリップの contentUrl を変更する例を示します。ここでは BreakClipid が URL にマッピングされています。

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
const breakManager = playerManager.getBreakManager();

breakManager.setBreakClipLoadInterceptor(
    (breakClip, breakClipLoadInterceptorContext) => {

  // Obtains the URL of a break clip id from a function call.
  breakClip.contentUrl = getUrlFromClipId(breakClip.id);

  return breakClip;
});

広告のスキップ

Web Receiver SDK には、ミッドロール挿入点と、ミッドロール挿入点内の個々の挿入点クリップをスキップする API が用意されています。この SDK では、送信側アプリまたはスマートディスプレイ デバイスを操作して、ブレーク クリップをスキップすることもできます。

ユーザーがスキップできるブレーク クリップ

ブレーク クリップをスキップ可能に設定すると、ユーザーは接続済みのセンダーアプリやスマートディスプレイ デバイスと通信し、現在再生中のブレーク クリップの残りの部分をスキップできるようになります。whenSkippable プロパティに負でない秒数を設定すると、BreakClip オブジェクトに対してこの機能が有効になります。ブレーク クリップが指定の秒数の間再生されると、プレーヤーはブレーク クリップをスキップ可能と見なします。この値を 0 に設定すると、ユーザーはすぐにブレーク クリップをスキップできます。

// Create the BreakClip.
let clip = new cast.framework.messages.BreakClip('bc');
clip.title = 'The Ad Title to be displayed during playback';
clip.whenSkippable = 10; // Users can skip the clip after 10 seconds of playback.

この情報は、送信側の元の読み込みリクエストまたは受信側のアプリで設定できます。スキップされた場合、合成されたタイムラインの広告ブレーク内のブレーク クリップは、現在のブレーク クリップの再生を停止します。プレーヤーは次のブレーク クリップ(存在する場合)を読み込むか、メイン コンテンツを読み込みます。埋め込みタイムラインの広告ブレークのブレーク クリップがスキップされた場合、ブレーク クリップの最後にシークされ、その時点でストリームの再生が続行されます。

プログラムによる広告のスキップ

広告は、ユーザーが操作しなくても自動的にスキップされます。

再生の休憩全体をスキップするには、アプリで BreakisWatched プロパティを true に設定する必要があります。これは、読み込みシーケンスまたはコンテンツの再生中にいつでも実行できます。isWatched プロパティは、メイン コンテンツの現在の時刻で休憩の position が満たされると、プレーヤーによって評価されます。その時点で、プレーヤーは休憩を入れるかどうかを判断します。以下のサンプルは、すべてのブレークをループして、プレーヤーの読み込み時に値を変更するものです。

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
const breakManager = playerManager.getBreakManager();

playerManager.addEventListener(cast.framework.events.EventType.PLAYER_LOADING,
    (event) => {

  // Obtain the breaks and iterate through each item to skip all ad breaks.
  let breaks = breakManager.getBreaks();
  breaks.forEach((brk) => {
    brk.isWatched = true;
  });
});

プログラムで特定のブレーク クリップをスキップするには、ブレーク クリップの読み込み インターセプタを使用する必要があります。null を返すか、コールバック関数で値を返さないことで、そのブレーク内のクリップはスキップされます。

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
const breakManager = playerManager.getBreakManager();

breakManager.setBreakClipLoadInterceptor(
      (breakClip, breakClipLoadInterceptorContext) => {
  return null;
});