Snapback

En tant qu'éditeur de vidéos, vous souhaitez peut-être empêcher les internautes de rechercher vos annonces mid-roll. Lorsqu'un utilisateur recherche après une coupure publicitaire, vous pouvez le ramener au début de celle-ci, puis le renvoyer à son emplacement de recherche une fois la coupure publicitaire terminée. Cette fonctionnalité s'appelle "snapback".

À titre d'exemple, consultez le schéma ci-dessous. Lorsqu'un spectateur regarde une vidéo, il décide de s'étendre sur une période allant de 5 minutes à 15 minutes. En revanche, vous souhaitez qu'ils regardent une coupure publicitaire au bout de 10 minutes avant de pouvoir regarder le contenu suivant:

Pour diffuser cette coupure publicitaire, procédez comme suit:

  1. Vérifiez si l'utilisateur a exécuté une recherche qui a dépassé une coupure publicitaire non visionnée et, le cas échéant, renvoyez-le à la coupure.
  2. Une fois la coupure publicitaire terminée, rétablissez la recherche d'origine.

Sous forme de diagramme, cela ressemble à ceci:

Voici comment implémenter ce workflow dans le SDK IMA pour Android, comme indiqué dans la section AdvancedExample.

Empêcher une recherche de laisser une coupure publicitaire non visionnée

Vérifiez si l'utilisateur a effectué une recherche après une coupure publicitaire non visionnée et, le cas échéant, redirigez-le vers la coupure. Dans le SDK Android, utilisez l'objet PlayerControl pour détecter la recherche. Lorsque l'utilisateur effectue une recherche, déclenchez la méthode onSeek() de l'SampleHlsVideoPlayerCallback implémentée par SampleAdsWrapper. Cette méthode (présentée ci-dessous) vérifie le point de repère avant le temps de recherche de l'utilisateur. S'il n'est pas lu, recherchez le début de cette coupure publicitaire plutôt que le point de recherche initial souhaité, puis enregistrez ce point de recherche souhaité dans snapBackTime.

@Override
public void onSeek(int timeMillis) {
  double timeToSeek = timeMillis;
  if (streamManager != null) {
    CuePoint cuePoint =
        streamManager.getPreviousCuePointForStreamTime(timeMillis / 1000);
    if (cuePoint != null && !cuePoint.isPlayed()) {
      snapBackTime = timeToSeek / 1000.0; // Update snapback time.
      // Missed cue point, so snap back to the beginning of cue point.
      timeToSeek = cuePoint.getStartTime() * 1000;
      videoPlayer.seek(Math.round(timeToSeek));
      videoPlayer.setCanSeek(false);
      return;
    }
  }
  videoPlayer.seek(Math.round(timeToSeek));
}

Revenir à la recherche initiale de l'utilisateur

À présent, lorsque vous obtenez un événement onAdBreakEnded, vérifiez si snapBackTime est défini. Si tel est le cas, redirigez l'utilisateur vers ce point du flux, car la coupure publicitaire qu'il vient de regarder est le résultat d'un retour rapide:

@Override
public void onAdBreakEnded() {
  // Re-enable player controls.
  videoPlayer.setCanSeek(true);
  videoPlayer.enableControls(true);
  if (snapBackTime > 0) {
    videoPlayer.seek(Math.round(snapBackTime * 1000));
  }
  snapBackTime = 0;
}