Streams de VOD do Play registadas na API Google Cloud Video Stitcher
Este guia demonstra como usar o SDK IMA DAI para recetores Web CAF para pedir e reproduzir uma sessão de stream VOD do Google Cloud.
Este guia expande o exemplo básico da DAI de serviço completo, adicionando suporte para streams registadas na API Google Cloud Video Stitcher.
Certifique-se de que o formato de streaming é suportado pelos recetores Web do CAF antes de continuar.
Para obter informações sobre a integração com outras plataformas ou sobre a utilização dos SDKs do lado do cliente para IMA, consulte os SDKs para Anúncios Multimédia Interativos.
Contexto
Antes de usar este guia, familiarize-se com o protocolo Web Receiver do Chromecast Application Framework.
Este guia pressupõe um nível básico de familiaridade com os conceitos do recetor do CAF, como intercetores de mensagens, objetos MediaInformation
e a utilização da ferramenta de comando e controlo do Cast para emular um remetente do CAF.
Componentes e arquitetura da app
A implementação da reprodução de streams de VOD com a API Google Cloud Video Stitcher com o SDK para DAI do CAF do IMA envolve dois componentes principais, conforme demonstrado neste guia:
VideoStitcherVodStreamRequest
: Um objeto que define um pedido de stream para os servidores da Google.StreamManager
: Um objeto que processa a comunicação entre a stream de vídeo e o SDK para DAI do IMA, como o envio de pings de acompanhamento e o encaminhamento de eventos de stream para o publicador.
Configure um projeto do Google Cloud
Introduza as seguintes variáveis para utilização no SDK para IMA:
Localização: a região do Google Cloud onde a configuração de VOD foi criada.
LOCATION
Número do projeto: o número do projeto do Google Cloud que usa a API Video Stitcher.
PROJECT_NUMBER
Token OAuth: o token OAuth de curta duração de uma conta de serviço com a função de utilizador do Video Stitcher. Leia mais sobre como criar credenciais de curta duração para contas de serviço.
OAUTH_TOKEN
Network Code: código de rede do Google Ad Manager para pedir anúncios.
NETWORK_CODE
ID da configuração de VOD: o ID da configuração de VOD para a stream VOD.
VOD_CONFIG_ID
Leia mais acerca da criação do ID de configuração de VOD no guia de criação de configuração de VOD da união na nuvem.
VOD_URI
Configure um recetor de transmissão personalizado
Para desenvolver um recetor de transmissão personalizado, precisa do seguinte:
Uma conta da Cast Developer Console com dispositivos de teste numa lista de autorizações.
Uma app Web Receiver alojada que esteja registada na sua Cast Developer Console e que possa ser modificada para alojar o código fornecido por este guia.
Uma app de envio configurada para usar a sua app de receção Web. Para efeitos deste exemplo, este guia usa a ferramenta de comando e controlo do Cast como remetente.
Prepare um remetente para transmitir dados de stream ao recetor
Primeiro, configure a sua app remetente para fazer um pedido de carregamento ao seu recetor Web,
com os seguintes campos no objeto MediaInformation
da sua plataforma.
Campo | Índice | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
contentId
|
Um identificador exclusivo deste item multimédia, conforme definido na documentação de referência do Cast. Este ID não deve ser reutilizado para vários itens na mesma fila de multimédia.
|
||||||||||||
contentUrl
|
URL da stream de segurança opcional para reproduzir se a stream de DAI não for carregada.
|
||||||||||||
contentType
|
Tipo MIME opcional do URL da stream de segurança a ser reproduzido se a stream de DAI não for carregada.
|
||||||||||||
streamType
|
A string literal ou a constante usada para este valor varia consoante a plataforma do remetente.
|
||||||||||||
customData
|
O campo
|
Seguem-se alguns exemplos de código para ajudar a começar:
Web
Para configurar estes valores num remetente Web do Cast, primeiro crie um objeto MediaInfo
com os dados necessários e, em seguida, faça um pedido load ao recetor Web.
// Create mediaInfo object
const mediaInfo = new chrome.cast.media.MediaInfo("CONTENT_ID");
mediaInfo.contentUrl = "BACKUP_STREAM_URL";
mediaInfo.contentType = "BACKUP_STREAM_MIMETYPE";
mediaInfo.streamType = chrome.cast.media.StreamType.VOD;
mediaInfo.customData = {
region: "LOCATION",
projectNumber: "PROJECT_NUMBER",
oAuthToken: "OAUTH_TOKEN",
networkCode: "NETWORK_CODE",
vodConfigId: "VOD_CONFIG_ID"
};
// 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 estes valores num remetente Web do Cast, primeiro crie um objeto MediaInfo
com os dados necessários e, em seguida, faça um pedido load ao recetor Web.
JSONObject customData = new JSONObject()
.put("region", "LOCATION")
.put("projectNumber", "PROJECT_NUMBER")
.put("oAuthToken", "OAUTH_TOKEN")
.put("networkCode", "NETWORK_CODE")
.put("vodConfigId", "VOD_CONFIG_ID");
MediaInfo mediaInfo = MediaInfo.Builder("CONTENT_ID")
.setContentUrl("BACKUP_STREAM_URL")
.setContentType("BACKUP_STREAM_MIMETYPE")
.setStreamType(MediaInfo.STREAM_TYPE_VOD)
.setCustomData(customData)
.build();
RemoteMediaClient remoteMediaClient = mCastSession.getRemoteMediaClient();
remoteMediaClient.load(new MediaLoadRequestData.Builder().setMediaInfo(mediaInfo).build());
iOS (Obj-C)
Para configurar estes valores num remetente Web do Cast, primeiro crie um objeto GCKMediaInformation
com os dados necessários e, em seguida, faça um pedido load ao recetor Web.
NSURL url = [NSURL URLWithString:@"BACKUP_STREAM_URL"];
NSDictionary *customData = @{
@"region": @"LOCATION",
@"projectNumber": @"PROJECT_NUMBER",
@"oAuthToken": @"OAUTH_TOKEN",
@"networkCode": @"NETWORK_CODE",
@"vodConfigId": @"VOD_CONFIG_ID"
};
GCKMediaInformationBuilder *mediaInfoBuilder =
[[GCKMediaInformationBuilder alloc] initWithContentID: @"CONTENT_ID"];
mediaInfoBuilder.contentURL = url;
mediaInfoBuilder.contentType = @"BACKUP_STREAM_MIMETYPE";
mediaInfoBuilder.streamType = GCKMediaStreamTypeNone;
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 estes valores num remetente Web do Cast, primeiro crie um objeto GCKMediaInformation
com os dados necessários e, em seguida, faça um pedido load ao recetor Web.
let url = URL.init(string: "BACKUP_STREAM_URL")
guard let mediaURL = url else {
print("invalid mediaURL")
return
}
let customData = [
"region": "LOCATION",
"projectNumber": "PROJECT_NUMBER",
"oAuthToken": "OAUTH_TOKEN",
"networkCode": "NETWORK_CODE",
"vodConfigId": "VOD_CONFIG_ID"
]
let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentId: "CONTENT_ID")
mediaInfoBuilder.contentURL = mediaUrl
mediaInfoBuilder.contentType = "BACKUP_STREAM_MIMETYPE"
mediaInfoBuilder.streamType = GCKMediaStreamType.none
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 CAC
Para configurar estes valores na ferramenta de comando e controlo do Cast, clique no separador Carregar conteúdo multimédia e defina o tipo de pedido 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": "BACKUP_STREAM_MIMETYPE",
"streamType": "VOD",
"customData": {
"region": "LOCATION",
"projectNumber": "PROJECT_NUMBER",
"oAuthToken": "OAUTH_TOKEN",
"networkCode": "NETWORK_CODE",
"vodConfigId": "VOD_CONFIG_ID"
}
}
}
Este pedido de carregamento personalizado pode ser enviado para o recetor para testar os restantes passos.
Crie um recetor Web CAF personalizado
Crie um recetor Web personalizado, conforme descrito no guia do recetor Web personalizado do SDK CAF.
O código do recetor deve ter o seguinte aspeto:
<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>
const castContext = cast.framework.CastReceiverContext.getInstance()
castContext.start();
</script>
</body>
</html>
Importe o SDK IMA DAI e obtenha o gestor do leitor
Adicione uma etiqueta de script para importar o SDK IMA DAI para CAF para o seu recetor Web, imediatamente após o script de carregamento do CAF. Em seguida, na etiqueta de script que se segue, armazene o contexto do recetor e o gestor do leitor como constantes antes de iniciar o recetor.
<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>
Inicialize o gestor de streams do IMA
Inicialize o gestor de streams 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>
Crie o interceptor de carregamento do Gestor de streams
Antes de os itens multimédia serem transmitidos para o CAF, crie o pedido de stream num intercetor de mensagens LOAD.
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
/**
* Creates a VOD stream request object for the Video Stitcher API.
* @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((castRequestWithStreamData) => {
console.log('Successfully made DAI stream request.');
return castRequestWithStreamData;
})
.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();
Crie o pedido de stream
Conclua a função createStreamRequest
para criar um pedido de stream de VOD da API Video Stitcher com base no pedido de carregamento da CAF.
/**
* Creates a VOD stream request object for the Video Stitcher API.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {StreamRequest} an IMA stream request
*/
const createStreamRequest = (castRequest) => {
const streamRequest = new google.ima.cast.dai.api.VideoStitcherVodStreamRequest();
const customData = castRequest.media.customData;
streamRequest.region = customData.region;
streamRequest.projectNumber = customData.projectNumber;
streamRequest.oAuthToken = customData.oAuthToken;
streamRequest.networkCode = customData.networkCode;
streamRequest.vodConfigId = customData.vodConfigId;
streamRequest.videoStitcherSessionOptions = {};
return streamRequest;
};
(Opcional) Adicione opções de sessão de streaming
Personalize o seu pedido de stream adicionando opções de sessão para substituir a configuração predefinida da API Cloud Video Stitcher através de
VideoStitcherVodStreamRequest.videoStitcherSessionOptions
.
Se fornecer uma opção não reconhecida, a API Cloud Video Stitcher responde com um erro HTTP 400. Consulte o
guia de resolução de problemas
para obter assistência.
Por exemplo, pode substituir as opções do manifesto com o seguinte fragmento do código, que pede dois manifestos de streams com representações ordenadas da taxa de bits mais baixa para a mais alta.
...
// The following session options are examples. Use session options
// that are compatible with your video stream.
streamRequest.videoStitcherSessionOptions = {
"manifestOptions": {
"bitrateOrder": "ascending"
}
};
streamManager.requestStream(streamRequest);