實作自訂內容解析器

上次更新: 2023-09-21

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

當TVSDK產生新的商機時,它會逐一檢視註冊的內容解析器,尋找能夠解析該商機的內容。 第一個傳回的 true 已選取以解決商機。 如果沒有任何內容解析程式能夠解析內容,則會略過該機會。 由於內容解析程式通常是非同步的,內容解析程式負責在程式完成時通知TVSDK。

  1. 實作您自己的自訂 ContentFactory,方式為擴充 ContentFactory 介面和覆寫 retrieveResolvers.

    例如:

    class MyContentFactory extends ContentFactory {
        @Override
        public List<ContentResolver> retrieveResolvers(MediaPlayerItem item) {
            List<ContentResolver> resolvers = new ArrayList<ContentResolver>();
            MediaPlayerItemConfig itemConfig = item.getConfig();
            if(itemConfig) {
                CustomRangeMetadata customRanges = itemConfig.getCustomRangeMetadata();
                if (customRanges) {
                    List<ReplaceTimeRange> timeRanges = customRanges.getTimeRangeList();
    
                    if (timeRanges && timeRanges.size() > 0)
                    {
                    // CustomRangeResolver is only activated by the presence of CustomRanges in configuration
                    resolvers.add(new CustomRangeResolver());
                    }
                }
                AdvertisingMetadata metadata = itemConfig.getAdvertisingMetadata();
                if (metadata) {
                    if (metadata instanceOf AuditudeSettings)
                        resolvers.add(new AuditudeResolver(getContext());
                    }
                }
            // add your custom resolver if any
            resolvers.add(MyOpportunityGenerator(item));
            return resolvers;
        }
        ...
    }
    
  2. 註冊 ContentFactoryMediaPlayer.

    例如:

    //Register the custom content factory with the media player
    MediaPlayerItemConfig config = new MediaPlayerItemConfig();
    config.setAdvertisingFactory(new MyContentFactory());
    
    //Pass this config while loading the resource
    mediaPlayer.replaceCurrentResource(resource, config);
    
    // OR use MediaPlayerItemLoader to pre-load a resource
    id = 23;
    itemLoader.load(resource, id, config);
    
  3. 傳遞 AdvertisingMetadata 物件至TVSDK,如下所示:

    1. 建立 AdvertisingMetadata 物件。

    2. 儲存 AdvertisingMetadata 物件至 MediaPlayerItemConfig.

      AdvertisingMetadata advertisingMetadata = new AdvertisingMetadata();
      
      advertisingMetadata.setDelayAdLoading(true);
      ...
      
      mediaPlayerItemConfig.setAdvertisingMetadata(advertisingMetadata);
      
  4. 建立自訂廣告解析程式類別以擴充 ContentResolver 類別。

    1. 在自訂廣告解析程式中,覆寫 doConfiguredoCanResolvedoResolvedoCleanup

      void doConfigure(MediaPlayerItem item);
      boolean doCanResolve(Opportunity opportunity);
      void doResolve(Opportunity opportunity);
      void doCleanup();
      

      您將您的 advertisingMetadata 從傳入的專案 doConfigure

      MediaPlayerItemConfig itemConfig = item.getConfig();
      
      AdvertisingMetadata advertisingMetadata =
        mediaPlayerItemConfig.getAdvertisingMetadata();
      
    2. 針對每個刊登機會,建立 List<TimelineOperation>.

      此範例 TimelineOperation 提供適用於以下專案的結構: AdBreakPlacement

      AdBreakPlacement(
          new AdBreak( ads,    // Vector<Ad>
                       tracker // Content Tracker
          ),
          placementInformation // Retrieved from Opportunity
      );
      
    3. 解析廣告後,請呼叫下列其中一個函式:

      • 如果廣告解析成功,請呼叫 process(List<TimelineOperation> proposals)notifyCompleted(Opportunity opportunity)ContentResolverClient

        _client.process(timelineOperations);
        _client.notifyCompleted(opportunity);
        
      • 如果廣告解析失敗,請呼叫 notifyResolveErrorContentResolverClient

        _client.notifyFailed(Opportunity opportunity, PSDKErrorCode error);
        

        例如:

        _client.notifyFailed(opportunity, UNSUPPORTED_OPERATION);
        

此自訂廣告解析程式範例可解決商機並提供簡單的廣告:

public class CustomContentResolver extends ContentResolver {
    protected void doConfigure(MediaPlayerItem item){}

    protected boolean doCanResolve(Opportunity opportunity) {
        return true;
    }

    protected void doResolve(Opportunity opportunity) {
        _client.process(createAdBreakPlacementsFor(opportunity.getPlacement()));
        _client.notifyCompleted(opportunity);
    }

    private List<TimelineOperation> createAdBreakPlacementsFor(Placement placementInformation) {
        List<Ad> ads = new ArrayList<Ad>();
        AdAsset adAsset = new AdAsset("101", 15000, new MediaResource(
          "https: . . ..m3u8", MediaResource.Type.HLS, null), null, null);

        Ad ad = Ad.linearFromAsset("101", adAsset, null, null, false);
        ads.add(ad);
        AdBreak adBreak = new AdBreak(ads, null, AdInsertionType.CLIENT_INSERTED);

        List<TimelineOperation> result = new ArrayList<TimelineOperation>();

        result.add(new AdBreakPlacement(placementInformation, adBreak));
        return result;
    }

    protected void doCleanup() {}
}

此頁面上的