IMA SDK упрощают интеграцию мультимедийной рекламы на ваши веб-сайты и приложения. IMA SDK могут запрашивать рекламу с любого рекламного сервера , совместимого с VAST, и управлять воспроизведением рекламы в ваших приложениях. С помощью SDK IMA DAI приложения отправляют потоковый запрос на рекламу и видеоконтент — либо VOD, либо контент в реальном времени. Затем SDK возвращает объединенный видеопоток, так что вам не придется управлять переключением между рекламой и видеоконтентом в вашем приложении.
Выберите решение DAI, которое вас интересует
Модуль, обслуживающий DAI
В этом руководстве показано, как воспроизвести поток обслуживания модулей DAI для контента в реальном времени или видео по запросу с помощью IMA DAI SDK для HTML5 с видеопроигрывателем, который использует hls.js для воспроизведения. Чтобы просмотреть или проследить за завершенным примером интеграции с поддержкой HLS.js и Safari Playback, см. пример обслуживания модуля HLS . Информацию о поддержке DASH.js см. в примере обслуживания модулей DASH . Вы можете скачать эти примеры приложений со страницы выпуска HTML5 DAI GitHub .
Обзор обслуживания модулей DAI
Реализация обслуживания модулей с помощью IMA DAI SDK включает два основных компонента, которые продемонстрированы в этом руководстве:
PodStreamRequest
/PodVodStreamRequest
: объект, определяющий запрос потока к рекламным серверам Google. В запросах указывается сетевой код , а дляPodStreamRequest
также требуется пользовательский ключ актива и дополнительный ключ API . Оба включают другие необязательные параметры.StreamManager
: объект, который обрабатывает связь между видеопотоком и IMA DAI SDK, например отправляет запросы отслеживания и пересылает события потока издателю.
Предварительные условия
Прежде чем начать, вам необходимо следующее:
Три пустых файла:
- dai.html
- dai.css
- dai.js
Python установлен на вашем компьютере, веб-сервере или в другой размещенной среде разработки для использования для тестирования.
Настройка среды разработки
Поскольку SDK загружает зависимости, используя тот же протокол, что и страница, с которой он загружается, вам необходимо использовать веб-сервер для тестирования вашего приложения. Быстрый способ запустить локальный сервер разработки — использовать встроенный сервер Python.
Используя командную строку, из каталога, содержащего файл
index.html
запустите:python -m http.server 8000
В веб-браузере перейдите по адресу
http://localhost:8000/
Вы также можете использовать любую другую размещенную среду разработки или веб-сервер, например HTTP-сервер Apache .
Создать видеоплеер
Сначала измените dai.html , чтобы создать элемент видео HTML5 и элемент div, который будет использоваться для элементов пользовательского интерфейса рекламы. Также добавьте необходимые теги для загрузки файлов dai.css и dai.js , а также для импорта видеоплеера hls.js
Затем измените dai.css , указав размер и положение элементов страницы. Наконец, в dai.js определите переменные для хранения информации запроса потока и функцию initPlayer()
которая будет запускаться при загрузке страницы.
Константы запроса потока следующие:
BACKUP_STREAM
: URL-адрес резервного потока, который будет воспроизводиться на случай, если в процессе рекламы возникнет фатальная ошибка.STREAM_URL
: используется только для прямых трансляций . URL-адрес видеопотока, предоставленный вашим манипулятором манифеста или сторонним партнером, использующим Pod Serving. Прежде чем делать запрос, вам потребуется ввести идентификатор потока, предоставленный IMA DAI SDK. В этом случае URL-адрес потока включает заполнитель[[STREAMID]]
, который заменяется идентификатором потока перед выполнением запроса.NETWORK_CODE
: код сети вашего аккаунта Менеджера рекламы 360.CUSTOM_ASSET_KEY
: используется только для прямых трансляций . Пользовательский ключ ресурса, который идентифицирует событие показа модулей в Менеджере рекламы 360. Его может создать ваш манипулятор манифеста или сторонний партнер по обслуживанию модулей.API_KEY
: используется только для прямых трансляций . Дополнительный ключ API, который может потребоваться для получения идентификатора потока из 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');
}
Загрузите SDK IMA DAI
Затем добавьте платформу DAI, используя тег сценария в dai.html перед тегом 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>
...
Инициализируйте StreamManager и выполните запрос потока в реальном времени или VOD.
Обслуживание модулей прямой трансляции
Чтобы запросить набор объявлений, создайте ima.dai.api.StreamManager
, который отвечает за запрос и управление потоками DAI. Конструктор принимает элемент видео, а полученный экземпляр принимает элемент пользовательского интерфейса объявления для обработки взаимодействия с рекламой.
Затем определите функцию для запроса прямой трансляции Pod Serving. Эта функция сначала создает PodStreamRequest
, настраивает его с помощью параметровstreamRequest, предоставленных на шаге 2, а затем вызываетstreamManager.requestStream streamManager.requestStream()
с этим объектом запроса.
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);
}
Обслуживание модулей VOD
Чтобы запросить набор объявлений, создайте ima.dai.api.StreamManager
, который отвечает за запрос и управление потоками DAI. Конструктор принимает элемент видео, а полученный экземпляр принимает элемент пользовательского интерфейса объявления для обработки взаимодействия с рекламой.
Затем определите функцию для запроса потока VOD для обслуживания модулей. Эта функция сначала создает PodVodStreamRequest
, настраивает его с помощью параметровstreamRequest, указанных на шаге 2, а затем вызываетstreamManager.requestStream streamManager.requestStream()
с этим объектом запроса.
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);
}
Обработка событий потока
Обслуживание модулей прямой трансляции
Затем реализуйте прослушиватели событий для основных видеособытий. В этом примере события STREAM_INITIALIZED
, ERROR
, AD_BREAK_STARTED
и AD_BREAK_ENDED
обрабатываются путем вызова функции onStreamEvent()
. Эта функция обрабатывает загрузку потока и ошибки, а также отключает элементы управления проигрывателем во время воспроизведения рекламы, что требуется SDK. Когда поток загружается, видеопроигрыватель загружает и воспроизводит предоставленный URL-адрес с помощью функции 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);
}
Обслуживание модулей VOD
Затем реализуйте прослушиватели событий для основных видеособытий. В этом примере события STREAM_INITIALIZED
, LOADED
, ERROR
, AD_BREAK_STARTED
и AD_BREAK_ENDED
обрабатываются путем вызова функции onStreamEvent()
. Эта функция обрабатывает загрузку потока и ошибки, а также отключает элементы управления проигрывателем во время воспроизведения рекламы, что требуется SDK.
Кроме того, потоки обслуживания модулей VOD требуют вызова StreamManager.loadStreamMetadata()
в ответ на событие STREAM_INITIALIZED
. Вам также необходимо запросить URL-адрес потока у вашего партнера по видеотехнологиям (VTP). После успешного вызова loadStreamMetadata()
он запускает событие LOADED
, где вам следует вызвать функцию loadStream()
с URL-адресом вашего потока, чтобы загрузить и воспроизвести поток.
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);
}
Обработка метаданных потока
На этом этапе вы реализуете прослушиватели событий для метаданных, чтобы уведомлять SDK о возникновении рекламных событий. Прослушивание событий метаданных в потоке может различаться в зависимости от формата потока (HLS или DASH), типа потока (поток Live или VOD), типа вашего проигрывателя и типа используемого серверного модуля DAI. Дополнительную информацию см. в нашем руководстве по временным метаданным .
Формат потока HLS (потоки Live и VOD, проигрыватель HLS.js)
Если вы используете проигрыватель HLS.js , прослушайте событие HLS.js FRAG_PARSING_METADATA
, чтобы получить метаданные ID3, и передайте их в SDK с помощью StreamManager.processMetadata()
.
Чтобы автоматически воспроизвести видео после того, как все будет загружено и готово, прослушайте событие HLS.js MANIFEST_PARSED
чтобы запустить воспроизведение.
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 (формат потоков DASH, тип потоков Live и VOD)
Если вы используете проигрыватель DASH.js , вам придется использовать разные строки для прослушивания метаданных ID3 для потоков Live или VOD:
- Прямые трансляции:
'https://developer.apple.com/streaming/emsg-id3'
- VOD-трансляции:
'urn:google:dai:2018'
Передайте метаданные ID3 в SDK с помощью StreamManager.processMetadata()
.
Чтобы автоматически отображать элементы управления видео после того, как все будет загружено и готово, прослушайте событие 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);
}
Shaka Player с прямыми трансляциями (формат потоков DASH)
Если вы используете проигрыватель Shaka для воспроизведения в реальном времени, используйте строку 'emsg'
для прослушивания событий метаданных. Затем используйте данные сообщения о событии при вызове 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});
}
Shaka Player с потоками VOD (формат потоков DASH)
Если вы используете проигрыватель Shaka для воспроизведения потока VOD, используйте строку 'timelineregionenter'
для прослушивания событий метаданных. Затем используйте данные сообщения о событии при вызове StreamManager.processMetadata()
со строкой '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);
}
}
Обработка событий игрока
Добавьте прослушиватели событий к событиям pause
и start
видеоэлемента, чтобы пользователь мог возобновить воспроизведение, когда SDK приостанавливает во время рекламных пауз.
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';
}
}
Очистите активы IMA DAI
После успешного завершения запроса и отображения рекламы в потоке обслуживания модулей с помощью IMA DAI SDK мы предлагаем вам очистить все ресурсы после завершения сеанса обслуживания модулей. Вызовите StreamManager.destroy()
чтобы остановить воспроизведение потока, остановить отслеживание всей рекламы и освободить все загруженные ресурсы потока.
Чтобы узнать о более продвинутых функциях SDK, ознакомьтесь с другими руководствами или примерами на GitHub .