您可以根據預設解析器來實作您自己的內容解析器。
當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);