Konfigurowanie z wyświetlaniem bloków reklamowych w ramach dynamicznego wstawiania reklam

Wybierz platformę: HTML5 Android iOS tvOS Cast Roku

Ten przewodnik pokazuje, jak odtwarzać strumień wyświetlania bloków reklamowych w ramach dynamicznego wstawiania reklam w przypadku treści na żywo lub VOD przy użyciu pakietu IMA DAI SDK dla HTML5 z odtwarzaczem, który korzysta z hls.js. Aby wyświetlić lub prześledzić ukończoną przykładową integrację z obsługą zarówno HLS.js, jak i odtwarzania w Safari, zapoznaj się z przykładem wyświetlania bloków reklamowych HLS. Informacje o obsłudze DASH.js znajdziesz w przykładzie wyświetlania bloku reklamowego w DASH. Te przykładowe aplikacje możesz pobrać ze strony HTML5 DAI GitHub release.

Omówienie wyświetlania bloków reklamowych w ramach dynamicznego wstawiania reklam

Wdrażanie wyświetlania bloków reklamowych za pomocą pakietu IMA DAI SDK obejmuje 2 główne komponenty, które opisujemy w tym przewodniku:

  • PodStreamRequest / PodVodStreamRequest: obiekt, który definiuje żądanie strumienia do serwerów reklamowych Google. Żądania określają kod sieci, a PodStreamRequest wymaga też niestandardowego klucza zasobu i opcjonalnego klucza interfejsu API. Oba zawierają inne opcjonalne parametry.

  • StreamManager: obiekt, który obsługuje komunikację między strumieniem wideo a pakietem IMA DAI SDK, np. uruchamia pingi śledzące i przekazuje wydawcy zdarzenia strumienia.

Wymagania wstępne

Zanim zaczniesz, musisz mieć:

  • 3 puste pliki:

    • dai.html
    • dai.css
    • dai.js
  • Python zainstalowany na komputerze, serwer WWW lub inne hostowane środowisko programistyczne do testowania.

Konfigurowanie środowiska programistycznego

Pakiet SDK wczytuje zależności przy użyciu tego samego protokołu co strona, z której jest wczytywany, dlatego do przetestowania aplikacji musisz użyć serwera WWW. Szybkim sposobem na uruchomienie lokalnego serwera programistycznego jest użycie wbudowanego serwera Pythona.

  1. W wierszu poleceń w katalogu zawierającym plik index.html uruchom:

    python -m http.server 8000
  2. W przeglądarce otwórz stronę http://localhost:8000/.

    Możesz też użyć dowolnego innego hostowanego środowiska programistycznego lub serwera WWW, takiego jak Apache HTTP Server.

Tworzenie odtwarzacza wideo

Najpierw zmodyfikuj plik dai.html, aby utworzyć element wideo HTML5 i element div, który będzie używany na potrzeby elementów interfejsu reklamy. Dodaj też tagi niezbędne do wczytania plików dai.css i dai.js oraz do zaimportowania odtwarzacza hls.js.

Następnie zmodyfikuj plik dai.css, aby określić rozmiar i pozycję elementów strony. Na koniec w pliku dai.js zdefiniuj zmienne, które będą przechowywać informacje o żądaniu strumienia, oraz funkcję initPlayer(), która będzie uruchamiana po wczytaniu strony.

Stałe żądania strumienia są następujące:

  • BACKUP_STREAM: adres URL strumienia zapasowego, który ma być odtwarzany w przypadku wystąpienia błędu krytycznego podczas przetwarzania reklam.

  • STREAM_URL: używane tylko w przypadku transmisji na żywo. Adres URL strumienia wideo podany przez manipulator plików manifestu lub partnera zewnętrznego korzystającego z wyświetlania bloków reklamowych. Przed wysłaniem żądania należy wstawić identyfikator strumienia podany przez pakiet IMA DAI SDK. W takim przypadku adres URL transmisji zawiera obiekt zastępczy [[STREAMID]], który przed wysłaniem żądania jest zastępowany identyfikatorem transmisji.

  • NETWORK_CODE: kod sieci konta Ad Managera 360.

  • CUSTOM_ASSET_KEY: używane tylko w przypadku transmisji na żywo. Niestandardowy klucz zasobu, który identyfikuje zdarzenie wyświetlania bloków reklamowych w usłudze Ad Manager 360. Może on zostać utworzony przez manipulator pliku manifestu lub zewnętrznego partnera obsługującego wyświetlanie bloków reklamowych.

  • API_KEY: używane tylko w przypadku transmisji na żywo. Opcjonalny klucz interfejsu API, który może być wymagany do pobrania identyfikatora strumienia z pakietu IMA DAI SDK.

