廣告插播時間點

總覽

Web Receiver SDK 原生支援特定媒體串流中的廣告插播和隨播廣告。這個 API 提供 API 來設定廣告排序、廣告來源和廣告插播行為,以及相關廣告插播片段。在本指南中,Break 是指包含一或多則廣告/串場廣告的播放間隔時間,而每則廣告或串場廣告都稱為 BreakClip。這些插播時間點會與正在載入或播放的媒體相關。

廣告類型

Web Receiver SDK 支援用戶端廣告插播 (CSAI) 和伺服器拼接廣告插播 (SSAI)。用戶端拼接廣告可由應用程式手動設定,或從 VASTVMAP 範本檔案中擷取。伺服器拼接廣告必須在內容載入之前以內嵌廣告的形式指定,或在內容播放期間動態指定,形式為內嵌的展開廣告。以下將詳細說明這兩種廣告類型的導入方式。

手動與客戶拼接

手動用戶端拼接的廣告插播是一種由用戶端拼接的廣告插播類型,且會使用 SDK API 由應用程式手動指定。這個廣告類型不會嵌入主要內容的串流中。BreakClip 必須提供 contentId,這是指向廣告素材的網址、說明廣告素材格式的 contentType,以及 title

Break 必須設有 isEmbeddedexpanded 設定為預設值 falseposition 可設為片頭廣告片中廣告片尾廣告 (詳情請參閱廣告插播位置一節)。準備要播放的廣告時,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 (影片廣告放送範本) 廣告。如果提供這項資訊,系統會剖析 XML 範本,以便在進入斷行時產生後續的 client-stitched 廣告插播片段。

如要建立 VAST 廣告,接收器應用程式必須建立 VastAdsRequest,並在 BreakClip vastAdsRequest 屬性中指定。VastAdsRequest 物件必須具備 adsResponse (XML 範本本身的字串表示法) 或 adTagUrl (代管 XML 範本的網址) 屬性。如果指定網址,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 BreakClipBreak 時,Web Receiver SDK 會選擇性擷取並剖析範本。剖析時,SDK 會產生新的 BreakClip,並填入從範本中擷取到的值,例如 contentIdcontentTypetitledurationwhenSkippableclickThroughUrl。產生的廣告插播片段的 id 設為 GENERATED:N,其中 N 是整數,該整數會從 0 開始建立的每個新 VAST 廣告插播短片,由 1 遞增。接著,系統會將產生的廣告加到 BreakClip 陣列中。目前 Break 中每個 VAST 廣告插播片段的 id 都會替換為相應的產生廣告插播片段 id。以下程式碼片段說明進入這類休息前後的 MEDIA_STATUS 訊息中與廣告相關的變化。

BreakBreakClip 資訊,以顯示 VAST 廣告。

"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 (影片多重廣告播放清單) 標準。提供 VMAP 時,Web Receiver SDK 會剖析 VMAP 回應,並為回應中的任何 <AdBreak> 項目產生 client-stitched Break 物件。也會針對 VMAP 中提供的每個 <AdSource> 項目,產生具有 vastAdsRequest 物件的適當的 BreakClips。如要讓 VMAP 插入內容,應用程式必須建立 VastAdsRequest 物件,並指派給 LoadRequestDataMediaInformation 屬性。vmapAdsRequest這類廣告必須以靜態方式插入 (詳情請參閱「廣告插播」一節)。以下程式碼片段概述了建立 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 必須提供廣告內容的 duration,以及 titleBreak 必須將 isEmbedded 設為 true,並將 expanded 設為 false。可將 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 必須提供廣告內容的 duration,以及 titleBreak 必須將 isEmbedded 設為 true,並將 expanded 設為 true。可將 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 時間軸。選取時間軸後,就無法為目前的媒體項目變更。下表提供各時間軸的詳細說明。

