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];Diffuser 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];Change 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.
This example changes the playback speed to 1.5 times the original speed:
(void)setPlaybackRate:{
[self.tritonPlayer changePlaybackRate:1.5];
}Diffuser lorsque le son est coupé
You can configure the behavior of the stream while the player is muted.
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.
You can add DMP Segment headers (as described in the Advertising Technical Specification) for live streaming, podcast, and on-demand by adding the following to the player settings, using examples from Permutive and Adobe DMPs:
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];Token Authorization (Self Signed)
For re-creation of the tokens on reconnect to work, either of the following parameters are required:
StreamParamExtraAuthorizationSecretKeyStreamParamExtraAuthorizationKeyId
If all of the parameters are filled in, then you don't have to generate the token yourself (although you can if you want to).
// 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.)
}
}
...
@endAfficher 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
Interstitial ads, pre-rolls and mid-rolls, are full-screen ads that are displayed modally in an app. Usually they are displayed at natural app transition points such as before or after playing or changing a radio station.
// 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
}You can add an optional countdown timer to be displayed on an interstitial ad. To do this, enable the 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];
}
}
];You can add DMP Segment headers (as described in the Advertising Technical Specification) to interstitial ads as follows (using examples from Permutive and Adobe DMPs):
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];
}
}
];You can also specify bundle-id, store-id, et store-url for interstitial ads.
Exemple :
TDAdRequestURLBuilder *requestBuilder = [TDAdRequestURLBuilder builderWithHostURL:kRequestUrl];
requestBuilder.stationId = 12345;
// Add bundle-id, store-id and store-url
requestBuilder.bundleId = @"com.tritondigital.tritonradio";
requestBuilder.storeId = @"1234567890";
requestBuilder.storeUrl = [@"https://apps.apple.com/us/app/demoapp/id1234567890" stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
// 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 :
ppididfagaidapp
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]; Receive Now Playing History Information
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",
};Seek Forward or Backward
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]
Get Cloud Stream Info
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];
});
}
}Play a Program
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 paramètre avec Timeshift, vous avez besoin d'ajouter tous les paramètres de décalage temporel :
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];