Рекламные паузы

Обзор

Web Receiver SDK имеет встроенную поддержку рекламных пауз и сопутствующих объявлений в заданном медиапотоке. Он предоставляет два способа включения рекламных пауз в приемник: сшивка на стороне клиента и на стороне сервера с использованием пауз и клипов пауз.

Перед началом разработки в рекламных паузах ознакомьтесь с настройкой пользовательского веб-приемника . Cast SDK Ad Breaks API гарантирует, что пользователи будут иметь одинаковый опыт на всех устройствах с поддержкой Cast, когда реклама является частью воспроизведения.

В этом руководстве под паузой понимается интервал воспроизведения, содержащий одно или несколько объявлений или заставок, а каждое объявление или заставка называется клипом паузы.

На этой диаграмме показаны две рекламные паузы, каждая из которых содержит по два объявления:

События

В следующей таблице описаны события, которые запускаются при возникновении перерывов во время воспроизведения.

Перерыв Описание
BREAK_STARTED Запускается, когда начинается загрузка первого клипа паузы в паузе. Событие это cast.framework.events.BreaksEvent .
BREAK_ENDED Запускается, когда заканчивается последний клип прерывания в перерыве. Событие это cast.framework.events.BreaksEvent .
Примечание. Это событие срабатывает, даже если пользователь пропускает последний клип в перерыве, чтобы закончить перерыв.
BREAK_CLIP_LOADING Вызывается, когда начинается загрузка брейк-клипа. Событие это cast.framework.events.BreaksEvent .
BREAK_CLIP_STARTED Запускается, когда начинается прерывающий клип. Событие это cast.framework.events.BreaksEvent .
BREAK_CLIP_ENDED Вызывается, когда прерывающийся клип заканчивается. Событие это cast.framework.events.BreaksEvent .
Примечание. Это событие срабатывает, даже если пользователь пропускает клип паузы. Пожалуйста, проверьте свойство endedReason BreaksEvent . Чтобы определить время просмотра клипа перерыва, проверьте getBreakClipCurrentTimeSec и getBreakClipDurationSec в PlayerManager .

Эти события можно использовать для аналитики и отслеживания воспроизведения рекламы. Когда используются VMAP (список воспроизведения нескольких видеообъявлений) и VAST (шаблон показа видеообъявлений), любые стандартные события отслеживания, представленные в ответах, автоматически отправляются SDK.

Во время воспроизведения паузы пакет SDK веб-приемника передает MediaStatus с breakStatus всем подключенным отправителям. Отправители могут использовать эту информацию для обновления пользовательского интерфейса и подавления любых операций поиска.

Web Receiver SDK предоставляет два способа включения рекламных пауз в приемник: сшивка на стороне клиента и на стороне сервера.

Сшивание рекламы на стороне клиента

Для вставки рекламы на стороне клиента , также называемой невстроенной, необходимая рекламная информация должна быть указана с помощью объектов Break и BreakClip во время загрузки мультимедиа. Следующий фрагмент представляет собой пример функции, добавляющей паузы перед роликом, в середине ролика и после ролика, где ссылки на third_party и его методы являются примерами вспомогательных функций, которые разработчик может иметь в своем приложении. Фрагмент также показывает, как события отслеживания могут быть запущены, когда пользователь просматривает клип паузы до завершения, прослушивая событие BREAK_CLIP_ENDED и проверяя значение endedReason .

/**
 * @param {!cast.framework.messages.MediaInformation} mediaInformation
 */
function addBreakToMedia(mediaInformation) {
  mediaInformation.breakClips = [
  {
    id: 'bc1',
    title: third_party.getBreakClipTitle('bc1'),
    contentId: third_party.getBreakClipUrl('bc1'),
    contentType: third_party.getBreakClipContentType('bc1'),
    posterUrl: third_party.getBreakClipPosterUrl('bc1')
  },
  {
    id: 'bc2'
    ...
  },
  {
    id: 'bc3'
    ...
  },
  {
    id: 'bc4'
    ...
  }];
  mediaInformation.breaks = [
  {
    id: 'b1',
    breakClipIds: ['bc1', 'bc2'],
    position: 0  //pre-roll position
  },
  {
    id: 'b2',
    breakClipIds: ['bc3'],
    position: 10*60 //ten minutes
  },{
    id: 'b3',
    breakClipIds: ['bc4'],
    position: -1  //post-roll position (-1 is only valid client stitching; for server-side ad stitching, exact position is required)
  }];
}

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