時間軸類型 說明
內嵌時間軸 這代表媒體時間支援內嵌在主要內容中的廣告 (內嵌內嵌展開廣告插播廣告插播)。當顯示未展開的廣告插播時間點,系統會從內容的總時間長度中扣除該廣告插播的時間長度。另一方面,當展開的廣告插播存在時,系統會將時間視為主要內容的一部分。
拼接時間軸 代表媒體時間的表示法,支援來自外部媒體檔案 (手動用戶端拼接VASTVMAP 廣告插播) 的廣告。新增後,廣告插播的時間長度不屬於主要內容的時間長度。

下方圖 1 到 3 說明瞭幾種不同廣告類型及其各自的時間軸值。內容設定為片頭插播廣告,其中包含兩個分段片段,以及包含單一廣告插播片段的片中片尾插播。從內容開始播放以來的開始時鐘時間、主要內容的媒體時間,以及目前播放插播時間點片段的時間會顯示在每張數字下方。

客戶提案廣告的時間軸
圖 1:時間軸代表部分內容,以及 3 個用戶端拼接的廣告插播。


伺服器拼接內嵌廣告的時間軸
圖 2:時間軸代表部分內容和 3 個伺服器拼接的內嵌廣告插播。


伺服器拼接內嵌展開廣告的時間軸
圖 3:時間軸代表部分內容和 3 個伺服器拼接的內嵌展開廣告插播。

分裂位置

Web Receiver SDK 可讓開發人員設定 Breakposition 屬性,藉此指定廣告插播的位置。這個值對應主要內容的媒體時間,可用來建立 pre-rollmid-rollpost-roll 廣告插播。定義如下:

分位位置 說明
片頭廣告 在主要內容開始前播放的廣告插播。附註的方法是將 breakPosition 設為 0
片中廣告 在內容播放期間播放的廣告插播時間點。這是將 breakPosition 設定為廣告插播開始大於主要內容開始時間的時間,且廣告插播的結束時間早於主要內容的結束時間。
片尾廣告 在主要內容結束後播放的廣告插播。這種情況的宣告方式是將拼接的時間軸breakPosition 設為 -1。如果是內嵌時間軸breakPosition 應設為主要內容的時間長度減掉廣告插播的時間長度。不支援直播內容。

互通性矩陣

您可快速參考表 1,概略瞭解廣告類型及其與廣告相關功能的相容性。

表 1:廣告互通性矩陣
功能支援 手動由客戶拼湊的廣告 VAST VMAP 內嵌廣告 嵌入式展開廣告
相容於 VAST 手動與客戶拼接 不適用 嵌入式展開廣告 嵌入式
時間軸 縫線 縫線 縫線 嵌入式 嵌入式
插入廣告 靜態 靜態 靜態 靜態 靜態、動態
移除廣告
片頭廣告
片中廣告
影片後插播廣告
廣告略過
休息搜尋攔截器
中斷剪輯載入攔截器

活動

發生按鍵中斷事件時,cast SDK 會分派 BreaksEvent 類型的事件。接收器應用程式可以使用 PlayerManager addEventListener API 訂閱。

這些事件可用於數據分析和廣告播放追蹤。使用 VMAP (影片多重廣告播放清單) 和 VAST (影片廣告放送範本) 廣告時,SDK 會自動分派回應中提供的任何標準追蹤事件。

表 2 列出事件類型,以及觸發時的詳細說明。

中斷事件生命週期
圖 4:中斷事件生命週期。
表 2:休息事件及其說明。
廣告插播事件 說明
BREAK_STARTED 當主要內容的當前媒體時間等於未觀看廣告插播的 position 時,就會觸發。
BREAK_CLIP_LOADING 只會在拼接時間軸片段開始載入時觸發。
BREAK_CLIP_STARTED 在廣告插播片段開始播放時觸發。
BREAK_CLIP_ENDED 在廣告插播片段結束時觸發。系統會在下列情況中填入 endedReason
  • 拼接的時間軸中斷片段已完全播放。
  • 拼接的時間軸片段片段會轉成其他休息片段。
  • 系統會略過所有廣告插播短片。
  • 最後一個插播片段完全在片尾插播廣告播放。
  • 發生錯誤。
