Préchargement de contenus multimédias

Le SDK IMA permet de précharger des composants d'annonces vidéo. Vous pouvez activer cette fonctionnalité dans votre intégration de SDK pour assurer une transition plus fluide entre les annonces et le contenu. Ce guide présente les détails techniques de l'implémentation du préchargement multimédia avec le SDK IMA.

Conditions préalables

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

Activer le préchargement

Pour activer le préchargement, utilisez AdsRenderingSettings.setEnablePreloading() pour définir le préchargement sur "true". 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 l'extension ExoPlayer-IMA utilisée dans l'application exemple Android ExoPlayer. Lorsqu'elle est intégrée, l'extension ExoPlayer-IMA active le préchargement par défaut et inclut une prise en charge intégrée du préchargement.

Si vous implémentez le préchargement sans l'extension ExoPlayer-IMA, des modifications supplémentaires sont requises une fois setEnablePreloading() appelé. Pour qu'un lecteur vidéo prenne en charge le préchargement des annonces, il doit suivre les 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 un AdMediaInfo ultérieur peut se produire pendant la lecture d'un AdMediaInfo précédent. L'exemple suivant illustre certaines des modifications que vous devrez peut-être apporter pour que votre application prenne en charge 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 pre-roll unique
  • Pre-roll de série d'annonces de trois annonces
  • Série d'annonces mid-roll de trois annonces
  • Recherche d'une deuxième annonce midroll après le début du préchargement de la première annonce midroll, mais avant sa lecture
  • Lecture post-roll

Durée

Le tableau suivant récapitule les modifications apportées au calendrier de chargement des annonces lorsque le préchargement est activé:

Événement Avec préchargement Sans préchargement
VAST de l'annonce demandé AdsLoader.requestAds() AdsLoader.requestAds()
Annonce pré-roll chargée (annonce unique) AdsManager.init() AdsManager.start()
Annonce pré-roll chargée (VMAP/Règles relatives aux annonces) AdsManager.init() AdsManager.init()
Annonce mid-roll ou post-roll chargée Pour la première annonce d'une coupure publicitaire, huit secondes avant l'heure de début de l'annonce. Pour les annonces consécutives, lorsque l'annonce précédente commence à être diffusée. Au début de l'annonce.

Questions fréquentes

Le préchargement de fichiers multimédias charge-t-il la création complète ?
Non, la création n'est généralement pas entièrement chargée lorsque la lecture de l'annonce commence. Le préchargement vise à améliorer l'expérience utilisateur en réduisant le temps de chargement de l'annonce. Il n'est pas conçu pour la diffusion d'annonces hors connexion.
Le préchargement de contenu multimédia doit-il être activé pour le VAST et les contenus multimédias de l'annonce ?
Non, le SDK précharge toujours le VAST de l'annonce, quel que soit ce paramètre de préchargement.