Seleziona la soluzione DAI che ti interessa
DAI con pubblicazione di pod
Gli SDK IMA semplificano l'integrazione di annunci multimediali nei tuoi siti web e nelle tue app.
Gli SDK IMA possono richiedere annunci da qualsiasi ad server compatibile con VAST e gestire la riproduzione degli annunci nelle tue app.
Con gli SDK IMA DAI, le app effettuano una richiesta di stream per l'annuncio e il video dei contenuti per i contenuti VOD o live. L'SDK restituisce quindi uno stream video combinato, in modo da non dover gestire il passaggio tra l'annuncio e il video di contenuti all'interno dell'app.
Questa guida mostra come riprodurre uno stream di pubblicazione di pod DAI utilizzando l'SDK IMA DAI per CAF.
Prima di utilizzare questa guida, acquisisci familiarità con il protocollo Web Receiver del framework dell'applicazione Chromecast. Questa guida presuppone una conoscenza di base dei concetti del ricevitore CAF, come gli intercettori di messaggi e gli oggetti mediaInformation, nonché familiarità con l'utilizzo dello strumento di controllo e comando di Cast, per emulare un mittente CAF.
Per utilizzare la pubblicazione di pod DAI di IMA, devi collaborare con un partner di pubblicazione di pod e disporre di un account Ad Manager 360 Advanced. Se hai un account Ad Manager, contatta il tuo account manager per maggiori dettagli. Per informazioni sulla registrazione ad Ad Manager, visita il Centro assistenza Ad Manager.
Per informazioni sull'integrazione con altre piattaforme o sull'utilizzo degli SDK lato client IMA, consulta SDK Interactive Media Ads.
Panoramica della pubblicazione di pod DAI di IMA
L'implementazione della pubblicazione di pod utilizzando l'SDK IMA CAF DAI prevede due componenti principali, che vengono illustrati in questa guida:
StreamRequest
: Un oggetto che definisce una richiesta di stream ai server pubblicitari di Google. Le richieste specificano un codice di rete, una chiave dell'asset personalizzato e una chiave API facoltativa, nonché altri parametri facoltativi.StreamManager
: Un oggetto che gestisce la comunicazione tra lo stream video e l'SDK IMA DAI, ad esempio l'invio di ping di monitoraggio e l'inoltro degli eventi di stream al publisher.
Prerequisiti
- Un account Cast Developer Console con dispositivi di test registrati.
- Un'app ricevitore web ospitata registrata nella tua Cast Developer Console e che può essere modificata per ospitare il codice fornito da questa guida.
- Un'app di invio configurata per utilizzare l'app ricevitore web. Ai fini di questo esempio, utilizza lo strumento di controllo e comando di Cast come mittente.
Configurare gli oggetti MediaInfo del mittente
Innanzitutto, configura l'oggetto MediaInfo
dell'app mittente in modo che includa i seguenti campi:
Campo | Sommario | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
contentId
|
Un identificatore univoco per questo elemento multimediale.
CONTENT_ID |
||||||||||
contentUrl
|
(Facoltativo) URL dello stream di backup da riprodurre se lo stream DAI non viene caricato.
BACKUP_STREAM_URL |
||||||||||
contentType
|
(Facoltativo) Tipo MIME degli stream di backup dei contenuti. Necessario solo per gli stream DASH.
CONTENT_STREAM_MIMETYPE |
||||||||||
streamType
|
Il valore letterale stringa o la costante utilizzata per questo valore varia in base alla piattaforma del mittente. | ||||||||||
customData
|
Il campo customData contiene un archivio chiave-valore di altri
campi obbligatori. In questo esempio, contiene i parametri dello stream DAI. In
un'app di produzione potresti invece passare un identificatore che la tua app ricevitore Cast utilizzerebbe per recuperare questi parametri con una richiesta lato server.
|
Ecco alcuni esempi di codice per aiutarti a iniziare:
Web
Per configurare questi valori in un mittente web Cast, crea prima un oggetto
MediaInfo
con i dati richiesti, quindi invia una richiesta di
caricamento al web receiver.
// Create mediaInfo object
const mediaInfo = new chrome.cast.media.MediaInfo("CONTENT_ID");
mediaInfo.contentUrl = "BACKUP_STREAM_URL";
mediaInfo.contentType = "CONTENT_STREAM_MIMETYPE";
mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;
mediaInfo.customData = {
daiStreamType: "DAI_STREAM_TYPE",
networkCode: "NETWORK-CODE",
customAssetKey: "CUSTOM_ASSET_KEY",
apiKey: "API_KEY"
};
// Make load request to cast web receiver
const castSession = cast.framework.CastContext.getInstance().getCurrentSession();
const request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
() => { console.log('Load succeed'); },
(errorCode) => { console.log('Error code: ' + errorCode); });
Android
Per configurare questi valori in un mittente web Cast, crea prima un oggetto MediaInfo con i dati richiesti, quindi effettua una richiesta di caricamento al ricevitore web.
JSONObject customData = new JSONObject()?
.put("daiStreamType", "DAI_STREAM_TYPE")
.put("networkCode", "NETWORK-CODE")
.put("customAssetKey", "CUSTOM_ASSET_KEY")
.put("apiKey", "API_KEY");
MediaInfo mediaInfo = MediaInfo.Builder("CONTENT_ID")
.setContentUrl("BACKUP_STREAM_URL")
.setContentType("CONTENT_STREAM_MIMETYPE")
.setStreamType(MediaInfo.STREAM_TYPE_LIVE)
.setCustomData(customData)
.build();
RemoteMediaClient remoteMediaClient = mCastSession.getRemoteMediaClient();
remoteMediaClient.load(new MediaLoadRequestData.Builder().setMediaInfo(mediaInfo).build());
iOS (Obj-C)
Per configurare questi valori in un mittente web Cast, crea prima un oggetto
GCKMediaInformation
con i dati richiesti, quindi invia una richiesta di
caricamento al web receiver.
NSURL url = [NSURL URLWithString:@"BACKUP_STREAM_URL"];
NSDictionary *customData = @{
@"daiStreamType": @"DAI_STREAM_TYPE",
@"networkCode": @"NETWORK-CODE",
@"customAssetKey": @"CUSTOM_ASSET_KEY",
@"apiKey": @"API_KEY"};
mediaInfoBuilder.customData = customData;
GCKMediaInformationBuilder *mediaInfoBuilder =
[[GCKMediaInformationBuilder alloc] initWithContentID: @"CONTENT_ID"];
mediaInfoBuilder.contentURL = url;
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE";
mediaInfoBuilder.streamType = GCKMediaStreamTypeLive;
mediaInfoBuilder.customData = customData;
self.mediaInformation = [mediaInfoBuilder build];
GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient loadMedia:self.mediaInformation];
if (request != nil) {
request.delegate = self;
}
iOS (Swift)
Per configurare questi valori in un mittente web Cast, crea prima un oggetto
GCKMediaInformation
con i dati richiesti, quindi invia una richiesta di
caricamento al web receiver.
let url = URL.init(string: "BACKUP_STREAM_URL")
guard let mediaURL = url else {
print("invalid mediaURL")
return
}
let customData = [
"daiStreamType": "DAI_STREAM_TYPE",
"networkCode": "NETWORK-CODE",
"customAssetKey": "CUSTOM_ASSET_KEY",
"region": "API_KEY"
]
let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentId: "CONTENT_ID")
mediaInfoBuilder.contentURL = mediaUrl
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE"
mediaInfoBuilder.streamType = GCKMediaStreamType.Live
mediaInfoBuilder.customData = customData
mediaInformation = mediaInfoBuilder.build()
guard let mediaInfo = mediaInformation else {
print("invalid mediaInformation")
return
}
if let request = sessionManager.currentSession?.remoteMediaClient?.loadMedia
(mediaInfo) {
request.delegate = self
}
Strumento CAC
Per configurare questi valori nello strumento di controllo e comando di trasmissione, fai clic sulla scheda Carica contenuti multimediali e imposta il tipo di richiesta di caricamento personalizzata su LOAD. Quindi, sostituisci i dati JSON nell'area di testo con questo JSON:
{
"media": {
"contentId": "CONTENT_ID",
"contentUrl": "BACKUP_STREAM_URL",
"contentType": ""CONTENT_STREAM_MIMETYPE"",
"streamType": "LIVE",
"customData": {
"daiStreamType": "DAI_STREAM_TYPE",
"networkCode": "NETWORK-CODE",
"customAssetKey": "CUSTOM_ASSET_KEY",
"oAuthToken": "API_KEY"
}
}
}
Questa richiesta di caricamento personalizzata può essere inviata al destinatario per testare il resto dei passaggi.
Crea un ricevitore CAF di base
Crea un ricevitore web personalizzato, come descritto nella guida all'SDK CAF Custom Web Receiver.
Il codice del destinatario dovrebbe avere il seguente aspetto:
<html>
<head>
<script
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js">
</script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
// ...
</script>
</body>
</html>
Importa l'SDK IMA DAI e ottieni Player Manager
Aggiungi un tag script per importare l'SDK IMA DAI per CAF nel ricevitore web, subito dopo il caricamento dello script CAF. Nel tag script, memorizza il contesto del ricevitore e il gestore del player come costanti prima di avviare il ricevitore.
<html>
<head>
<script
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
castContext.start();
</script>
</body>
</html>
Inizializzare IMA Stream Manager
Inizializza IMA Stream Manager.
<html>
<head>
<script type="text/javascript"
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
castContext.start();
</script>
</body>
</html>
Crea l'intercettatore di caricamento di Stream Manager
Prima che gli elementi multimediali vengano passati a CAF, crea la richiesta di flusso in un intercettore di messaggi LOAD.
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
/**
* Creates a livestream request object for a Pod Serving stream.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {StreamRequest} an IMA stream request
*/
const createStreamRequest = (castRequest) => { /* ... */};
/**
* Initates a DAI stream request for the final stream manifest.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
*/
const createDAICastRequest = (castRequest) => {
return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
.then((castRequestWithPodStreamData) => {
console.log('Successfully made DAI stream request.');
// ...
return castRequestWithPodStreamData;
})
.catch((error) => {
console.log('Failed to make DAI stream request.');
// CAF will automatically fallback to the content URL
// that it can read from the castRequest object.
return castRequest;
});
};
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, createDAICastRequest);
castContext.start();
Crea la richiesta di stream
Completa la funzione createStreamRequest
per creare uno stream di pubblicazione di pod in base
alla richiesta di caricamento del CAF.
/**
* Creates a livestream request object for a Pod Serving stream.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {StreamRequest} an IMA stream request
*/
const createStreamRequest = (castRequest) => {
const customData = castRequest.media.customData;
let streamRequest;
if (customData.daiStreamType == "LIVE") {
streamRequest = new google.ima.cast.dai.api.PodStreamRequest();
streamRequest.customAssetKey = customData.customAssetKey;
streamRequest.networkCode = customData.networkCode;
streamRequest.apiKey = customData.apiKey;
} else if (customData.daiStreamType == "VOD") {
streamRequest = new google.ima.cast.dai.api.PodVodStreamRequest();
streamRequest.networkCode = customData.networkCode;
streamRequest.apiKey = customData.apiKey;
}
return streamRequest;
};
Recupera il file manifest unito dal tuo VTP
Se la richiesta di stream va a buon fine, utilizza streamManager.getStreamId()
per
recuperare l'ID dello stream. Il tuo partner tecnico per i video (VTP) o il manipolatore di manifest personalizzati
fornirà le istruzioni per recuperare un URL manifest utilizzando questo
ID stream.
Una volta recuperato l'URL del file manifest, sostituisci contentUrl
esistente con il nuovo manifestUrl
.
Infine, prima di restituire il manifest dello stream modificato, chiama il metodo
loadStreamMetadata
sul tuo
streamManager
per comunicare all'SDK IMA che può richiedere in sicurezza i metadati dello stream. Questa chiamata è
necessaria solo per gli stream VOD.
/**
* Initates a DAI stream request for the final stream manifest.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
*/
const createDAICastRequest = (castRequest) => {
return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
.then((castRequestWithPodStreamData) => {
console.log('Successfully made DAI stream request.');
// This is a sample VTP integration. Consult your VTP documentation
// for how to retrieve an ad-stitched stream manifest URL.
const manifestTemplate = "https://.../manifest.m3u8?gam_stream_id=[[STREAMID]]";
const streamId = streamManager.getStreamId();
const manifestUrl = manifestTemplate.replace('[[STREAMID]]', streamId)
// Assign your manifestUrl to the request's content URL.
castRequestWithPodStreamData.media.contentUrl = manifestUrl;
// After generating the manifest URL, VOD streams must notify the
// IMA SDK that it is safe to request ad pod metadata.
// This is only necessary for VOD streams. It is a no-op for
// livestreams, so no conditional is needed.
streamManager.loadStreamMetadata();
return castRequestWithPodStreamData;
})
.catch((error) => {
console.log('Failed to make DAI stream request.');
// CAF will automatically fallback to the content URL
// that it can read from the castRequest object.
return castRequest;
});
};
Pulire gli asset IMA DAI
Una volta completata la richiesta e la visualizzazione degli annunci in uno stream di pubblicazione di pod con l'SDK IMA DAI, ti consigliamo di eliminare tutte le risorse al termine della sessione di pubblicazione di pod. Chiama StreamManager.destroy()
per interrompere la riproduzione dello stream,
interrompere il monitoraggio di tutti gli annunci e rilasciare tutti gli asset dello stream caricati.