Show Menu
TOPICS×

VOD 여러 추적기 동시 실행

시나리오

이 시나리오에는 두 개의 별도 미디어에 대해 동시에 실행되며, 두 개의
MediaHeartbeat
인스턴스를 사용하는 세션이 두 개 있습니다.
이 시나리오는 두 개의 별도 미디어에 대해 동시에 실행되는 세션이 두 개 있다는 점을 제외하고, 광고 없이 VOD 재생 시나리오와 동일합니다. 이러한 각 세션은
MediaHeartbeat
의 별도 인스턴스를 사용합니다.
명시하지 않은 경우, 네트워크 호출은 광고 없이 VOD 재생 시나리오와 동일합니다.

매개 변수

하트비트 세션

매개 변수
참고  
s:event:sid
고유 세션 ID
trackSessionEnd
메서드가 호출될 때까지 모든 하트비트 네트워크 호출에 있는 고유한 세션 ID입니다.

샘플 코드

Android

public class MediaAnalyticsProvider implements MediaHeartbeatDelegate { private MediaPlayer _player; private MediaHeartbeat _heartbeat; public MediaAnalyticsProvider(MediaPlayer player) { if (player == null) { throw new IllegalArgumentException("Player reference cannot be null."); } _player = player; _player.addObserver(this); // Media Heartbeat initialization MediaHeartbeatConfig config = new MediaHeartbeatConfig(); config.trackingServer = HEARTBEAT_TRACKING_SERVER; config.channel = HEARTBEAT_CHANNEL; config.appVersion = HEARTBEAT_SDK; config.ovp = HEARTBEAT_OVP; config.playerName = PLAYER_NAME; config.ssl = false; config.debugLogging = true; _heartbeat = new MediaHeartbeat(this, config); } @Override public MediaObject getQoSObject() { return MediaHeartbeat.createQoSObject(BITRATE, STARTUP_TIME, FPS, DROPPED_FRAMES); } @Override public Double getCurrentPlaybackTime() { return _player.getCurrentPlaybackTime(); } }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Bootstrap the AdobeMobile library. Config.setContext(this.getApplicationContext()); // Create first MediaPlayer instance. _player1 = new MediaPlayer(); // Create first MediaAnalyticsProvider instance and // attach it to the MediaPlayer instance. _analyticsProvider1 = new MediaAnalyticsProvider(_player1); // Load the main media content. Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.media1); _player1.loadContent(uri); // Create second MediaPlayer instance. _player2 = new MediaPlayer(); // Create second MediaAnalyticsProvider instance and // attach it to the MediaPlayer instance. _analyticsProvider2 = new MediaAnalyticsProvider(_player2); // Load the main media content. Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.media2); _player2.loadContent(uri); }
MediaAnalyticsProvider
MediaHeartbeat
의 두 인스턴스는 각각 고유한 세션 ID가 있는 두 개의 별도 세션을 추적합니다. Charles 디버깅 도구 또는 디버그 로그에서 두 세션은 세션 ID 값으로 식별할 수 있습니다. Android에서 이 시나리오를 표시하려면 다음 코드를 설정합니다.
// Set up mediaObject MediaObject mediaInfo = MediaHeartbeat.createMediaObject( Configuration.MEDIA_NAME, Configuration.MEDIA_ID, Configuration.MEDIA_LENGTH, MediaHeartbeat.StreamType.VOD ); HashMap<String, String> mediaMetadata = new HashMap<String, String>(); mediaMetadata.put(CUSTOM_VAL_1, CUSTOM_KEY_1); mediaMetadata.put(CUSTOM_VAL_2, CUSTOM_KEY_2); // 1. Call trackSessionStart() when the user clicks Play or if autoplay is used, // i.e., there is an intent to start playback. _mediaHeartbeat.trackSessionStart(mediaInfo, mediaMetadata); ...... ...... // 2. Call trackPlay() when the playback actually starts, i.e., when the first // frame of main content is rendered on the screen. _mediaHeartbeat.trackPlay(); ....... ....... // 3. Call trackComplete() when the playback reaches the end, i.e., when the // media completes and finishes playing. _mediaHeartbeat.trackComplete(); ........ ........ // 4. Call trackSessionEnd() when the playback session is over. This method must // be called even if the user does not watch the media to completion. _mediaHeartbeat.trackSessionEnd(); ........ ........

iOS

@interface MediaAnalyticsProvider : NSObject <ADBMediaHeartbeatDelegate> @end @implementation { MediaPlayer *_player; } - (instancetype)initWithPlayer:(AVPlayer *)player { if (self = [super init]) { _player = player; ADBMediaHeartbeatConfig *config = [[ADBMediaHeartbeatConfig alloc] init]; config.trackingServer = HEARTBEAT_TRACKING_SERVER; config.channel = HEARTBEAT_CHANNEL; config.appVersion = HEARTBEAT_SDK_VERSION; config.playerName = PLAYER_NAME; config.ssl = SSL_SETTING; config.debugLogging = DEBUG_SETTING; ADBMediaHeartbeatConfig *config = [[ADBMediaHeartbeatConfig alloc] init]; _mediaHeartbeat = [[ADBMediaHeartbeat alloc] initWithDelegate:self config:config]; [self setupPlayerNotifications]; } return self; } - (ADBMediaObject *)getQoSInfo { return [ADBMediaHeartbeat createQoSObjectWithBitrate:CURRENT_BITRATE_VALUE startupTime:CALCULATED_STARTED_TIME fps:CALCULATED_FPS droppedFrames:DROPPED_FRAMES_COUNT]; } - (NSTimeInterval)getCurrentPlaybackTime { return CMTimeGetSeconds(_player.currentTime); } @end - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [ADBMobile setDebugLogging:YES]; // Setup the first media player NSURL *streamUrl = [NSURL URLWithString:CONTENT_URL_1]; if (!self.mediaPlayer1) { self.mediaPlayer1 = [[MediaPlayer alloc] initWithContentURL:streamUrl]; //setup player } // Create the MediaAnalyticsProvider instance and attach it to the first // MediaPlayer instance. if (!self.mediaAnalyticsProvider1) { self.mediaAnalyticsProvider1 = [[MediaAnalyticsProvider alloc] initWithPlayerDelegate:self.mediaPlayer1]; } // Setup the second media player NSURL *streamUrl2 = [NSURL URLWithString:CONTENT_URL_2]; if (!self.mediaPlayer2) { self.mediaPlayer2 = [[MediaPlayer alloc] initWithContentURL:streamUrl2]; //setup player } // Create the MediaAnalyticsProvider instance and attach it to the second // MediaPlayer instance. if (!self.mediaAnalyticsProvider2) { self.mediaAnalyticsProvider2 = [[MediaAnalyticsProvider alloc] initWithPlayerDelegate:self.mediaPlayer2]; } }
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [ADBMobile setDebugLogging:YES]; // Setup the first media player NSURL *streamUrl = [NSURL URLWithString:CONTENT_URL_1]; if (!self.mediaPlayer1) { self.mediaPlayer1 = [[MediaPlayer alloc] initWithContentURL:streamUrl]; //setup player } // Create the MediaAnalyticsProvider instance and attach it to the first // MediaPlayer instance. if (!self.mediaAnalyticsProvider1) { self.mediaAnalyticsProvider1 = [[MediaAnalyticsProvider alloc] initWithPlayerDelegate:self.mediaPlayer1]; } // Setup the second media player NSURL *streamUrl2 = [NSURL URLWithString:CONTENT_URL_2]; if (!self.mediaPlayer2) { self.mediaPlayer2 = [[MediaPlayer alloc] initWithContentURL:streamUrl2]; //setup player } // Create the MediaAnalyticsProvider instance and attach it to the second MediaPlayer instance. if (!self.mediaAnalyticsProvider2) { self.mediaAnalyticsProvider2 = [[MediaAnalyticsProvider alloc] initWithPlayerDelegate:self.mediaPlayer2]; } }
MediaAnalyticsProvider
ADBMediaHeartbeat
의 두 인스턴스는 각각 고유한 세션 ID가 있는 두 개의 별도 세션을 추적합니다. Charles 디버깅 도구 또는 디버그 로그에서 두 세션은 세션 ID 값으로 식별할 수 있습니다.
iOS에서 이 시나리오를 표시하려면 다음 코드를 설정합니다.
// Set up mediaObject ADBMediaObject *mediaObject = [ADBMediaHeartbeat createMediaObjectWithName:MEDIA_NAME length:MEDIA_LENGTH streamType:ADBMediaHeartbeatStreamTypeVOD]; NSMutableDictionary *mediaContextData = [[NSMutableDictionary alloc] init]; [mediaContextData setObject:CUSTOM_VAL_1 forKey:CUSTOM_KEY_1]; [mediaContextData setObject:CUSTOM_VAL_2 forKey:CUSTOM_KEY_2]; // 1. Call trackSessionStart when the user clicks Play or if autoplay is used, // i.e., there is an intent to start playback. [_mediaHeartbeat trackSessionStart:mediaObject data:mediaContextData]; ....... ....... // 2. Call trackPlay when the playback actually starts, i.e., when the first // frame of the main content is rendered on the screen. [_mediaHeartbeat trackPlay]; ....... ....... // 3. Call trackComplete when the playback reaches the end, i.e., when the // media completes and finishes playing. [_mediaHeartbeat trackComplete]; ....... ....... // 4. Call trackSessionEnd when the playback session is over. This method // must be called even if the user does not watch the media to completion. [_mediaHeartbeat trackSessionEnd]; ....... .......

JavaScript

var MediaHeartbeat = ADB.va.MediaHeartbeat; var MediaHeartbeatConfig = ADB.va.MediaHeartbeatConfig; var MediaHeartbeatDelegate = ADB.va.MediaHeartbeatDelegate; function MediaAnalyticsProvider(player) { if (!player) { throw new Error("Illegal argument. Player reference cannot be null.") } this._player = player; //Media Heartbeat initialization var mediaConfig = new MediaHeartbeatConfig(); mediaConfig.trackingServer = Configuration.HEARTBEAT.TRACKING_SERVER; mediaConfig.playerName = Configuration.PLAYER.NAME; mediaConfig.channel = Configuration.HEARTBEAT.CHANNEL; mediaConfig.debugLogging = true; mediaConfig.appVersion = Configuration.HEARTBEAT.SDK; mediaConfig.ssl = false; mediaConfig.ovp = Configuration.HEARTBEAT.OVP; var mediaDelegate = new MediaHeartbeatDelegate(); mediaDelegate.getCurrentPlaybackTime = function() { return player.getCurrentPlaybackTime(); }; mediaDelegate.prototype.getQoSObject = function() { return player.getQoSInfo(); }; this._mediaHeartbeat = new MediaHeartbeat(mediaDelegate, mediaConfig, appMeasurement); }
// Create first MediaPlayer instance. var _player1 = new MediaPlayer(); // Create the first MediaAnalyticsProvider instance // and attach it to the MediaPlayer instance. analyticsProvider1 = new MediaAnalyticsProvider(_player1); // Load the main media content. _player1.loadContent(URL_TO_MEDIA_1); // Create second MediaPlayer instance. var _player2 = new MediaPlayer(); // Create second MediaAnalyticsProvider instance and // attach it to the MediaPlayer instance. analyticsProvider2 = new MediaAnalyticsProvider(_player2); // Load the main media content for the 2nd player. _player2.loadContent(URL_TO_MEDIA_2);
MediaAnalyticsProvider
MediaHeartbeat
의 두 인스턴스는 각각 고유한 세션 ID가 있는 두 개의 별도 세션을 추적합니다. Charles 디버깅 도구에서 두 개의 세션을 볼 수 있습니다.