Préchargement de contenus multimédias

Le SDK IMA est compatible avec le préchargement d'éléments d'annonces vidéo. Vous pouvez activer cette fonctionnalité dans l'intégration de votre SDK afin de faciliter la transition entre les annonces et le contenu. Ce guide passe en revue les détails techniques de la mise en œuvre du préchargement multimédia avec le SDK IMA.

Prérequis

Le préchargement nécessite la version 3.17.0 ou ultérieure du SDK IMA pour Android.

Activer le préchargement

Pour activer le préchargement, définissez le préchargement sur "true" à l'aide de AdsRenderingSettings.setEnablePreloading(). Cette opération doit être effectuée dans le rappel onAdsManagerLoaded():

@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
  ...
  AdsRenderingSettings adsRenderingSettings =
      ImaSdkFactory.getInstance().createAdsRenderingSettings();
  adsRenderingSettings.setEnablePreloading(true);
  mAdsManager.init(adsRenderingSettings);
}

Prise en charge du préchargement avec un VideoAdPlayer personnalisé

Nous vous recommandons d'utiliser l'extension ExoPlayer-IMA utilisée dans l'application Android BasicExample. Lorsqu'elle est intégrée, le préchargement est activé par défaut pour l'extension ExoPlayer-IMA et inclut une compatibilité intégrée.

Si vous implémentez le préchargement sans l'extension ExoPlayer-IMA, des modifications supplémentaires sont nécessaires une fois setEnablePreloading() appelé. Pour qu'un lecteur vidéo soit compatible avec le préchargement des annonces, il doit effectuer le suivi des objets AdMediaInfo transmis dans les appels de loadAd() et playAd(), et inclure le AdMediaInfo approprié dans les appels AdPlayerCallback. Cela peut nécessiter une structure de données pour gérer les objets AdMediaInfo, étant donné que loadAd() pour une AdMediaInfo ultérieure peut se produire alors qu'une AdMediaInfo précédente est en cours de lecture. L'exemple suivant illustre certaines des modifications que vous devrez peut-être apporter à votre application pour qu'elle accepte le préchargement:

// 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.
}

Tester les implémentations de préchargement personnalisées

Pour les implémentations de préchargement personnalisées, il est recommandé de tester les cas particuliers suivants afin de vérifier une configuration de préchargement correcte:

  • Annonce pré-roll d'une seule annonce
  • Pré-roll de trois séries d'annonces
  • 3 séries d'annonces mid-roll
  • Recherche d'un deuxième mid-roll après le début du préchargement de la première annonce mid-roll, mais avant la lecture
  • Lecture des annonces vidéo post-roll

Délai

Le tableau suivant récapitule les modifications apportées à la durée de chargement de l'annonce lorsque le préchargement est activé:

Événement Avec préchargement Sans préchargement
Annonce VAST demandée AdsLoader.requestAds() AdsLoader.requestAds()
Annonce vidéo pré-roll chargée (une seule annonce) AdsManager.init() AdsManager.start()
Annonce vidéo pré-roll chargée (règles VMAP et relatives aux annonces) AdsManager.init() AdsManager.init()
Annonce vidéo mid-roll ou post-roll chargée Pour la première annonce d'une coupure publicitaire, huit secondes avant le début de l'annonce. Pour les annonces consécutives, lorsque la lecture de l'annonce précédente commence. À l'heure de début de l'annonce.

Questions fréquentes

Le préchargement multimédia charge-t-il l'intégralité de la création ?
Non, la création n'est généralement pas entièrement chargée au début de la lecture de l'annonce. Le préchargement vise à améliorer l'expérience utilisateur en réduisant au maximum le temps de chargement de l'annonce. Elle n'est pas destinée à prendre en charge la diffusion d'annonces hors connexion.
Le préchargement multimédia doit-il être activé pour le format VAST de l'annonce, ainsi que pour les contenus multimédias ?
Non, le SDK précharge toujours le format VAST de l'annonce, quel que soit le paramètre de préchargement.