dai.html

<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
  <script src="dai.js"></script>
  <link rel="stylesheet" href="dai.css" type="text/css">
</head>
<body onLoad="initPlayer()">
  <h2>IMA DAI SDK Demo (HLS.JS)</h2>
    <video id="video"></video>
    <div id="adUi"></div>
</body>
</html>

dai.css

#video,
#adUi {
  width: 640px;
  height: 360px;
  position: absolute;
  top: 35px;
  left: 0;
}

#adUi {
  cursor: pointer;
}

dai.js

var BACKUP_STREAM =
    'https://storage.googleapis.com/interactive-media-ads/media/bbb.m3u8'

// Stream Config.
const STREAM_URL = "";
const NETWORK_CODE = "";
const CUSTOM_ASSET_KEY = "";
const API_KEY = "";

var hls = new Hls(); // hls.js video player
var videoElement;
var adUiElement;

function initPlayer() {
  videoElement = document.getElementById('video');
  adUiElement = document.getElementById('adUi');
}

Wczytywanie pakietu IMA DAI SDK

Następnie dodaj platformę DAI za pomocą tagu skryptu w pliku dai.html przed tagiem pliku dai.js.

dai.html

<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
  <script type="text/javascript" src="//imasdk.googleapis.com/js/sdkloader/ima3_dai.js"></script>
  <script src="dai.js"></script>
  <link rel="stylesheet" href="dai.css" type="text/css">
</head>
...

Inicjowanie obiektu StreamManager i wysyłanie żądania strumienia na żywo lub VOD

Wyświetlanie bloków reklamowych podczas transmisji na żywo

Aby wysłać żądanie zestawu reklam, utwórz obiekt ima.dai.api.StreamManager, który odpowiada za wysyłanie żądań i zarządzanie strumieniami DAI. Konstruktor przyjmuje element wideo, a wynikowa instancja przyjmuje element interfejsu reklamy do obsługi interakcji z reklamą.

Następnie zdefiniuj funkcję, która będzie wysyłać żądanie transmisji na żywo z wyświetlaniem reklam przez zasobnik. Ta funkcja najpierw tworzy obiekt PodStreamRequest, konfiguruje go za pomocą parametrów streamRequest podanych w kroku 2, a następnie wywołuje metodę streamManager.requestStream() z tym obiektem żądania.

dai.js

function initPlayer() {
  videoElement = document.getElementById('video');
  adUiElement = document.getElementById('adUi');
  streamManager = new google.ima.dai.api.StreamManager(videoElement, adUiElement)

  requestLivePodStream(NETWORK_CODE, CUSTOM_ASSET_KEY, API_KEY);
}

function requestLivePodStream(networkCode, customAssetKey, apiKey) {
  // clear HLS.js instance, if in use
  if (hls) {
    hls.destroy();
  }

  // Generate a Pod Serving live Stream Request
  const streamRequest = new google.ima.dai.api.PodStreamRequest();
  streamRequest.networkCode = networkCode;
  streamRequest.customAssetKey = customAssetKey;
  streamRequest.apiKey = apiKey;
  streamRequest.format = 'hls';
  streamManager.requestStream(streamRequest);
}

Wyświetlanie bloków reklamowych w VOD

Aby wysłać żądanie zestawu reklam, utwórz obiekt ima.dai.api.StreamManager, który odpowiada za wysyłanie żądań i zarządzanie strumieniami DAI. Konstruktor przyjmuje element wideo, a wynikowa instancja przyjmuje element interfejsu reklamy do obsługi interakcji z reklamą.

Następnie zdefiniuj funkcję, która będzie wysyłać żądania strumienia VOD z wyświetlaniem bloków reklamowych. Ta funkcja najpierw tworzy obiekt PodVodStreamRequest, konfiguruje go za pomocą parametrów streamRequest podanych w kroku 2, a następnie wywołuje metodę streamManager.requestStream() z tym obiektem żądania.

dai.js

