實作自訂內容解析器

上次更新: 2023-09-21

您可以根據預設解析器來實作您自己的內容解析器。

當TVSDK偵測到新的商機時,它會逐一檢視註冊的內容解析器,尋找一個能夠使用 canResolve 方法。 系統會選取第一個傳回true的來解析商機。 如果沒有任何內容解析程式能夠解析內容,則會略過該機會。 由於內容解析程式通常是非同步的,內容解析程式負責在程式完成時通知TVSDK。

  • 內容解析器呼叫 client.place 以指定TVSDK需要執行的時間表操作(通常是廣告插播位置)。
  • 內容解析器呼叫 client.notifyCompleted 如果解決流程成功,或 client.notifyFailed 如果處理失敗。
  1. 建立自訂機會解析程式。

    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. 建立使用自訂內容解析程式的自訂內容處理站。

    例如:

    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. 註冊要播放的媒體資料流的自訂內容處理站。

    例如:

    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);
    

此頁面上的