BREAK_ENDED 廣告插播中的最後一個廣告插播片段結束時觸發。

插入廣告

投放 SDK 可讓應用程式在投放工作階段的不同時間點插入及移除廣告。廣告插播類型有兩種:靜態動態。 使用靜態廣告插入功能時,必須先在 LoadRequestData 中指定廣告,才能建立玩家。動態廣告插播功能會使用 BreakManager addBreak API,在已載入的內容中插入廣告插播。每種插入方式都與特定廣告類型相容。互通性矩陣中提供了相容性總覽。

靜態廣告插播

靜態廣告插播的特性是在玩家建立前新增相關的廣告中繼資料。這項資訊可在 LoadRequestDataMediaInformation 中提供。舉例來說,可在已連線傳送者的原始載入要求中設定這個屬性,也能讓 Web Receiver 應用程式攔截 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。至少要使用兩個參數、內嵌的展開 BreakBreakClip 的陣列。我們加入了一個選用的第三個屬性,可在設為 true 時,透過 MediaStatus 廣播強制將變更傳送給已連線的寄件者。新增廣告插播和中斷片段時,對應的 ID 不得重複。只有在播放器建立後才能新增這些廣告。Web Receiver SDK 會在建立玩家後觸發 PLAYER_LOADING 事件。請參閱以下範例,瞭解事件處理常式中的使用情況,該處理常式會回應串流 ID3 中繼資料的變更,並建立 BreakBreakClip 物件將其插入時間軸。

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 介於搜尋作業的 seekFromseekTo 值之間的所有 Break 項目。在這個中斷清單中,SDK 會播放 Break,其 position 最接近 seekTo 值,且 isWatched 屬性設為 false。該廣告插播的 isWatched 屬性隨後會設為 true,玩家將開始播放其分段片段。觀看中斷後,主要內容會從 seekTo 位置繼續播放。如果沒有這類中斷點,系統就不會播放任何中斷點,主要內容也會在 seekTo 位置繼續播放。

在暫停播放期間,SDK 會在 MediaStatus 中向已連結的傳送者應用程式播送任何相關更新。這些應用程式會透過讀取 breakStatus 屬性,使用廣播訊息更新廣告的使用者介面。此屬性只能在廣告插播播放期間定義。

接收端應用程式也可以呼叫 PlayerManager getBreakClipCurrentTimeSec,根據 BreakClip 的目前時間,直接查詢與播放頭位置相關的資訊。同樣地,應用程式可以呼叫 getBreakClipDurationSec,查詢目前 BreakClip 的持續時間。

自訂廣告插播行為

您可以使用 BreakManager 提供的 setBreakClipLoadInterceptorsetBreakSeekInterceptor 方法,修改廣告插播和中斷片段的預設行為

休息搜尋攔截器

插播時間點攔截器可讓應用程式控制跳轉廣告插播時間點的行為。如果要求在一或多個中斷處向前或向後跳轉,就會觸發該函式。呼叫時,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 呼叫一次攔截器。SDK 會將原始 BreakClip 物件做為回呼函式的參數傳遞。應用程式隨後可以修改這個 BreakClip 並傳回,讓 SDK 利用更新的設定擷取及顯示廣告插播剪輯。如果未傳回 null 或未傳回任何項目,系統就會略過中斷剪輯。

請參閱下方範例,瞭解如何使用公用程式函式呼叫 getUrlFromClipId 修改廣告插播片段的 contentUrl,其中 BreakClipid 會對應至網址。

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。這項作業可以在載入序列或內容播放期間隨時完成。當主要內容的目前時間符合廣告插播的 position 時,玩家會評估 isWatched 屬性。屆時,播放器會判斷是否應輸入休息時間。請參考下方範例,這個範例會循環播放所有中斷點,並在玩家載入時修改該值。

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;
});