Pakiety IMA SDK ułatwiają integrację reklam multimedialnych z witrynami i aplikacjami. Pakiety IMA SDK mogą żądania reklam z Serwer reklam zgodny i zarządzanie odtwarzaniem reklam w aplikacjach. Dzięki pakietom SDK IMA DAI aplikacje żądania strumieniowego przesyłania danych reklamy i treści wideo – VOD lub treści na żywo. SDK zwraca wtedy typ połączony strumień wideo, dzięki czemu nie trzeba przełączać się między reklamą a treścią wideo. w Twojej aplikacji.
Wybierz rozwiązanie DAI, które Cię interesuje
Blok reklamowy z dynamicznym wstawianiem reklam
Ten przewodnik pokazuje, jak odtworzyć strumień wyświetlania bloków reklamowych z dynamicznym wstawianiem reklam w przypadku transmisji na żywo lub VOD. za pomocą pakietu IMA DAI SDK na potrzeby HTML5 i odtwarzacza wideo, który korzysta z tagu hls.js do odtwarzania. Jeśli chcesz zobaczyć gotowy fragment lub zapoznać się z nim z obsługą zarówno HLS.js, jak i Safari, zapoznaj się z Przykład wyświetlania poda HLS. Informacje o obsłudze DASH.js znajdziesz w przykładzie wyświetlania bloków reklamowych DASH. Możesz pobrać te przykładowe aplikacje z wersji GitHub HTML5 z funkcją DAI .
Omówienie wyświetlania podów z dynamicznym wstawianiem reklam
Implementacja wyświetlania bloków reklamowych za pomocą pakietu IMA DAI SDK obejmuje 2 główne komponenty: w tym przewodniku:
PodStreamRequest
/PodVodStreamRequest
: obiekt definiujący żądanie strumienia do Serwery reklamowe Google. W żądaniach jest określony kod sieci, a parametryPodStreamRequest
wymaga też niestandardowego klucza zasobu i opcjonalnego klucza Klucz interfejsu API. Oba typy zawierają inne opcjonalne parametry.StreamManager
: obiekt obsługujący komunikację między strumienia wideo i pakietu IMA DAI SDK, np. uruchamiania pingów śledzących czy i przekazywać wydawcy zdarzenia strumienia.
Wymagania wstępne
Zanim zaczniesz, musisz mieć:
Trzy puste pliki:
- dai.html
- dai.css
- dai.js
Na Twoim komputerze zainstalowany jest język Python, serwer WWW lub inny hostowany program rozwojowy środowisko używane do testowania
Konfigurowanie środowiska programistycznego
Pakiet SDK wczytuje zależności za pomocą tego samego protokołu co strona z musisz użyć serwera WWW, aby ją przetestować. Krótka aby uruchomić lokalny serwer programistyczny, użyj wbudowanego serwera Pythona.
Za pomocą wiersza poleceń, z katalogu zawierającego
index.html
uruchomienie pliku:python -m http.server 8000
W przeglądarce otwórz stronę
http://localhost:8000/
Możesz również użyć dowolnego innego hostowanego środowiska programistycznego lub serwera WWW, takiego jak jako serwer Apache HTTP.
Utwórz prosty odtwarzacz wideo
Najpierw zmodyfikuj plik dai.html, by utworzyć prosty element wideo HTML5 i element div do
elementów interfejsu reklamy. Dodaj też tagi niezbędne do wczytywania pliku dai.css
i dai.js oraz zaimportować odtwarzacz wideo hls.js
.
Następnie zmodyfikuj plik dai.css, by określić rozmiar i pozycję elementów strony.
Na koniec w tagu dai.js zdefiniuj zmienne do przechowywania informacji o żądaniach strumienia.
i funkcja initPlayer()
do uruchamiania po wczytaniu strony.
Stałe żądania strumienia są następujące:
BACKUP_STREAM
: adres URL strumienia zapasowego, który będzie odtwarzany na wypadek procesu wyświetlania reklam. napotka błąd krytyczny.STREAM_URL
: używany tylko w przypadku transmisji na żywo. Adres URL strumienia wideo dostarczony przez za pomocą manipulatora manifestu lub partnera zewnętrznego, który obsługuje bloki reklamowe. Powinna musisz wstawić identyfikator strumienia dostarczony przez pakiet IMA DAI SDK przed przesłać prośbę. W tym przypadku URL transmisji zawiera zmienną,[[STREAMID]]
, który jest zastępowany identyfikatorem strumienia przed wysłaniem żądania.NETWORK_CODE
: kod sieci Twojego konta Ad Managera 360.CUSTOM_ASSET_KEY
: używany tylko w przypadku transmisji na żywo. Niestandardowy klucz pliku, który identyfikuje zdarzenie wyświetlenia bloku reklamowego w usłudze Ad Manager 360. Kto może ją utworzyć za pomocą manipulatora pliku manifestu lub zewnętrznego partnera obsługującego pody.API_KEY
: używany tylko w przypadku transmisji na żywo. Opcjonalny klucz interfejsu API, którego można użyć wymagane 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="ad-ui"></div>
</body>
</html>
dai.css
#video,
#ad-ui {
width: 640px;
height: 360px;
position: absolute;
top: 35px;
left: 0;
}
#ad-ui {
cursor: pointer;
}
dai.js
var BACKUP_STREAM =
'https://storage.googleapis.com/interactive-media-ads/media/bbb.m3u8'
// Stream Config.
const STREAM_URL = "https://encodersim.sandbox.google.com/masterPlaylist/...&stream_id=[[STREAMID]]";
const NETWORK_CODE = "51636543";
const CUSTOM_ASSET_KEY = "google-sample";
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');
}
Wczytaj pakiet IMA DAI SDK
Następnie dodaj platformę DAI, używając tagu skryptu w pliku dai.html przed tagiem. dla 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>
...
Zainicjuj usługę StreamManager i wyślij żądanie strumienia na żywo lub VOD
Blok reklamowy w transmisjach na żywo
Aby poprosić o zestaw reklam, utwórz ima.dai.api.StreamManager
, który
odpowiada za żądania strumieni DAI i zarządzanie nimi. Konstruktor pobiera
element wideo, a wystąpienie przechwytuje reklamę z elementu interfejsu reklamy.
interakcje.
Następnie zdefiniuj funkcję, która wysyła żądanie bloku reklamowego do transmisji na żywo. Ta funkcja
najpierw tworzy PodStreamRequest
, konfiguruje je za pomocą żądania streamRequest
podane w kroku 2, a następnie wywołuje funkcję streamManager.requestStream()
z danym 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 VOD
Aby poprosić o zestaw reklam, utwórz ima.dai.api.StreamManager
, który
odpowiada za żądania strumieni DAI i zarządzanie nimi. Konstruktor pobiera
element wideo, a wystąpienie przechwytuje reklamę z elementu interfejsu reklamy.
interakcje.
Następnie zdefiniuj funkcję, która wysyła żądanie poda obsługującego strumień VOD. Ta funkcja
najpierw tworzy PodVodStreamRequest
, konfiguruje je za pomocą żądania streamRequest
podane w kroku 2, a następnie wywołuje funkcję streamManager.requestStream()
z danym 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ługuj zdarzenia strumienia
Blok reklamowy w transmisjach na żywo
Następnie zaimplementuj detektory ważnych zdarzeń wideo. W tym przykładzie
STREAM_INITIALIZED
, ERROR
, AD_BREAK_STARTED
i AD_BREAK_ENDED
zdarzeń, wywołując funkcję onStreamEvent()
. Ta funkcja obsługuje strumień
ładowania i błędów, a także wyłączenie elementów sterujących odtwarzaczem, gdy reklama jest wyświetlana
odtwarzania, co jest wymagane przez pakiet SDK. Po wczytaniu strumienia film
odtwarzacz wczytuje i odtwarza podany 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 VOD
Następnie zaimplementuj detektory ważnych zdarzeń wideo. W tym przykładzie
STREAM_INITIALIZED
, LOADED
, ERROR
, AD_BREAK_STARTED
i
AD_BREAK_ENDED
poprzez wywołanie funkcji onStreamEvent()
. Ten
obsługuje wczytywanie strumienia i błędy, a także wyłącza odtwarzacz
elementów sterujących podczas odtwarzania reklamy. Jest to wymagane przez pakiet SDK.
Oprócz tego strumienie wyświetlania bloków reklamowych VOD wymagają wywołania
StreamManager.loadStreamMetadata()
w odpowiedzi na
STREAM_INITIALIZED
. Poproś też o adres URL transmisji na swojej stronie,
partnera w zakresie technologii wideo (VTP). Po pomyślnym wywołaniu loadStreamMetadata()
wywołuje zdarzenie LOADED
, które należy wywołać funkcję loadStream()
za pomocą adresu URL transmisji, aby wczytać i odtworzyć transmisję.
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 wdrożysz detektory zdarzeń dla metadanych, aby powiadamiały pakiet SDK, gdy zdarzeń reklamowych. Nasłuchiwanie zdarzeń metadanych In-Stream może się różnić w zależności od format strumienia (HLS lub DASH), typ (transmisja na żywo lub VOD), typu odtwarzacza i używanego backendu DAI. Zobacz nasze Metadane .
Format strumienia HLS (strumienie na żywo i VOD, odtwarzacz HLS.js)
Jeśli korzystasz z odtwarzacza HLS.js, posłuchaj
w zdarzeniu FRAG_PARSING_METADATA
HLS.js, by pobrać metadane ID3 i przekazać je do
Pakiet SDK z StreamManager.processMetadata()
.
Aby automatycznie odtworzyć film, gdy wszystko będzie wczytane i gotowe, posłuchaj:
zdarzenie MANIFEST_PARSED
HLS.js, które aktywuje 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 oraz typ strumienia Na żywo i VOD)
Jeśli korzystasz z odtwarzacza DASH.js, musisz użyć różnych ciągów znaków, aby nasłuchiwać metadanych ID3 w przypadku transmisji na żywo lub VOD. strumienie:
- Transmisje na żywo:
'https://developer.apple.com/streaming/emsg-id3'
- Strumienie VOD:
'urn:google:dai:2018'
Przekaż metadane ID3 do pakietu SDK za pomocą StreamManager.processMetadata()
.
Aby automatycznie wyświetlać elementy sterujące odtwarzaniem po załadowaniu wszystkich elementów:
nasłuchuje zdarzenia MANIFEST_LOADED
DASH.js.
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);
}
Shaka Player z transmisjami na żywo (format DASH)
Jeśli używasz odtwarzacza Shaki do
odtwarzania na żywo, użyj ciągu 'emsg'
, aby nasłuchiwać zdarzeń metadanych.
Następnie użyj danych komunikatu o zdarzeniu w wywołaniu pod numerem 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 używasz odtwarzacza Shaki do
Odtwarzanie strumienia VOD, aby nasłuchiwać, użyj ciągu 'timelineregionenter'
zdarzenia związane z metadanymi. Następnie użyj danych komunikatu o zdarzeniu w rozmowie,
StreamManager.processMetadata()
z ciągiem '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ń graczy
Dodaj detektory zdarzeń do zdarzeń pause
i start
elementu wideo, aby zezwolić
wznowienie odtwarzania w przypadku wstrzymania działania pakietu SDK w czasie 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';
}
}
Znakomicie. Zamawiasz i wyświetlasz reklamy w strumieniu bloku reklamowego z pakiet IMA DAI SDK dla HTML5. Aby dowiedzieć się więcej o bardziej zaawansowanych funkcjach pakietu SDK, zobacz innych przewodników lub przykładów GitHub.