Implementar una resolución de contenido personalizada

Puede implementar sus propios resolvedores de contenido en función de los resolvedores predeterminados.

Cuando TVSDK detecta una nueva oportunidad, se repite a través de los solucionadores de contenido registrados que buscan uno que sea capaz de resolver esa oportunidad usando el método canResolve . El primero que devuelve true se selecciona para resolver la oportunidad. Si no se puede resolver ningún contenido, se omite esa oportunidad. Dado que el proceso de resolución de contenido suele ser asíncrono, la resolución de contenido es responsable de notificar a TVSDK cuando el proceso ha finalizado.

  • La resolución de contenido llama a client.place para especificar qué operación de cronología debe ejecutar TVSDK (normalmente, una colocación de pausa publicitaria).
  • La resolución de contenido llama a client.notifyCompleted si el proceso de resolución es exitoso o client.notifyFailed si falla el proceso.
  1. Cree una resolución de oportunidad personalizada.

    public class CustomResolver extends ContentResolver {
    
        /**
         * Default constructor.
         */
        public function CustomResolver() {
        }
    
        override protected function doConfigure(item:MediaPlayerItem):void {
            // here you can read any media stream characteristics which
            // might help configure your content resolver like
            // - the media player item configuration through the item.config
            // - the media resource metadata through item.resource.metadata
        }
    
        /**
         * @inheritDoc
         */
        override protected function doCanResolve(opportunity:Opportunity):Boolean {
            // check if the opportunity can be resolved by this resolver
            // if yes return true, otherwise return false
    
            return true;
        }
    
        /**
         * @inheritDoc
         */
        override protected function doResolve(opportunity:Opportunity):void {
            // start the resolving process
            // communicate with your custom ad server
    
            // in this example we assume that:
            // - if successful, onResolveCompleted method will be invoked
            // - if failed, onResolveFailed method will be invoked
        }
    
        private function onResolveCompleted(response:*):void {
            try {
                var proposals:Vector.<TimelineOperation> = new Vector.<TimelineOperation>();
    
                // extract the timeline ad placement from the response
                // and add them to the proposal vector
                // - extract the ad break
                // - calculate the placement ( can reuse the opportunity.placement )
                // var timelineOperation:AdBreakPlacement = new AdBreakPlacement(placement, adBreak);
                // proposals.push(timelineOperation);
    
                client.process(proposals);
                client.notifyCompleted(_opportunity);
            } catch (error:Error) {
                onResolveFailed(error);
            }
        }
    
        private function onResolveFailed(error:Error):void {
    
            var errorMetadata:Metadata = new Metadata();
            MetadataUtils.serializeError(error, errorMetadata);
    
            var mediaError:MediaError = new MediaError(NotificationCode.CONTENT_RESOLVING_ERROR, errorMetadata);
            client.notifyFailed(_opportunity, mediaError);
        }
    
        ...
    }
    
  2. Cree la fábrica de contenido personalizado, que utiliza la resolución de contenido personalizado.

    Por ejemplo:

    public class CustomContentFactory extends DefaultContentFactory {
            ...
    
            /**
             * @inheritDoc
             */
            override protected function
              doRetrieveResolvers(item:MediaPlayerItem):Vector.<ContentResolver> {
                var result:Vector.<ContentResolver> = new Vector.<ContentResolver>();
    
                var resource:MediaResource = item.resource;
    
                if (resource.metadata != null) {
                    if (resource.metadata.containsKey(DefaultMetadataKeys.AUDITUDE_METADATA_KEY)) {
                        result.push(new AuditudeAdResolver());
                    } else if (resource.metadata.containsKey("custom-opportunity-detector")) {
                        result.push(new CustomResolver());
                    }
                }
                return result;
            }
    }
    
  3. Registre la fábrica de contenido personalizado para la reproducción del flujo de medios.

    Por ejemplo:

    var mediaPlayerItemConfig:MediaPlayerItemConfig = new DefaultMediaPlayerItemConfig();
    mediaPlayerItemConfig.advertisingFactory = new CustomContentFactory();
    ...
    
    var advertisingMetadata:AdvertisingMetadata = new AdvertisingMetadata();
    // set any parameter you need for custom ad resolver
    // advertisingMetadata.setValue("customparam", "customvalue");
    
    var metadata:Metadata = new Metadata();
    metadata.setMetadata("custom-opportunity-detector", advertisingMetadata);
    var mediaResource:MediaResource = MediaResource.createFromUrl(url, metadata);
    
    player.replaceCurrentResource(mediaResource, mediaPlayerItemConfig);
    

En esta página