Puede activar una experiencia parecida a la TV para poder unirse en medio de un anuncio, en transmisiones en directo.
La función Parcial de Ad Break le permite imitar una experiencia parecida a un televisor en la que, si el cliente inicia un flujo en vivo dentro de un midroll, este se iniciará dentro de ese midroll. Es similar a cambiar a un canal de televisión y los anuncios se ejecutan sin problemas.
Por ejemplo, si un usuario se une en medio de una pausa publicitaria de 90 segundos (tres anuncios de 30 segundos), 10 segundos después del segundo anuncio (es decir, a los 40 segundos de la pausa publicitaria), sucederá lo siguiente:
Este comportamiento no está habilitado de forma predeterminada. Para habilitar este funcionamiento en la aplicación, haga lo siguiente.
Deshabilite las preconfiguraciones activas mediante el método setEnableLivePreroll de la clase AdvertisingMetadata .
advertisingMetadata.setEnableLivePreroll(String.valueOf(false))
Active la preferencia para la inserción parcial de pausa publicitaria. Utilice el nuevo método setPartialAdBreakPref en la interfaz de MediaPlayer para activar esta función. Utilice el método getPartialAdBreakPref para encontrar el estado actual de esta preferencia.
MediaPlayer mediaPlayer = DefaultMediaPlayer.create(getActivity().getApplicationContext());
mediaPlayer.setPartialAdBreakPref(true);
Esta función requiere que implemente un selector de directiva de publicidad personalizado para personalizar el comportamiento. Si todavía no tiene una implementación personalizada de la clase AdvertisingFactory, agregue una nueva implementación de AdvertisingFactory. Anule el método createAdPolicySelector . Este método devuelve una nueva instancia de la implementación de AdPolicySelector.
A continuación se muestra una implementación de muestra para su referencia. La siguiente implementación de muestra está disponible para su uso desde el paquete com.adobe.mediacore . Sin embargo, se simplifica para facilitar la referencia y no se recomienda utilizarlo tal cual.
Ejemplo de selector de políticas de publicidad
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;
}
}
Ejemplo de fábrica de publicidad
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);
}
// . . .
}
}
Registre AdvertisingFactory en el reproductor de contenidos
AdvertisingFactory advertisingFactory = createPartialAdBreakFactory();
if (advertisingFactory != null) {
mediaPlayer.registerAdClientFactory(advertisingFactory);
}
Anular el método createAdPolicySelector
@Override
public AdPolicySelector
createAdPolicySelector(MediaPlayerItem mediaPlayerItem) {
return new PartialAdBreakAdPolicySelector(mediaPlayerItem);
}