playerManager.addEventListener(cast.framework.events.EventType.BREAK_CLIP_ENDED, function(event){
  if(event.endedReason === cast.framework.events.EndedReason.END_OF_STREAM){
    //call your ad tracking code here for break clip watched to completion
  }
});


playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD,
    loadRequestData => {
      addBreakToMedia(loadRequestData.media);
      return loadRequestData;
    });
context.start();

ВАСТ-объявления

Web Receiver SDK поддерживает стандартные объявления VAST IAB. Чтобы включить VAST-объявления в свои медиафайлы, создайте объект vastAdsRequest и назначьте его vastAdsRequest объекта BreakClip . Объект vastAdsRequest должен иметь определенное свойство adsResponse или свойство adTagUrl .

/**
 * @param {!cast.framework.messages.MediaInformation} mediaInformation
 */
function addBreakToMedia(mediaInformation) {
  mediaInformation.breakClips = [
  {
    id: 'bc1',
    vastAdsRequest:{
      adTagUrl: 'https://castsample.com/vast?rand=' + Math.floor(Math.random()* 10000)
    }
  }];
}

Пакет SDK веб-приемника отправляет запрос на указанный adTagUrl и анализирует ответ XML для создания объекта BreakClip . Ниже приведен пример объекта BreakClip , сгенерированного нашим SDK.

{
  "id": "GENERATED:0",
  "contentId": "https://file.mp4",
  "contentType": "video/mp4",
  "title": "Preroll",
  "duration": 10,
  "clickThroughUrl": "https://click"
}

VMAP-объявления

Пакет SDK для веб-приемника также поддерживает стандарт IAB VMAP. Когда предоставляется VMAP, Cast SDK анализирует ответ VMAP и создает объекты Break для заданных записей <AdBreak> в ответе. Он также будет генерировать соответствующие BreakClips с объектом vastAdsRequest для каждой записи <AdSource>, представленной в VMAP. Чтобы использовать VMAP для вставки рекламы в ваш контент, создайте объект vastAdsRequest и назначьте его vmapAdsRequest объекта MediaInformation как часть вашего запроса на загрузку.

/**
 * @param {!cast.framework.messages.MediaInformation} mediaInformation
 */
function addBreakToMedia(mediaInformation) {
  mediaInformation.vmapAdsRequest = {
    adTagUrl: 'https://castsample.com/vmap?rand=' + Math.floor(Math.random()* 10000)
  };
}

Сшивание рекламы на стороне сервера

Для сшивки на стороне сервера , также называемой встроенной рекламой, ожидается, что сервер предоставит единый поток, содержащий как основной медиафайл, так и рекламу. В этом случае ожидается, что разработчик предоставит duration и тип BreakClip contentType contentUrl опущен. Кроме того, для isEmbedded должно быть установлено значение true.

/**
 * @param {!cast.framework.messages.MediaInformation} mediaInformation
 */
function addBreakToMedia(mediaInformation) {
  mediaInformation.breakClips = [
  {
    id: 'bc1',
    title: third_party.getBreakClipTitle('bc1'),
    posterUrl: third_party.getBreakClipPosterUrl('bc1'),
    duration: third_party.getBreakClipDuration('bc1')
  },
  {
    id: 'bc2'
    ...
  },
  {
    id: 'bc3'
    ...
  },
  {
    id: 'bc4'
    ...
  }];
  mediaInformation.breaks = [
  {
    id: 'b1',
    breakClipIds: ['bc1', 'bc2'],
    position: 0,
    isEmbedded: true
  },
  {
    id: 'b2',
    breakClipIds: ['bc3', 'bc4'],
    position: 10*60,
    isEmbedded: true
  }];
}

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD,
    loadRequestData => {
      addBreakToMedia(loadRequestData.media);
      return loadRequestData;
    });
