Inserimento di interruzioni pubblicitarie parziali

È possibile abilitare un'esperienza simile a quella televisiva di essere in grado di partecipare nel mezzo di un annuncio, in flussi live.

La funzione di interruzione pubblicitaria parziale consente di imitare un’esperienza simile a quella televisiva in cui, se il cliente avvia un flusso live all’interno di un flusso multimediale, questo verrà avviato all’interno di tale proxy. È simile al passaggio a un canale televisivo e gli spot vengono eseguiti senza problemi.

Ad esempio, se un utente si unisce nel mezzo di un’interruzione pubblicitaria di 90 secondi (tre annunci di 30 secondi), a 10 secondi dalla seconda inserzione (cioè a 40 secondi dall’interruzione pubblicitaria), si verifica quanto segue:

  • Il secondo annuncio viene riprodotto per la durata rimanente (20 sec) seguita dal terzo annuncio.
  • I tracciatori di annunci per l’annuncio parzialmente riprodotto (il secondo annuncio) non vengono attivati. Viene attivato solo il tracker per il terzo annuncio.

Questo comportamento non è abilitato per impostazione predefinita. Per abilitare questa funzione nell’app, procedi come segue.

  1. Disattiva i record live utilizzando il metodo setEnableLivePreroll della classe AdvertisingMetadata.

    advertisingMetadata.setEnableLivePreroll(String.valueOf(false))
    
  2. Attiva la preferenza per l’inserimento di interruzioni pubblicitarie parziali. Utilizza il nuovo metodo setPartialAdBreakPref nell'interfaccia MediaPlayer per attivare questa funzione. Utilizzare il metodo getPartialAdBreakPref per trovare lo stato corrente di questa preferenza.

    MediaPlayer mediaPlayer = DefaultMediaPlayer.create(getActivity().getApplicationContext());
    
           mediaPlayer.setPartialAdBreakPref(true);
    
  3. Questa funzione richiede l’implementazione di un selettore di criteri per gli annunci personalizzato per personalizzare il comportamento. Se non disponi già di un'implementazione personalizzata della classe AdvertisingFactory , aggiungi una nuova implementazione AdvertisingFactory . Ignorare il metodo createAdPolicySelector . Questo metodo restituisce una nuova istanza dell'implementazione di AdPolicySelector.

    Di seguito è riportato un esempio di implementazione per riferimento. Il seguente esempio di implementazione è disponibile per l'utilizzo dal pacchetto com.adobe.mediacore . Tuttavia, è semplificato per un riferimento semplice e non è consigliato utilizzarlo così com’è.

    1. Selettore dei criteri degli annunci di esempio

       package com.adobe.mediacore;
      
      import com.adobe.mediacore.logging.Log;
      import com.adobe.mediacore.logging.Logger;
      import com.adobe.mediacore.metadata.*;
      import com.adobe.mediacore.timeline.advertising.*;
      
      import java.util.ArrayList;
      import java.util.List;
      
      public class PartialAdBreakAdPolicySelector implements AdPolicySelector {
          private static final String LOG_TAG = "[PSDK]::" + DefaultAdPolicySelector.class.getSimpleName();
          private final Logger _logger = Log.getLogger(LOG_TAG);
      
          private final MediaPlayerItem _mediaPlayerItem;
          private final AdBreakAsWatched _adBreakAsWatchedPolicy;
      
          public PartialAdBreakAdPolicySelector(MediaPlayerItem mediaPlayerItem) {
              _mediaPlayerItem = mediaPlayerItem;
              _adBreakAsWatchedPolicy = extractAdBreakAsWatchedPolicy(_mediaPlayerItem);
          }
      
          @Override
          public AdBreakPolicy selectPolicyForAdBreak(AdPolicyInfo adPolicyInfo) {
              _logger.i(LOG_TAG + "#selectPolicyForAdBreak", "currentTime=" + adPolicyInfo.getCurrentTime() + " seekToTime="
                      + adPolicyInfo.getSeekToTime() + " rate=" + adPolicyInfo.getRate() + " adPolicyMode=" + adPolicyInfo.getMode());
      
              if (adPolicyInfo.getAdBreakPlacements().size() > 0) {
                  AdBreakPlacement adBreakTimelineItem = adPolicyInfo.getAdBreakPlacements().get(0);
                  if (adPolicyInfo.getMode() == AdPolicyMode.SEEK && adBreakTimelineItem.getAdBreak().isWatched()) {
                      return AdBreakPolicy.SKIP;
                  }
              }
      
              AdSignalingMode adSignalingMode = AdSignalingMode.DEFAULT;
              if (_mediaPlayerItem != null) {
                  MetadataNode metadata = (MetadataNode) _mediaPlayerItem.getResource().getMetadata();
                  if (metadata != null) {
                      AdvertisingMetadata advertisingMetadata = (AdvertisingMetadata) metadata.getNode(DefaultMetadataKeys.ADVERTISING_METADATA.getValue());
                      if (advertisingMetadata != null) {
                          adSignalingMode = advertisingMetadata.getSignalingMode();
                      }
                  }
              }
      
              // can't remove main content due to a ave bug, need to check if stream is live or ad signaling mode is manifest cue
              if (_mediaPlayerItem.isLive() || adSignalingMode == AdSignalingMode.MANIFEST_CUES) {
                  return AdBreakPolicy.PLAY;
              }
      
              return AdBreakPolicy.REMOVE_AFTER_PLAY;
          }
      
          @Override
          public List<AdBreakPlacement> selectAdBreaksToPlay(AdPolicyInfo adPolicyInfo) {
              _logger.i(LOG_TAG + "#selectAdBreaksToPlay", "currentTime=" + adPolicyInfo.getCurrentTime() + " seekToTime="
                      + adPolicyInfo.getSeekToTime() + " rate=" + adPolicyInfo.getRate() + " adPolicyMode=" + adPolicyInfo.getMode());
      
              List<AdBreakPlacement> adBreakPlacements = adPolicyInfo.getAdBreakPlacements();
              if (adBreakPlacements != null) {
                  int size = adBreakPlacements.size();
                  List<AdBreakPlacement> adBreaks = new ArrayList<AdBreakPlacement>();
                  if (size > 0 && adPolicyInfo.getCurrentTime() <= adPolicyInfo.getSeekToTime()) {
                      AdBreakPlacement adBreak = adBreakPlacements.get(size - 1);
                      if (!adBreak.getAdBreak().isWatched()) {
                          adBreaks.add(adBreak);
                          return adBreaks;
                      }
                  }
              }
      
              return null;
          }
      
          @Override
          public AdPolicy selectPolicyForSeekIntoAd(AdPolicyInfo adPolicyInfo) {
              _logger.i(LOG_TAG + "#selectPolicyForSeekIntoAd", "currentTime=" + adPolicyInfo.getCurrentTime() + " seekToTime="
                      + adPolicyInfo.getSeekToTime() + " rate=" + adPolicyInfo.getRate() + " adPolicyMode=" + adPolicyInfo.getMode());
      
              // If you really want to allow seek during ads (you likely do not).
              return AdPolicy.PLAY;
          }
      
          @Override
          public AdBreakAsWatched selectWatchedPolicyForAdBreak(AdPolicyInfo adPolicyInfo) {
              _logger.i(LOG_TAG + "#selectWatchedPolicyForAdBreak", "currentTime=" + adPolicyInfo.getCurrentTime() + " seekToTime="
                      + adPolicyInfo.getSeekToTime() + " rate=" + adPolicyInfo.getRate() + " adPolicyMode=" + adPolicyInfo.getMode());
      
              return _adBreakAsWatchedPolicy;
          }
      
          /**
           * Extract the ad break watched policy for the specified media player item.
           *
           * @param item Associated media player item.
           * @return a valid ad break watched policy.
           */
          private AdBreakAsWatched extractAdBreakAsWatchedPolicy(MediaPlayerItem item) {
              AdBreakAsWatched adBreakWatchedPolicy = AdBreakAsWatched.AD_BREAK_AS_WATCHED_ON_BEGIN;
      
              if (item != null) {
                  MetadataNode metadata = (MetadataNode) item.getResource().getMetadata();
                  if (metadata != null) {
                      AdvertisingMetadata advertisingMetadata = (AdvertisingMetadata) metadata.getNode(DefaultMetadataKeys.ADVERTISING_METADATA.getValue());
                      if (advertisingMetadata != null) {
                          adBreakWatchedPolicy = advertisingMetadata.getAdBreakAsWatched();
                      }
                  }
              }
      
              return adBreakWatchedPolicy;
          }
      }
      
    2. Sample Advertising Factory

      private AdvertisingFactory createPartialAdBreakFactory() {
      return new AdvertisingFactory() {
      @Override
                   public AdPolicySelector
      createAdPolicySelector(MediaPlayerItem mediaPlayerItem) {
                      return new PartialAdBreakAdPolicySelector(mediaPlayerItem);
                   }
      
      // Rest of the interface methods can be overridden as per your
      // customization needs
      // As shown next
      @Override
      public AdPolicySelector
      createAdPolicySelector(MediaPlayerItem mediaPlayerItem) {
         return new PartialAdBreakAdPolicySelector(mediaPlayerItem);
        }
      // . . .
      
       }
      }
      
    3. Registrare AdvertisingFactory con il lettore multimediale

      AdvertisingFactory advertisingFactory = createPartialAdBreakFactory();
      
      if (advertisingFactory != null) {
                  mediaPlayer.registerAdClientFactory(advertisingFactory);
      }
      
    4. Ignorare il metodo createAdPolicySelector

      @Override
      public AdPolicySelector
      createAdPolicySelector(MediaPlayerItem mediaPlayerItem) {
         return new PartialAdBreakAdPolicySelector(mediaPlayerItem);
      }
      

In questa pagina