Reproduzir transmissões de VOD registradas com a API Video Stitcher do Google Cloud
Este guia demonstra como usar o SDK DAI do IMA para receptores da Web do CAF para solicitar e reproduzir uma sessão de streaming de VOD do Google Cloud.
Este guia amplia o exemplo básico da DAI de serviço completo, adicionando suporte para streams registrados com a API Google Cloud Video Stitcher.
Antes de continuar, verifique se o formato de streaming é compatível com os receptores da Web do CAF.
Para informações sobre como integrar a outras plataformas ou usar os SDKs do IMA do lado do cliente, consulte SDKs do Interactive Media Ads.
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 receptor do CAF,
como interceptores de
mensagens,
objetos MediaInformation
e o uso da ferramenta de comando e controle do Cast para emular um remetente do CAF.
Componentes e arquitetura do app
A implementação da reprodução de stream VOD com a API Google Cloud Video Stitcher e o SDK do IMA CAF DAI envolve dois componentes principais, conforme demonstrado neste guia:
VideoStitcherVodStreamRequest: um objeto que define uma solicitação de transmissão para os servidores do Google.StreamManager: um objeto que processa a comunicação entre o stream de vídeo e o SDK DAI do IMA, como o disparo de pings de rastreamento e o encaminhamento de eventos de stream para o publisher.
Configure um projeto do Google Cloud
Insira as seguintes variáveis para uso no SDK do IMA:
Local: a região do Google Cloud em que sua configuração de VOD foi criada.
LOCATIONNúmero do projeto: o número do projeto na nuvem do Google Cloud usando a API Video Stitcher.
PROJECT_NUMBERToken do OAuth: um token do OAuth de curta duração de uma conta de serviço com a função de usuário do Video Stitcher. Saiba mais sobre como criar credenciais de curta duração para contas de serviço.
OAUTH_TOKENCódigo de rede: código de rede do Google Ad Manager para solicitar anúncios.
NETWORK_CODEID da configuração de VOD: o ID da configuração de VOD para a transmissão de VOD.
VOD_CONFIG_IDLeia mais sobre como criar o ID de configuração de VOD no guia de criação de uma configuração de VOD de junção na nuvem.
VOD_URI
Configurar um receptor de transmissão personalizado
Para desenvolver um receptor de transmissão personalizado, você precisa do seguinte:
Uma conta do Cast Developer Console com dispositivos de teste em uma lista de permissões.
Um aplicativo receptor da Web hospedado que está registrado no seu Cast Developer Console e pode ser modificado para hospedar o código fornecido neste guia.
Um app de envio configurado para usar seu app web receiver. Para este exemplo, este guia usa a ferramenta de comando e controle do Cast como remetente.
Prepare um remetente para transmitir dados ao destinatário
Primeiro, configure o app remetente para fazer uma solicitação de carregamento ao receptor da Web,
contendo os seguintes campos no objeto
MediaInformation
da plataforma.
| Campo | Índice | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
contentId
|
Um identificador exclusivo para este item de mídia, conforme definido na documentação de referência do Cast. Ele não pode ser reutilizado para vários itens na mesma fila de mídia.
|
||||||||||||
contentUrl
|
URL opcional da transmissão de backup a ser reproduzido se a transmissão da DAI não carregar.
|
||||||||||||
contentType
|
MIME type opcional do URL da transmissão de backup a ser reproduzido se a transmissão da DAI não carregar.
|
||||||||||||
streamType
|
O literal de string ou a constante usada para esse valor varia de acordo com a plataforma
do remetente.
|
||||||||||||
customData
|
O campo
|
Confira alguns exemplos de código para ajudar você a começar:
Web
Para configurar esses valores em um remetente da Web do 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 = "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 esses valores em um remetente da Web do 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("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 esses valores em um remetente da Web do 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 = @{
@"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 esses valores em um remetente da Web do 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 = [
"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 de CAC
Para configurar esses valores na ferramenta de comando e controle do 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": "BACKUP_STREAM_MIMETYPE",
"streamType": "VOD",
"customData": {
"region": "LOCATION",
"projectNumber": "PROJECT_NUMBER",
"oAuthToken": "OAUTH_TOKEN",
"networkCode": "NETWORK_CODE",
"vodConfigId": "VOD_CONFIG_ID"
}
}
}
Essa solicitação de carga personalizada pode ser enviada ao receptor para testar o restante das etapas.
Criar um receptor da Web do CAF personalizado
Crie um receptor da Web personalizado, conforme mostrado no Guia do receptor da Web personalizado do SDK 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>
const castContext = cast.framework.CastReceiverContext.getInstance()
castContext.start();
</script>
</body>
</html>
Importar o SDK de DAI do IMA e receber o gerenciador de players
Adicione uma tag script para importar o SDK do IMA DAI para CAF ao seu receptor da Web, logo após o script carregar o CAF. Em seguida, na tag script a seguir, 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 Stream Manager da IMA
Inicialize o 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>
Criar o interceptor de carga do Stream Manager
Antes que seus itens de mídia sejam transmitidos para o CAF, crie a solicitação de stream 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 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();
Criar a solicitação de stream
Conclua a função createStreamRequest para criar uma solicitação de stream VOD da API Video Stitcher com base na solicitação de carregamento do 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) Adicionar opções de sessão de streaming
Personalize sua solicitação de stream adicionando opções de sessão para substituir a configuração padrão da
API Cloud Video Stitcher usando
VideoStitcherVodStreamRequest.videoStitcherSessionOptions.
Se você fornecer uma opção não reconhecida, a API Cloud Video Stitcher vai responder com um erro HTTP 400. Consulte o
guia de solução de problemas
para receber ajuda.
Por exemplo, é possível substituir as opções de manifesto com o snippet de código a seguir, que solicita dois manifestos de stream com renderizações ordenadas do menor para o maior bitrate.
...
// The following session options are examples. Use session options
// that are compatible with your video stream.
streamRequest.videoStitcherSessionOptions = {
"manifestOptions": {
"bitrateOrder": "ascending"
}
};
streamManager.requestStream(streamRequest);