function initPlayer() {
  videoElement = document.getElementById('video');
  adUiElement = document.getElementById('adUi');
  streamManager = new google.ima.dai.api.StreamManager(videoElement, adUiElement)

  requestVodPodStream(NETWORK_CODE);
}

function requestVodPodStream(networkCode) {
  // clear HLS.js instance, if in use
  if (hls) {
    hls.destroy();
  }

  // Generate a Pod Serving VOD Stream Request
  const streamRequest = new google.ima.dai.api.PodVodStreamRequest();
  streamRequest.networkCode = networkCode;
  streamRequest.format = 'hls';
  streamManager.requestStream(streamRequest);
}

Obsługa zdarzeń strumienia

Wyświetlanie bloków reklamowych podczas transmisji na żywo

Następnie zaimplementuj detektory zdarzeń dla najważniejszych zdarzeń wideo. W tym przykładzie zdarzenia STREAM_INITIALIZED, ERROR, AD_BREAK_STARTED i AD_BREAK_ENDED są obsługiwane przez wywołanie funkcji onStreamEvent(). Ta funkcja obsługuje wczytywanie strumienia i błędy, a także wyłącza elementy sterujące odtwarzaczem podczas odtwarzania reklamy, co jest wymagane przez pakiet SDK. Po wczytaniu strumienia odtwarzacz wideo wczytuje i odtwarza podany adres URL za pomocą funkcji loadStream().

dai.js

var isAdBreak;

