您可以根據預設解析器實作您自己的內容解析器。
當TVSDK偵測到新商機時,它會重複透過註冊的內容解析器尋找能夠使用canResolve
方法解決該商機的內容解析器。 選擇返回true的第一個用於解決業務機會。 如果沒有內容解析程式,則會略過該商機。 由於內容解析程式通常是非同步的,因此當程式完成時,內容解析程式負責通知TVSDK。
client.place
,以指定TVSDK需要執行的時間軸作業(通常是廣告插播位置)。client.notifyCompleted
;如果過程失敗,則調用client.notifyFailed
。建立自訂的業務機會解析程式。
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);
}
...
}
建立自訂內容工廠,使用自訂內容解析程式。
例如:
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;
}
}
註冊要播放的媒體串流的自訂內容工廠。
例如:
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);