Selecione a solução de DAI de seu interesse
Veiculação de conjunto DAI
Os SDKs do IMA simplificam a integração de anúncios multimídia aos seus sites e apps.
Os SDKs do IMA podem solicitar anúncios de qualquer servidor de anúncios compatível com VAST e gerenciar a reprodução de anúncios nos seus apps.
Com os SDKs de DAI do IMA, os apps fazem uma solicitação de transmissão para anúncios e vídeos de conteúdo em VOD ou ao vivo. O SDK retorna uma transmissão de vídeo combinada para que você não precise alternar entre o anúncio e o vídeo de conteúdo no app.
Este guia demonstra como reproduzir um fluxo de veiculação de pods DAI usando o SDK DAI do IMA para CAF.
Antes de usar este guia, familiarize-se com o protocolo do receptor da Web do Chromecast Application Framework. Este guia pressupõe um entendimento básico dos conceitos do receptor do CAF, como interceptors de mensagens e objetos mediaInformation, e familiaridade com o uso da ferramenta de comando e controle do Google Cast para emular um remetente do CAF.
Para usar a Veiculação de conjunto DAI da IMA, você precisa trabalhar com um parceiro de veiculação de conjunto e ter uma conta do Ad Manager 360 Advanced. Se você tiver uma conta do Ad Manager, entre em contato com o gerente de contas para mais detalhes. Para saber como se inscrever no Ad Manager, acesse a Central de Ajuda do Ad Manager.
Para informações sobre a integração com outras plataformas ou o uso dos SDKs do lado do cliente do IMA, consulte SDKs do Interactive Media Ads.
Visão geral da veiculação de conjunto DAI do IMA
A implementação do pod usando o SDK do IMA CAF DAI envolve dois componentes principais, que são demonstrados neste guia:
StreamRequest
: um objeto que define uma solicitação de transmissão para os servidores de publicidade do Google. As solicitações especificam um código de rede, uma chave de recurso personalizada e uma chave de API opcional, bem como outros parâmetros opcionais.StreamManager
: um objeto que processa a comunicação entre o stream de vídeo e o SDK do IMA DAI, como acionar pings de rastreamento e encaminhar eventos de stream para o editor.
Pré-requisitos
- Uma conta do Console para desenvolvedores do Google Cast com dispositivos de teste registrados.
- Um app de receptor da Web hospedado que é registrado no Play Console do Google Cast e pode ser modificado para hospedar o código fornecido neste guia.
- Um app de envio configurado para usar o app de recebimento da Web. Para os fins deste exemplo, use a ferramenta de comando e controle do Cast como remetente.
Configurar os objetos MediaInfo do remetente
Primeiro, configure o
objeto MediaInfo
do app do remetente para incluir os seguintes campos:
Campo | Conteúdo | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
contentId
|
Um identificador exclusivo para este item de mídia.
CONTENT_ID |
||||||||||
contentUrl
|
Opcional. URL de backup da transmissão para exibir caso a transmissão da DAI não carregue.
BACKUP_STREAM_URL |
||||||||||
contentType
|
Opcional. Tipo MIME das transmissões de backup de conteúdo. Necessário apenas para streams
DASH.
CONTENT_STREAM_MIMETYPE |
||||||||||
streamType
|
O literal de string ou a constante usada para esse valor varia de acordo com a plataforma do remetente. | ||||||||||
customData
|
O campo customData contém um armazenamento de chave-valor de outros campos obrigatórios. Neste exemplo, ele contém os parâmetros de transmissão de DAI. Em
um app de produção, você pode transmitir um identificador que o app receptor
de transmissão usaria para recuperar esses parâmetros com uma solicitação
do lado do servidor.
|
Confira alguns exemplos de código para ajudar você a começar:
Web
Para configurar esses valores em um transmissor da Web do Google Cast, primeiro crie um objeto
MediaInfo
com os dados necessários e faça uma solicitação de
carregamento para o receptor da Web.
// 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
Para configurar esses valores em um transmissor da Web do Google Cast, primeiro crie um objeto MediaInfo com os dados necessários e faça uma solicitação de carregamento para o receptor da 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 (Objective-C)
Para configurar esses valores em um transmissor da Web do Google Cast, primeiro crie um objeto
GCKMediaInformation
com os dados necessários e faça uma solicitação de
carregamento para o receptor da Web.
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)
Para configurar esses valores em um transmissor da Web do Google Cast, primeiro crie um objeto
GCKMediaInformation
com os dados necessários e faça uma solicitação de
carregamento para o receptor da Web.
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
}
Ferramenta de CAC
Para configurar esses valores na ferramenta de comando e controle do Google Cast, clique na guia "Carregar mídia" e defina o tipo de solicitação de carregamento personalizado como LOAD. Em seguida, substitua os dados JSON na área de texto por este 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"
}
}
}
Essa solicitação de carga personalizada pode ser enviada ao receptor para testar o restante das etapas.
Criar um receptor CAF básico
Crie um receptor da Web personalizado, conforme mostrado no Guia do receptor da Web personalizado do SDK do CAF.
O código do receptor vai ficar assim:
<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>
Importar o SDK do IMA DAI e acessar o Player Manager
Adicione uma tag de script para importar o SDK do DAI do IMA para CAF ao seu receptor da Web, logo após o script carregar o CAF. Na tag de script, armazene o contexto do receptor e o gerenciador de player como constantes antes de iniciar o receptor.
<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>
Inicializar o gerenciador de stream do IMA
Inicialize o Stream Manager do IMA.
<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>
Criar o Stream Manager Load Interceptor
Antes que seus itens de mídia sejam transmitidos ao CAF, crie sua solicitação de transmissão em um interceptador de mensagens 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();
Criar a solicitação de streaming
Conclua a função createStreamRequest
para criar um stream de veiculação de pods com base
na solicitação de carga do 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;
};
Extrair o manifesto costurado do VTP
Se a solicitação de transmissão for bem-sucedida, use streamManager.getStreamId()
para
extrair o ID da transmissão. Seu parceiro técnico de vídeo (VTP, na sigla em inglês) ou manipulador de
manifesto personalizado vai fornecer instruções para recuperar um URL de manifesto usando esse
ID de stream.
Depois de extrair o URL do manifesto, substitua o contentUrl
atual pelo novo manifestUrl
.
Por fim, antes de retornar o manifesto de transmissão modificado, chame o método
loadStreamMetadata
no
streamManager
para informar ao SDK do IMA que ele pode solicitar metadados de transmissão com segurança. Essa chamada é
necessária apenas para transmissões 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;
});
};
Limpar recursos da DAI do IMA
Quando você terminar de solicitar e exibir anúncios em um fluxo de veiculação de pods
com o SDK DAI do IMA, sugerimos que limpe todos os recursos depois que a
sessão de veiculação de pods for concluída. Chame StreamManager.destroy()
para interromper a reprodução
do stream, parar todo o rastreamento de anúncios e liberar todos os recursos de stream carregados.