이 시나리오에는 두 개의 별도 미디어에 대해 동시에 실행되며, 두 개의 MediaHeartbeat
인스턴스를 사용하는 세션이 두 개 있습니다.
이 시나리오는 두 개의 별도 미디어에 대해 동시에 실행되는 세션이 두 개 있다는 점을 제외하고, 광고 없이 VOD 재생 시나리오와 동일합니다. 이러한 각 세션은 MediaHeartbeat
의 별도 인스턴스를 사용합니다.
명시하지 않은 경우, 네트워크 호출은 광고 없이 VOD 재생 시나리오와 동일합니다.
매개 변수 | 값 | 참고 |
---|---|---|
s:event:sid |
고유 세션 ID | trackSessionEnd 메서드가 호출될 때까지 모든 하트비트 네트워크 호출에 있는 고유한 세션 ID입니다. |
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();
........
........
@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];
.......
.......
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 디버깅 도구에서 두 개의 세션을 볼 수 있습니다.