广告插播时间点

概览

Web Receiver SDK 可为给定媒体流中的广告插播时间点和随播广告提供原生支持。它提供了一些 API,可用于设置广告排名、广告来源以及广告插播时间点及其关联的插播片段的行为。在本指南中,Break 是指包含一个或多个广告或导视广告的播放时间间隔,每个广告或导视广告都称为 BreakClip。这些插播时间点与正在加载或播放的媒体相关联。

广告类型

Web Receiver SDK 支持客户端广告插播 (CSAI) 和服务器拼接广告插播 (SSAI)。客户端拼接的广告可由应用手动设置,也可从 VASTVMAP 模板文件中提取。服务器拼接广告应在内容加载之前手动指定为嵌入式广告,或在内容播放期间动态指定为嵌入式扩展广告。下面将详细介绍每种广告类型的实现方法。

手动客户拼接

手动客户端拼接的广告插播时间点是一种由客户端拼接在一起的广告插播时间点,由应用使用 SDK API 手动指定。此广告类型不会嵌入主内容的视频流。BreakClip 必须提供 contentId(指向广告内容的网址)、描述广告内容格式的 contentType 以及 title

Break 必须将 isEmbeddedexpanded 设置为默认值 falseposition 可设置为前贴片广告中贴片广告后贴片广告广告插播时间点(如需了解详情,请参阅广告插播时间点定位部分)。在准备要播放的广告时,Web 接收器 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 接收器 SDK 支持添加 IAB 标准 VAST(视频广告投放模板)广告。如果提供了该片段,系统会解析 XML 模板,以便在进入广告插播时间点时生成后续的客户端拼接的广告插播时间点。

如需创建 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 接收器 SDK 可以选择性地提取模板,然后解析模板。解析时,SDK 将生成新的 BreakClip,并使用从模板中提取的值(例如 contentIdcontentTypetitledurationwhenSkippableclickThroughUrl)进行填充。生成的广告插播时间点的 id 会设置为 GENERATED: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

网络接收器 SDK 支持 IAB VMAP(视频多广告播放列表)标准。如果提供了 VMAP,Web Receiver SDK 将解析 VMAP 响应,并为响应中的任何 <AdBreak> 条目生成客户端拼接的 Break 对象。此外,它还会使用 vastAdsRequest 对象为 VMAP 中提供的每个 <AdSource> 条目生成适当的 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 必须提供广告内容的 duration 以及 titleBreak 必须将 isEmbedded 设置为 true,并将 expanded 设置为 falseposition 可设为前贴片广告中贴片广告广告插播时间点。后贴片广告广告插播时间点支持确切的正 position 值。如需了解详情,请参阅中断定位部分。触发广告播放时,Web 接收器 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 设置为 trueposition 可设为前贴片广告中贴片广告广告插播时间点。支持使用正 position 值作为后贴片广告广告插播时间点。如需了解详情,请参阅中断定位部分。触发广告播放时,Web 接收器 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 接收器 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 在广告插播时间点的最后一个插播片段结束时触发。

插入广告

借助 Cast SDK,应用可在投放会话的不同时刻插入和移除广告。广告插播有两种类型:静态动态静态广告插播要求在创建播放器之前在 LoadRequestData 中指定广告。动态广告插播利用 BreakManager addBreak API 在已加载的内容中插入广告插播时间点。每种类型的插入方法都与特定广告类型兼容。互操作性矩阵中提供了兼容性概览。

静态广告插播

静态广告插播的特征是:在创建播放器之前添加相关的广告元数据。此信息在 LoadRequestDataMediaInformation 中提供。例如,这可以在已连接的发送者的原始加载请求中设置,也可以由 Web 接收器应用通过拦截 LOAD 请求插入。将 LoadRequestData 返回给 Web 接收器 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 接收器 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。该函数接受要从时间轴中移除的广告插播时间点的字符串标识符。指定的 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 将播放 position 最接近 seekTo 值且 isWatched 属性设置为 falseBreak。然后,该广告插播时间点的 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(其中 BreakClipid 会映射到网址)修改广告插播时间点剪辑的 contentUrl

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

如需程序化地跳过特定的广告插播片段,应使用 break clip 加载拦截器通过在回调函数中返回 null 或未返回值,系统会跳过广告插播时间点中的片段。

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

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