La section ci-après décrit la méthode pour accomplir les tâches les plus courantes à l'aide de TritonMobileSdk. Le package SDK inclut un exemple de projet Xcode qui présente les fonctionnalités disponibles et montre comment intégrer le SDK dans une application de streaming.
Définir votre région
Lorsque le SDK est chargé, il reçoit la configuration de sa station de nos serveurs d'approvisionnement. Pour accélérer le processus, nous disposons des serveurs d'approvisionnement dans plusieurs régions, notamment en Amérique du Nord, en Europe et en Asie. Pour de meilleurs résultats, utilisez les serveurs d'approvisionnement les plus proches de vos stations.
La région d'approvisionnement par défaut est l'Amérique du Nord ; pour utiliser l’une des autres régions, spécifiez-la comme dans l'exemple ci-dessous, où « AP » (Asie) est utilisé.
NSDictionary *settings = @{SettingsStationNameKey : @"MOBILEFM",
SettingsBroadcasterKey : @"Triton Digital",
SettingsMountKey : @"MOBILEFM_AACV2",
SettingsPlayerServicesRegion: @"AP", // AP = Asia | EU = Europe | Omit this configuration option for North America
};
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
...
[self.tritonPlayer play];
Lecture automatique
Pour des raisons de mesure et d'expérience utilisateur, l'utilisation de la lecture automatique est fortement déconseillée.  La lecture automatique est définie comme la diffusion de la station/du flux sans aucune interaction de l'utilisateur pour lancer la lecture. Si vous mettez en place une stratégie de lecture automatique, vous devez ajouter la autoplay = 1
valeur Ă l'objet SettingsStreamParamsExtraKey
object lors de l’appel de l’objet play
sur le SDK.
NSDictionary *settings = @{SettingsStationNameKey : @"MOBILEFM",
SettingsBroadcasterKey : @"Triton Digital",
SettingsMountKey : @"MOBILEFM_AACV2",
SettingsEnableLocationTrackingKey : @(YES),
SettingsStreamParamsExtraKey : @{@"autoplay": @"1",
@"age": @"30"}
};
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
...
[self.tritonPlayer play];
Lancer une station
La fonctionnalité de stream est fournie par la classe TritonPlayer
. Pour être en mesure de lire, vous devez fournir les paramètres de votre station, à défaut, fournir au moins, le nom et le montage de la station et du diffuseur. Les montages HLS sont pris en charge. Contactez Triton si vous ne disposez pas de cette information. Consultez la référence de l’API pour connaître les autres paramètres disponibles.
NSDictionary *settings = @{SettingsStationNameKey : @"MOBILEFM",
SettingsBroadcasterKey : @"Triton Digital",
SettingsMountKey : @"MOBILEFM_AACV2",
SettingsDebouncingKey: @(0.75) // optional debouncing for the Play action, in seconds : default value is 0.2
};
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
...
[self.tritonPlayer play];
Changer de station
Lors du changement de stations, vous devez fournir les paramètres de la nouvelle station. Utilisez la méthode -updateSettings:
pour procéder à la configuration. Ceci annulera les paramètres antérieurs, mais n'entrera en vigueur que la prochaine fois où le lecteur s'arrêtera et jouera à nouveau.
// Stop previous stream
[self.tritonPlayer stop];
...
// Configure and play the new station
NSDictionary *settings = @{SettingsStationNameKey : @"WMSC_S01",
SettingsBroadcasterKey : @"Triton Digital",
SettingsMountKey : @"WMSC_S01AAC"
};
[self.tritonPlayer updateSettings:settings];
[self.tritonPlayer play];
Sinon, vous pouvez recréer le lecteur TritonPlayer chaque fois que vous changez de station, mais la procédures susmentionnée est préférable.
Modifier la vitesse de lecture du podcast
Pour modifier la vitesse de lecture d’un podcast, utilisez changePlaybackRate
avec une valeur flottante comme argument de vitesse.
Exemple :
(void)setPlaybackRate:{
[self.tritonPlayer changePlaybackRate:1.5];
}
... changerait la lecture instantanée à 1,5 fois la vitesse d’origine.
Diffuser lorsque le son est coupé
Vous pouvez configurer le comportement du flux lorsque le son du lecteur est coupé.
SettingsStreamWhileMuted
(Objet). Obligatoire : Non.
Utilisez cet objet pour activer ou désactiver la lecture du flux lorsque l’utilisateur coupe le son. La valeur par défaut est NON.
Options :
NO
- Désactivé (le flux s’arrête lorsque le son est coupé)YES
- Activé (le flux continue lorsque le son est coupé, mais l’utilisateur n’entend pas l’audio)
Exemple de code :
NSDictionary *settings = @{SettingsStationNameKey : @"MOBILEFM",
SettingsBroadcasterKey : @"Triton Digital",
SettingsMountKey : @"MOBILEFM_AACV2",
SettingsStreamWhileMuted: @(NO)         //Steam will be stopped when muted.
};
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
...
[self.tritonPlayer play];
Public cible pour publicités audio
Afin de cibler votre audience pour les publicités audio (et les bannières complémentaires correspondantes), vous devez transmettre les paramètres de ciblage aux paramètres de TritonPlayer. Admettons que vous souhaitez cibler des personnes de sexe masculin, âgées de 30 ans et fournir leurs coordonnées géographiques :
NSDictionary *settings = @{SettingsStationNameKey : @"MOBILEFM",
SettingsBroadcasterKey : @"Triton Digital",
SettingsMountKey : @"MOBILEFM_AACV2",
SettingsEnableLocationTrackingKey : @(YES),
SettingsStreamParamsExtraKey : @{@"gender": @"m",
@"age": @"30"}
};
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
...
[self.tritonPlayer play];
Quand SettingsEnableLocationTrackingKey
Si la réponse est OUI, il utilisera CLLocationManager
pour fournir l'emplacement de l'utilisateur (Voir "Géolocalisation"). Les autres paramètres (y compris la géolocalisation manuelle) sont spécifiés dans le dictionnaire à la section SettingsStreamParamsExtraKey
. Pour connaître tous les paramètres de ciblage disponibles, consultez le Guide de diffusion en streaming de Triton Digital.
Vous pouvez ajouter des en-têtes de segment de DMP (comme décrit dans les spécifications techniques de la publicité) pour le streaming en direct, les podcasts et les services à la demande en ajoutant les éléments suivants aux paramètres du lecteur (à l’aide d’exemples de DMP de Permutive et d’Adobe) :
SettingsDmpHeadersKey : @{@"permutive": @[@1234,@5679], @"adobe": @[@4321,@8765]},
Par exemple :
NSDictionary *settings = @{SettingsStationNameKey : @"MOBILEFM",
SettingsBroadcasterKey : @"Triton Digital",
SettingsMountKey : @"MOBILEFM_AACV2",
SettingsDmpHeadersKey : @{@"permutive": @[@1234,@5679], @"adobe": @[@4321,@8765]},
SettingsDebouncingKey: @(0.75) // optional debouncing for the Play action, in seconds : default value is 0.2
};
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
...
[self.tritonPlayer play];
Autorisation de jeton (auto-signée)
Pour que la recréation de jetons à la reconnexion fonctionne, l'un des paramètres suivants est requis :
StreamParamExtraAuthorizationSecretKey
StreamParamExtraAuthorizationKeyId
Si tous les paramètres sont remplis, vous n’avez pas besoin de générer le jeton vous-même (bien que vous puissiez le faire si vous le souhaitez).
// Create the targeting parameters
NSDictionary *targetingParams = @{@"gender": @"m",
@"age": @"30"
};
// Create the authorization token
NSString *token = [TDAuthUtils createJWTTokenWithSecretKey:@"MySecretKey"
andSecretKeyId:@"MySecretKeyId" andRegisteredUser:YES andUserId:@"foo@bar.com" andTargetingParameters:targetingParams];
// Create the player settings.
NSDictionary *settings = @{SettingsStationNameKey : @"BASIC_CONFIG",
SettingsBroadcasterKey : @"Triton Digital",
SettingsMountKey : self.playerViewController.mountName,
SettingsEnableLocationTrackingKey : @(YES),
SettingsStreamParamsExtraKey : @{@"banners": @"300x50,320x50"},
SettingsTtagKey : @[@"mobile:ios", @"triton:sample"],
StreamParamExtraAuthorizationSecretKey: @"4ToEMVkOK1sThhsw",
StreamParamExtraAuthorizationUserId: @"",
StreamParamExtraAuthorizationKeyId: @"DG83J",
StreamParamExtraAuthorizationRegisteredUser: @(YES),
};
[self.tritonPlayer updateSettings:settings];
}
// Create the player.
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
[self.tritonPlayer play];
Recevoir les métadonnées du flux (marqueurs)
Une fois que le lecteur est en cours de streaming, il est capable de recevoir des points de repère avec des métadonnées de flux (par ex. chanson en cours de lecture, métadonnées de publicité, etc.)Pour recevoir des points de repère, vous devez implémenter TritonPlayerDelegate's -player:didReceiveCuePointEvent:
dans la classe qui sera le délégué de TritonPlayer. CuePointEvent.h
définit toutes les constantes des types et clés de points de repère pour récupérer leurs informations.
@interface ViewController() <TritonPlayerDelegate>
@end
@implementation ViewController
...
- (void)viewDidLoad {
[super viewDidLoad];
...
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
}
...
[self.tritonPlayer play];
...
- (void)player:(TritonPlayer *)player didReceiveCuePointEvent:(CuePointEvent *)cuePointEvent {
// Check if it's an ad or track cue point
if ([cuePointEvent.type isEqualToString:EventTypeAd]) {
// Handle ad information (ex. pass to TDBannerView to render companion banner)
} else if ([cuePointEvent.type isEqualToString:EventTypeTrack]) {
NSString *currentSongTitle = [inNowPlayingEvent.data objectForKey:CommonCueTitleKey];
NSString *currentArtistName = [inNowPlayingEvent.data objectForKey:TrackArtistNameKey];
NSString *currentAlbumName = [inNowPlayingEvent.data objectForKey:TrackAlbumNameKey];
// Do something with track data (update interface, notify user etc.)
}
}
...
@end
Afficher une bannière complémentaire In-stream (bannière de synchronisation)
@interface ViewController() <TritonPlayerDelegate>
@property (strong, nonatomic) TDSyncBannerView *adBannerView;
@end
@implementation ViewController
...
- (void)viewDidLoad {
[super viewDidLoad];
...
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
// Create and configure a 320x50 sync banner with a fallback size of 300x50
self.adBannerView = [[TDSyncBannerView alloc] initWithWidth:320 andHeight:50 andFallbackWidth:300 andFallbackHeight:50];
[self.view addSubview:self.adBannerView];
}
...
- (void)player:(TritonPlayer *)player didReceiveCuePointEvent:(CuePointEvent *)cuePointEvent {
if ([cuePointEvent.type isEqualToString:EventTypeAd]) {
[self.adBannerView loadCuePoint:cuePointEvent];
}
...
}
...
Afficher une publicité interstitielle
Les publicités interstitielles (avant diffusion, en cours de diffusion) sont des pubs plein écran affichés de manière modale dans une appli. En général, elles sont affichées sur des points de transition naturels de l'appli, par ex. avant ou après la lecture ou lors du changement de station radio.
// Create a TDAdRequestBuilder to build the request string
TDAdRequestURLBuilder *request = [TDAdRequestURLBuilder builderWithHostURL:kRequestUrl];
request.stationId = 12345;
// Create a TDInterstitialAd
self.interstitial = [[TDInterstitialAd alloc] init];
// Create a TDAdLoader to load the ad from the request
self.adLoader = [[TDAdLoader alloc] init];
[self.adLoader loadAdWithBuilder:requestBuilder completionHandler:^(TDAd *loadedAd, NSError *error) {
if (error) {
// Handle error
} else {
// Load the ad into the interstitial
[self.videoInterstitial loadAd:loadedAd];
}
}
];
Une fois que l'interstitiel est chargé, il doit être affiché en temps opportun. L'application doit vérifier si l'interstitiel est chargé avant de tenter de le montrer. Si -loaded
ne répond pas OUI, la pub ne sera pas affichée. Lors de la diffusion d'un interstitiel, un contrôleur de vision doit être transmis. Il présentera le contrôleur de vision de l'interstitiel.
- (void)playStation {
if ([self.interstitial loaded]) {
[self.interstitial presentFromViewController:self];
}
// Rest of method logic
}
Vous pouvez ajouter un compte à rebours facultatif à afficher sur une publicité interstitielle. Pour ce faire, activez l’option CountdownDisplay
comme le montre l'exemple d'interstitiel vidéo ci-dessous :
// Create a TDAdRequestBuilder to build the request string
TDAdRequestURLBuilder *request = [TDAdRequestURLBuilder builderWithHostURL:kRequestUrl];
request.stationId = 12345;
// Create a TDInterstitialAd
self.videoInterstitial = [[TDInterstitialAd alloc] init];
self.videoInterstitial.enableCountdownDisplay = TRUE;
// Create a TDAdLoader to load the ad from the request
self.adLoader = [[TDAdLoader alloc] init];
[self.adLoader loadAdWithBuilder:requestBuilder completionHandler:^(TDAd *loadedAd, NSError *error) {
if (error) {
// Handle error
} else {
// Load the ad into the interstitial
[self.videoInterstitial loadAd:loadedAd];
}
}
];
Vous pouvez ajouter des en-têtes de segment de DMP (comme décrit dans les spécifications techniques de la publicité) aux publicités interstitielles comme suit (à l’aide d’exemples de DMP de Permutive et d’Adobe) :
requestBuilder.dmpSegments = @{@"permutive": @[@1234,@5679], @"adobe": @[@4321,@8765]}
Par exemple :
// Create a TDAdRequestBuilder to build the request string
TDAdRequestURLBuilder *requestBuilder = [TDAdRequestURLBuilder builderWithHostURL:kRequestUrl];
//Add DMP Segments
requestBuilder.dmpSegments = @{@"permutive": @[@1234,@5679], @"adobe": @[@4321,@8765]};
requestBuilder.stationId = 12345;
// Create a TDInterstitialAd
self.interstitial = [[TDInterstitialAd alloc] init];
// Create a TDAdLoader to load the ad from the request
self.adLoader = [[TDAdLoader alloc] init];
[self.adLoader loadAdWithBuilder:requestBuilder completionHandler:^(TDAd *loadedAd, NSError *error) {
if (error) {
// Handle error
} else {
// Load the ad into the interstitial
[self.videoInterstitial loadAd:loadedAd];
}
}
];
TTags personnalisés - Lecteur
Les TTags personnalisées (par exemple, mobile:ford
) peuvent être appliquées aux URL de streaming en ajoutant un tableau au paramètre réglages. SettingsTtagKey
.
TTags personnalisés - Exemple de lecteur
NSDictionary *settings = @{SettingsStationNameKey : @"MOBILEFM",
SettingsBroadcasterKey : @"Triton Digital",
SettingsTtagKey : @[@"mobile:ios",@"chips:salsa"],
SettingsMountKey : @"MOBILEFM_AACV2"
};
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
...
[self.tritonPlayer play];
TTags personnalisés - Publicité interstitielle
Les TTags personnalisées (par exemple, mobile: ford
) peut être appliqué aux URL des publicités interstitielles en ajoutant les TTags NSArray dans le champ TDAdRequestURLBuilder
l'objet
Tags Triton personnalisés - Exemple de pub interstitielle
// Create a TDAdRequestBuilder to build the request string
TDAdRequestURLBuilder *request = [TDAdRequestURLBuilder builderWithHostURL:kRequestUrl];
request.stationId = 12345;
request.TTags = @[ "mobile:ios", "cola:diet" ];
// Create a TDInterstitialAd
self.interstitial = [[TDInterstitialAd alloc] init];
// Create a TDAdLoader to load the ad from the request
self.adLoader = [[TDAdLoader alloc] init];
[self.adLoader loadAdWithBuilder:requestBuilder completionHandler:^(TDAd *loadedAd, NSError *error) {
if (error) {
// Handle error
} else {
// Load the ad into the interstitial
[self.videoInterstitial loadAd:loadedAd];
}
}
];
Identifiant multi-auditeur
Permet d’envoyer plusieurs identifiants d’utilisateur ou d’appareil, en plus de l’identifiant principal de l’auditeur (lsid
paramètre). Ce dernier est toujours utilisé par Triton pour le plafonnement de fréquence, la mesure, etc., tandis que les autres identifiants peuvent être fournis à des plateformes de demande tierces afin d’améliorer la monétisation.
Les valeurs de StreamParamExtraListenerIdType
Sont :
ppid
idfa
gaid
app
La valeur de StreamParamExtraListenerIdValue
peut être ce que vous décidez.
Exemple :
NSDictionary *settings = @{SettingsStationNameKey : @"BASIC_CONFIG",
SettingsBroadcasterKey : @"Triton Digital",
SettingsMountKey : @"TRITONRADIOMUSIC",
SettingsEnableLocationTrackingKey : @(YES),
SettingsStreamParamsExtraKey : @{@"banners": @"300x50,320x50"},
SettingsTtagKey : @[@"mobile:ios", @"triton:sample"],
StreamParamExtraListenerIdType: @"idfa",
StreamParamExtraListenerIdValue: @"triton-app-id",
};
[self.tritonPlayer updateSettings:settings];
[self.tritonPlayer play];
Faible délai et mise en mémoire tampon adaptative
Quand il est défini sur -1 / AUTO MODE
le SDK utilise une petite fenêtre de mémoire tampon (deux secondes) lors de la connexion initiale, ce qui réduit le délai entre la lecture instantanée et le temps réel. (Ceci est utile pour les événements sportifs, les concours en direct, etc.)
Comme la connexion a une petite fenêtre de mémoire tampon, en cas d'encombrement du réseau ou de faible bande passante, la mémoire tampon sera multipliée par deux si l'appareil ne peut pas maintenir une connexion correcte.
SI une valeur supérieure à zéro est définie (>0
) le SDK mettra en mĂ©moire tampon autant de secondes d’audio avant de commencer la lecture.Â
Utilisez SettingsLowDelayKey
avec un objet NSNumber pour cette fonctionnalité. Valeurs valides : -1
(AUTO mode), 0
(Désactivé), 2
pour 60
secondes.
Par défaut la fonctionnalité est désactivée ( 0
).
Exemple de temps de retard faible iOS
NSNumber *delayValue = [NSNumbernumberWithInt:2];
NSDictionary *settings = @{SettingsStationNameKey : @"MOBILEFM",
SettingsBroadcasterKey : @"Triton Digital",
SettingsLowDelayKey : delayValue,
SettingsMountKey : @"MOBILEFM_AACV2"
};
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
...
[self.tritonPlayer play];
Recevoir des informations sur l'historique de lecture
TDCuePointHistory
est utilisée pour accéder aux informations sur l'historique de lecture à partir des serveurs Triton. Cela renvoie une liste de CuePointEvents
pour un montage spécifique. Cela permet également la spécification de filtres et la limitation du nombre maximum d'éléments retournés.
@property (strong, nonatomic) TDCuePointHistory *cuePointHistory;
...
NSString *mount = @"MOBILEFM_AACV2";
NSInteger maxItems = 20;
NSArray *filter = @[EventTypeTrack, EventTypeAd];
// Request the history list from the server. The result will be a NSArray of CuePointEvent objects.
[self.cuePointHistory requestHistoryForMount:mount withMaximumItems:maxItems eventTypeFilter:filter completionHandler:^(NSArray *historyItems, NSError *error) {
if (error) {
// Handle the error
}
// Process the cue point list. Ex. display them in a UITableView
self.cuePointList = historyItems;
[self.tableView reloadData];
...
}];
Timeshift
Pour plus d’informations sur Timeshift Radio, consultez la fonction spécification de streaming
Pour utiliser Timeshift, vous devez utiliser un montage compatible avec Timeshift.
NSDictionary *settings = @{SettingsStationNameKey : @"BASIC_CONFIG",
SettingsBroadcasterKey : @"Triton Digital",
SettingsMountKey : TRITONRADIOMUSICAAC_RW,
SettingsEnableLocationTrackingKey : @(YES),
SettingsTtagKey : @[@"mobile:ios", @"triton:sample"],
StreamParamExtraListenerIdType: @"idfa",
StreamParamExtraListenerIdValue: @"triton-app-id",
};
Fonction de recherche (vers l’avant ou vers l’arrière) :
Ajouter ou supprimer du temps de l’heure de lecture actuelle.
Pour rechercher vers l’avant, utilisez un NSTimeInterval positif.
Pour effectuer une recherche vers l’arrière, utilisez un NSTimeInterval négatif.
[self.tritonPlayer seekToTimeInterval:self.tritonPlayer.currentPlaybackTime - 30.0];
Example:
//Seek forward
self.playerViewController.forwardFiredBlock = ^(UIButton *button) {
[self.tritonPlayer seekToTimeInterval:self.tritonPlayer.currentPlaybackTime + 10.0];
};
Seek To Live :
Pour revenir au flux en direct, utilisez seekToLive
. Cela arrĂŞtera le flux Timeshift et se reconnectera au flux en direct.
[self.tritonPlayer seekToLive]
Obtenir des informations sur le flux cloud :
Pour obtenir les informations sur le flux cloud, appelez la getCloudStreamInfo
méthode et implémentez le didReceiveCloudStreamInfoEvent
Ă partir du TritonPlayerDelegate pour recevoir le rappel. Notez que pour que cela fonctionne, le flux Timeshift devait ĂŞtre lu. Nous travaillons sur une solution qui permettra cela Ă tout moment.
self.playerViewController.getCloudStreamInfoFiredBlock = ^(UIButton *button) {
[self.tritonPlayer getCloudStreamInfo];
};
- (void)player:(TritonPlayer *)player didReceiveCloudStreamInfoEvent:(NSDictionary *)cloudStreamInfoEvent {
NSObject *programs = [cloudStreamInfoEvent valueForKey:@"programs"];
if([programs isKindOfClass:[NSDictionary class]]){
NSObject *properties = [(NSDictionary *)programs valueForKey:@"properties"];
NSString *title = [(NSDictionary *)properties valueForKey:@"program_title"];
dispatch_async(dispatch_get_main_queue(), ^{
self.playerViewController.btnTimeshiftProgram.enabled = YES;
self.playerViewController.btnTimeshiftProgram.hidden = NO;
[self.playerViewController.btnTimeshiftProgram setTitle:title forState:UIControlStateNormal];
self.cloudProgramId = [(NSDictionary *)programs valueForKey:@"program_episode_id"];
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
self.playerViewController.btnTimeshiftProgram.enabled = NO;
self.playerViewController.btnTimeshiftProgram.hidden = NO;
[self.playerViewController.btnTimeshiftProgram setTitle:@"No Programs" forState:UIControlStateNormal];
});
}
}
Lecture d’un programme :
Pour lire un programme spécifique, appelez playCloudProgram
avec la program_episode_id
comme paramètre.
self.playerViewController.timeshiftProgramFiredBlock = ^(UIButton *button) {
[self.tritonPlayer playCloudProgram:self.cloudProgramId];
};
Paramètre Dist
Pour utiliser le dist
le paramètre avec Timeshift, vous devez ajouter les deux paramètres de timeshifting :
SettingsStreamParamsExtraKey : @{StreamParamExtraDist:@"the-dist",
StreamParamExtraDistTimeshift:@"timeshift-dist”}
Le
StreamParamExtraDist:@"the-dist",
est utilisé lorsque le flux est connecté en mode Live.Le
StreamParamExtraDistTimeshift:@"timeshift-dist”,
est utilisé lorsque le flux est en mode Timeshift.
Voici ci-dessous un exemple pour savoir comment ajouter les paramètres.
NSDictionary *settings = @{SettingsStationNameKey : @"MOBILEFM",
SettingsBroadcasterKey : @"Triton Digital",
SettingsMountKey : @"MOBILEFM_AACV2",
SettingsStreamParamsExtraKey : @{
StreamParamExtraDist:@"the-dist",
StreamParamExtraDistTimeshift:@"timeshift-dist"
},
};
self.tritonPlayer = [[TritonPlayer alloc] initWithDelegate:self andSettings:settings];
...
[self.tritonPlayer play];