context.start();

Поведение перерывов

Поведение разрыва по умолчанию

  1. После начала перерыва он будет помечен как isWatched . Если затем пользователь переходит к точке, предшествующей паузе, воспроизведение контента начинается как обычно, а пауза впоследствии будет пропущена, как просматриваемая ранее.
  2. Если пользователь пролистывает паузу(ы), не просматривая паузу, то последняя невоспроизведенная пауза между seekFrom и seekTo будет воспроизводиться до начала воспроизведения контента.

Пользовательское поведение перерыва

default behavior для разрывов и клипов разрывов можно изменить с помощью методов setBreakClipLoadInterceptor и setBreakSeekInterceptor объекта BreakManager .

setBreakClipLoadInterceptor

setBreakClipLoadInterceptor вызывается до того, как произойдет разрыв. Эта функция вызывается один раз для клипа разрыва. Он передает объект BreakClip в функцию обратного вызова.

Например, если есть пауза перед роликом, setBreakClipLoadInterceptor вызывается для паузы перед роликом, как только начинается воспроизведение. Сразу же после окончания воспроизведения pre-roll setBreakClipLoadInterceptor для следующего перерыва.

Если в функции обратного вызова для setBreakClipLoadInterceptor возвращается null или ничего, прерываемый клип пропускается. Немедленно вызываются все перехватчики на перерыв.

С помощью setBreakClipLoadInterceptor объект BreakClip можно изменить до начала его воспроизведения.

setBreakSeekInterceptor

setBreakSeekInterceptor запускается после операции поиска и передает объект BreakSeekData функции обратного вызова. Объект BreakSeekData содержит массив разрывов, позиции которых определены между текущим временем воспроизведения и временем назначения поиска (например seekFrom и seekTo ). После операции прямого поиска по умолчанию воспроизводится последний невоспроизведенный брейк до времени seekTo . После завершения воспроизведения паузы воспроизведение контента возобновляется с позиции seekTo .

Этот перехватчик позволяет изменять объекты BreakClip в соответствующих разрывах.

Если вы хотите настроить поведение, вы можете реализовать setBreakSeekInterceptor , чтобы переопределить default behavior . Если setBreakSeekInterceptor реализован, вы должны явно указать, какие перерывы проигрывать.

  • Если значение null или ничего не возвращается из setBreakSeekInterceptor , перерыв пропускается.
  • Если возвращается тот же объект, который передается в функцию обратного вызова, то default behavior переопределяется и воспроизводятся все перерывы. Кроме того, если пользователь переходит к более ранней точке, он увидит перерывы, даже если он ранее просматривал эти перерывы. Если setBreakSeekInterceptor не реализован, то уже просмотренные перерывы пропускаются.

Возможность пропуска клипов перерыва

Чтобы разрешить пропуск клипа паузы, укажите, сколько секунд ждать, прежде чем клип паузы можно будет пропустить, в объекте BreakClip .

/**
 * @param {!cast.framework.messages.MediaInformation} mediaInformation
 */
function addBreakToMedia(media) {
  media.breakClips = [
  {
    id: 'bc1',
    ...
    whenSkippable: 10 //to allow user to skip break clip from sender after 10 seconds
  }];
}

Автопропуск рекламы

Объявления могут быть пропущены автоматически без какого-либо взаимодействия с пользователем. Два способа пропустить рекламу:

  1. Установка для свойства isWatched Break значения true автоматически пропустит перерыв.
    playerManager.addEventListener(cast.framework.events.category.CORE, function(event){
      if(event.type === cast.framework.events.EventType.PLAYER_LOADING){
        let breaks = playerManager.getBreaks();
        for(let i in breaks){
          breaks[i].isWatched = true;
        }
      }
    });
  2. BreakClip можно пропустить, вернув нулевое значение в setBreakClipLoadInterceptor .
     playerManager.getBreakManager().setBreakClipLoadInterceptor(breakClip => {
      return null;
    });