O SDK do IMA é compatível com o pré-carregamento de recursos de anúncios em vídeo. É possível ativar esse recurso na integração do SDK para oferecer uma transição mais fluida entre anúncios e conteúdo. Este guia aborda os detalhes técnicos da implementação do pré-carregamento de mídia com o SDK do IMA.
Pré-requisito
O pré-carregamento exige a versão 3.17.0 ou mais recente do SDK do IMA para Android.
Ativar o pré-carregamento
Para ativar o pré-carregamento, useAdsRenderingSettings.setEnablePreloading()
para definir o pré-carregamento como "true". Isso precisa ser feito no callback onAdsManagerLoaded()
:
@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
...
AdsRenderingSettings adsRenderingSettings =
ImaSdkFactory.getInstance().createAdsRenderingSettings();
adsRenderingSettings.setEnablePreloading(true);
mAdsManager.init(adsRenderingSettings);
}
Suporte ao pré-carregamento com um VideoAdPlayer personalizado
Recomendamos a extensão ExoPlayer-IMA usada no app de exemplo do ExoPlayer para Android. Quando integrada, a extensão ExoPlayer-IMA tem o pré-carregamento ativado por padrão e inclui suporte integrado para pré-carregamento.
Se você estiver implementando o pré-carregamento sem a extensão ExoPlayer-IMA,
serão necessárias outras mudanças depois que setEnablePreloading()
for chamado. Para que um player de vídeo seja compatível com o pré-carregamento de anúncios, ele precisa rastrear os objetos AdMediaInfo
transmitidos em chamadas de loadAd()
e playAd()
e incluir o AdMediaInfo
correto nas chamadas AdPlayerCallback
. Isso pode
exigir uma estrutura de dados para gerenciar objetos AdMediaInfo
, já que loadAd()
para um AdMediaInfo
subsequente pode ocorrer enquanto um AdMediaInfo
anterior está
sendo reproduzido. O exemplo a seguir demonstra algumas das mudanças
que você pode precisar fazer para que seu app ofereça suporte ao pré-carregamento:
// enum for cases of PlayerState.
static enum PlayerState {
IDLE,
LOADED,
PLAYING,
PAUSED,
}
...
private final List<VideoAdPlayer.VideoAdPlayerCallback> callbacks;
private final ArrayList<AdMediaInfo> mediaInfos = new ArrayList<>();
private PlayerState playerState;
private boolean adCurrentlyLoaded;
...
@Override
public void playAd(AdMediaInfo adMediaInfo) {
switch (playerState) {
case LOADED:
for (VideoAdPlayerCallback callback : callbacks) {
callback.onPlay(adMediaInfo);
}
break;
case PAUSED:
for (VideoAdPlayerCallback callback : callbacks) {
callback.onResume(adMediaInfo);
}
break;
case PLAYING:
// Intentionally and silently ignore since it is already playing from a prior media item,
// note that onPlay is triggered by positionDiscontinuity.
return;
case IDLE:
throw new IllegalStateException("Call to playAd when player state is not LOADED.");
}
playerState = PlayerState.PLAYING;
player.setPlayWhenReady(true);
}
@Override
public void loadAd(AdMediaInfo adMediaInfo, AdPodInfo adPodInfo) {
if (adCurrentlyLoaded == true) {
mediaInfos.add(adMediaInfo);
return;
}
player.stop();
player.seekTo(0);
mediaInfos.clear();
mediaInfos.add(adMediaInfo);
player.setPlayWhenReady(false);
player.loadMedia(adMediaInfo.getUrl());
playerState = PlayerState.LOADED;
adCurrentlyLoaded = true;
}
@Override
public void stopAd(AdMediaInfo adMediaInfo) {
if (allAdsInBreakHavePlayed()) {
if (isFinalAd(adMediaInfo)) {
// handle clean up after all ads have played.
} else {
seekToNextItem(player);
}
} else {
mediaInfos.remove(adMediaInfo);
}
}
private boolean allAdsInBreakHavePlayed() {
// Code to determine if all the ads in the current ad break have completed.
}
private boolean isFinalAd(AdMediaInfo adMediaInfo) {
// Code to determine if this adMediaInfo is the final ad.
}
private void seekToNextItem(YourPlayerClass player) {
// Code to seek your player to the next media item.
}
Testar implementações de pré-carregamento personalizadas
Para implementações personalizadas de pré-carregamento, é recomendável testar os seguintes casos extremos para verificar uma configuração correta:
- Pré-vídeo de um único anúncio
- Pré-vídeo de um conjunto de três anúncios
- 3 anúncios intermediários
- Buscar um segundo anúncio intermediário depois que o primeiro começou a pré-carregar, mas antes de ser veiculado
- Reprodução de anúncios finais
Tempo
A tabela a seguir resume as mudanças no tempo de carga de anúncios quando o pré-carregamento está ativado:
Evento | Com pré-carga | Sem pré-carregamento |
---|---|---|
VAST de anúncio solicitado | AdsLoader.requestAds() |
AdsLoader.requestAds() |
Anúncio precedente carregado (único anúncio) | AdsManager.init() |
AdsManager.start() |
Pré-roll carregado (VMAP/regras de anúncio) | AdsManager.init() |
AdsManager.init() |
Anúncio intermediário ou final carregado | Para o primeiro anúncio em um intervalo, 8 segundos antes do horário de início do anúncio. Para anúncios consecutivos, quando o anúncio anterior começa a ser veiculado. | No horário de início do anúncio. |
Perguntas frequentes
- O pré-carregamento de mídia carrega o criativo completo?
- Não, o criativo geralmente não é totalmente carregado quando a reprodução do anúncio começa. A pré-carga tem como objetivo melhorar a experiência do usuário, minimizando o tempo necessário para o carregamento do anúncio. Ele não foi criado para oferecer suporte à veiculação de anúncios off-line.
- O pré-carregamento de mídia precisa ser ativado para o VAST do anúncio e para a mídia?
- Não, o SDK sempre pré-carrega o VAST do anúncio, independente dessa configuração de pré-carga.