function initPlayer() {
  videoElement = document.getElementById('video');
  adUiElement = document.getElementById('adUi');
  streamManager = new google.ima.dai.api.StreamManager(videoElement, adUiElement);
  
  streamManager.addEventListener(
    [google.ima.dai.api.StreamEvent.Type.STREAM_INITIALIZED,
    google.ima.dai.api.StreamEvent.Type.ERROR,
    google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED,
    google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED],
    onStreamEvent,
    false);
...
function onStreamEvent(e) {
  switch (e.type) {
    case google.ima.dai.api.StreamEvent.Type.STREAM_INITIALIZED:
      console.log('Stream initialized');
      loadStream(e.getStreamData().streamId);
      break;
    case google.ima.dai.api.StreamEvent.Type.ERROR:
      console.log('Error loading stream, playing backup stream.' + e);
      loadStream('');
      break;
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED:
      console.log('Ad Break Started');
      isAdBreak = true;
      videoElement.controls = false;
      adUiElement.style.display = 'block';
      break;
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED:
      console.log('Ad Break Ended');
      isAdBreak = false;
      videoElement.controls = true;
      adUiElement.style.display = 'none';
      break;
    default:
      break;
  }
}

function loadStream(streamID) {
  var url;
  if(streamID) {
    url = STREAM_URL.replace('[[STREAMID]]', streamID);
  } else {
    console.log('Stream Initialization Failed');
    url = BACKUP_STREAM;
  }
  console.log('Loading:' + url);
  hls.loadSource(url);
  hls.attachMedia(videoElement);
}

Wyświetlanie bloków reklamowych w VOD

Następnie zaimplementuj detektory zdarzeń dla najważniejszych zdarzeń wideo. W tym przykładzie zdarzenia STREAM_INITIALIZED, LOADED, ERROR, AD_BREAK_STARTED i AD_BREAK_ENDED są obsługiwane przez wywołanie funkcji onStreamEvent(). Ta funkcja obsługuje wczytywanie strumienia i błędy, a także wyłącza elementy sterujące odtwarzaczem podczas odtwarzania reklamy, co jest wymagane przez pakiet SDK.

Dodatkowo strumienie VOD z wyświetlaniem bloków reklamowych wymagają wywołania StreamManager.loadStreamMetadata() w odpowiedzi na zdarzenie STREAM_INITIALIZED. Musisz też poprosić partnera technologicznego w zakresie wideo o adres URL strumienia. Gdy wywołanie loadStreamMetadata() się powiedzie, wywoła zdarzenie LOADED, w którym należy wywołać funkcję loadStream() z adresem URL strumienia, aby wczytać i odtworzyć strumień.

var isAdBreak;

function initPlayer() {
  videoElement = document.getElementById('video');
  adUiElement = document.getElementById('adUi');
  streamManager = new google.ima.dai.api.StreamManager(videoElement, adUiElement);
  
  streamManager.addEventListener(
    [google.ima.dai.api.StreamEvent.Type.STREAM_INITIALIZED,
    google.ima.dai.api.StreamEvent.Type.ERROR,
    google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED,
    google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED],
    onStreamEvent,
    false);
...
function onStreamEvent(e) {
  switch (e.type) {
    case google.ima.dai.api.StreamEvent.Type.STREAM_INITIALIZED:
      const streamId = e.getStreamData().streamId;
      // 'vtpInterface' is a place holder for your own video technology
      //  partner (VTP) API calls.
      vtpInterface.requestStreamURL({
        'streamId': streamId,
      })
      .then( (vtpStreamUrl) => {
        streamUrl = vtpStreamUrl;
        streamManager.loadStreamMetadata();
      }, (error) => {
        // Handle the error.
      });
      break;
    case google.ima.dai.api.StreamEvent.Type.LOADED:
      loadStream(streamUrl);
      break;
    case google.ima.dai.api.StreamEvent.Type.ERROR:
      console.log('Error loading stream, playing backup stream.' + e);
      loadStream();
      break;
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED:
      console.log('Ad Break Started');
      isAdBreak = true;
      videoElement.controls = false;
      adUiElement.style.display = 'block';
      break;
    case google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED:
      console.log('Ad Break Ended');
      isAdBreak = false;
      videoElement.controls = true;
      adUiElement.style.display = 'none';
      break;
    default:
      break;
  }
}

function loadStream(url) {
  if(url) {
    console.log('Loading:' + url);
    hls.loadSource(url);
  } else {
    console.log('Stream Initialization Failed');
    hls.loadSource(BACKUP_STREAM);
  }
  hls.attachMedia(videoElement);
}

Obsługa metadanych strumienia

W tym kroku zaimplementujesz detektory zdarzeń dla metadanych, aby powiadamiać pakiet SDK o wystąpieniu zdarzeń reklamowych. Sposób nasłuchiwania zdarzeń metadanych w reklamie In-Stream może się różnić w zależności od formatu transmisji (HLS lub DASH), typu transmisji (na żywo lub VOD), typu odtwarzacza i typu używanego backendu DAI. Więcej informacji znajdziesz w naszym przewodniku po metadanych czasowych.

Format strumienia HLS (transmisje na żywo i VOD, odtwarzacz HLS.js)

Jeśli używasz odtwarzacza HLS.js, nasłuchuj zdarzenia HLS.js FRAG_PARSING_METADATA, aby uzyskać metadane ID3 i przekazać je do pakietu SDK za pomocą StreamManager.processMetadata().

Aby automatycznie odtwarzać film po załadowaniu i przygotowaniu wszystkich elementów, nasłuchuj zdarzenia HLS.js MANIFEST_PARSED, które uruchamia odtwarzanie.

function loadStream(streamID) {
  hls.loadSource(url);
  hls.attachMedia(videoElement);
  
  // Timed metadata is passed HLS stream events to the streamManager.
  hls.on(Hls.Events.FRAG_PARSING_METADATA, parseID3Events);
  hls.on(Hls.Events.MANIFEST_PARSED, startPlayback);
}

function parseID3Events(event, data) {
  if (streamManager && data) {
    // For each ID3 tag in the metadata, pass in the type - ID3, the
    // tag data (a byte array), and the presentation timestamp (PTS).
    data.samples.forEach((sample) => {
      streamManager.processMetadata('ID3', sample.data, sample.pts);
    });
  }
}

function startPlayback() {
  console.log('Video Play');
  videoElement.play();
}

DASH.js (format strumieni DASH, typ strumienia: transmisja na żywo i VOD)

Jeśli używasz odtwarzacza DASH.js, musisz używać różnych ciągów znaków do nasłuchiwania metadanych ID3 w przypadku transmisji na żywo i VOD:

  • Transmisje na żywo: 'https://developer.apple.com/streaming/emsg-id3'
  • Strumienie VOD: 'urn:google:dai:2018'

Przekaż metadane ID3 do pakietu SDK za pomocą metody StreamManager.processMetadata().

Aby automatycznie wyświetlać elementy sterujące odtwarzaniem filmu po załadowaniu i przygotowaniu wszystkich elementów, nasłuchuj zdarzenia DASH.js MANIFEST_LOADED.

const googleLiveSchema = 'https://developer.apple.com/streaming/emsg-id3';
const googleVodSchema = 'urn:google:dai:2018';
dashPlayer.on(googleLiveSchema, processMetadata);
dashPlayer.on(googleVodSchema, processMetadata);
dashPlayer.on(dashjs.MediaPlayer.events.MANIFEST_LOADED, loadlistener);

function processMetadata(metadataEvent) {
  const messageData = metadataEvent.event.messageData;
  const timestamp = metadataEvent.event.calculatedPresentationTime;

  // Use StreamManager.processMetadata() if your video player provides raw
  // ID3 tags, as with dash.js.
  streamManager.processMetadata('ID3', messageData, timestamp);
}

function loadlistener() {
  showControls();

  // This listener must be removed, otherwise it triggers as addional
  // manifests are loaded. The manifest is loaded once for the content,
  // but additional manifests are loaded for upcoming ad breaks.
  dashPlayer.off(dashjs.MediaPlayer.events.MANIFEST_LOADED, loadlistener);
}

Odtwarzacz Shaka z transmisjami na żywo (format strumieni DASH)

Jeśli do odtwarzania transmisji na żywo używasz odtwarzacza Shaka, użyj ciągu 'emsg', aby nasłuchiwać zdarzeń metadanych. Następnie użyj danych wiadomości o zdarzeniu w wywołaniu StreamManager.onTimedMetadata().

shakaPlayer.addEventListener('emsg', (event) => onEmsgEvent(event));

function onEmsgEvent(metadataEvent) {
  // Use StreamManager.onTimedMetadata() if your video player provides
  // processed metadata, as with Shaka player livestreams.
  streamManager.onTimedMetadata({'TXXX': metadataEvent.detail.messageData});
}

Odtwarzacz Shaka ze strumieniami VOD (format strumieni DASH)

Jeśli do odtwarzania strumienia VOD używasz odtwarzacza Shaka, użyj ciągu 'timelineregionenter', aby nasłuchiwać zdarzeń metadanych. Następnie użyj danych wiadomości o zdarzeniu w wywołaniu StreamManager.processMetadata() z ciągiem znaków 'urn:google:dai:2018'.

shakaPlayer.addEventListener('timelineregionenter', (event) => onTimelineEvent(event));

function onTimelineEvent(metadataEvent) {
  const detail = metadataEvent.detail;
  if ( detail.eventElement.attributes &&
       detail.eventElement.attributes['messageData'] &&
       detail.eventElement.attributes['messageData'].value ) {
        const mediaId = detail.eventElement.attributes['messageData'].value;
        const pts = detail.startTime;
        // Use StreamManager.processMetadata() if your video player provides raw
        // ID3 tags, as with Shaka player VOD streams.
        streamManager.processMetadata('urn:google:dai:2018', mediaId, pts);
       }
}

Obsługa zdarzeń gracza

Dodaj detektory zdarzeń do zdarzeń pause i start elementu wideo, aby umożliwić użytkownikowi wznowienie odtwarzania, gdy pakiet SDK wstrzyma je podczas przerw na reklamę.

function loadStream(streamUrl) {
  ...
  
  videoElement.addEventListener('pause', onStreamPause);
  videoElement.addEventListener('play', onStreamPlay);
}

function onStreamPause() {
  console.log('paused');
  if (isAdBreak) {
    videoElement.controls = true;
    adUiElement.style.display = 'none';
  }
}

function onStreamPlay() {
  console.log('played');
  if (isAdBreak) {
    videoElement.controls = false;
    adUiElement.style.display = 'block';
  }
}

Czyszczenie zasobów IMA DAI

Po pomyślnym zakończeniu żądania i wyświetlania reklam displayowych w strumieniu z obsługą wyświetlania bloków reklamowych za pomocą pakietu IMA DAI SDK zalecamy wyczyszczenie wszystkich zasobów po zakończeniu sesji wyświetlania bloków reklamowych. Wywołaj StreamManager.destroy(), aby zatrzymać odtwarzanie strumienia, zatrzymać śledzenie reklam i zwolnić wszystkie wczytane zasoby strumienia.

Aby dowiedzieć się więcej o bardziej zaawansowanych funkcjach pakietu SDK, zapoznaj się z innymi przewodnikami lub przykładami na GitHubie.