Cette rubrique décrit l'utilisation des fonctionnalités avancées du SDK ApsaraVideo Player pour iOS. Pour un guide complet de toutes les fonctionnalités, consultez la référence API.
Pour tester la démo, téléchargez-la et suivez les instructions de la section Exécuter la démo afin de la compiler et de l'exécuter.
Vérification des fonctionnalités avancées
Certaines fonctionnalités du lecteur nécessitent une licence Édition Professionnelle. Pour plus d'informations, consultez Fonctionnalités. Pour obtenir une licence, reportez-vous à Obtenir une licence.
Configurez le listener au démarrage de l'application ou avant tout appel d'API du lecteur :
void premiumVeryfyCallback(AVPPremiumBizType biztype, bool isValid, NSString* errorMsg) {
NSLog(@"onPremiumLicenseVerifyCallback: %d, isValid: %d, errorMsg: %@", biztype, isValid, errorMsg);
}
[AliPrivateService setOnPremiumLicenseVerifyCallback:premiumVeryfyCallback];
Ici, AVPPremiumBizType est une énumération des fonctionnalités avancées. Lorsque vous utilisez une fonctionnalité avancée, le lecteur vérifie la licence et renvoie le résultat via ce callback. Si isValid est faux, errorMsg contient la raison de l'échec.
Lecture
Lecture en liste
Le SDK Player pour iOS offre une fonctionnalité complète de lecture en liste, adaptée aux scénarios de vidéos courtes. Elle exploite des techniques telles que le préchargement pour réduire considérablement le délai d'affichage de la première image (TTTF).
Pour une expérience de lecture en liste améliorée, envisagez d'utiliser notre solution dédiée aux mini-séries. Pour plus de détails, consultez Développement côté client pour les mini-séries.
Lire des vidéos avec un canal alpha
Vue d'ensemble
Le SDK ApsaraVideo Player prend en charge le rendu du canal alpha pour créer des effets dynamiques, tels que des cadeaux animés. Dans une salle de diffusion en direct, vous pouvez superposer ces effets animés au contenu principal afin d'améliorer significativement l'expérience utilisateur.
Limites
Le rendu du canal alpha est pris en charge dans le SDK tout-en-un version 6.8.0 ou ultérieure, ou dans le SDK ApsaraVideo Player version 6.9.0 ou ultérieure.
Avantages
L'utilisation de vidéos MP4 avec canal alpha pour les effets animés offre une meilleure qualité d'animation, une taille de fichier réduite, une compatibilité accrue et une plus grande efficacité de développement.
Meilleure qualité d'animation : Les vidéos MP4 préservent les détails et les couleurs de l'animation originale plus fidèlement que d'autres formats tels que APNG ou IXD.
Taille de fichier réduite : Les fichiers MP4 peuvent être compressés plus efficacement que d'autres formats comme APNG ou IXD, ce qui améliore les vitesses de chargement et réduit la consommation de bande passante réseau.
Compatibilité supérieure : En tant que format vidéo universel, le MP4 est largement pris en charge par la plupart des appareils et navigateurs.
Efficacité de développement accrue : L'implémentation est simple et ne nécessite pas que les développeurs construisent une logique complexe d'analyse ou de rendu. Ils peuvent ainsi se concentrer sur d'autres fonctionnalités.
Exemple de code
Rendu Metal
Le SDK Alibaba Cloud Player pour iOS prend en charge le rendu vidéo via le framework Metal.
Actuellement, le rendu Metal prend uniquement en charge la couleur d'arrière-plan, le mode de mise à l'échelle et l'image dans l'image (PiP).
Paramètre
/**
@brief Specifies the video render type. Valid values: 0 (default renderer) and 1 (mixed renderer). Default: 0.
*/
@property(nonatomic, assign) int videoRenderType;
Exemple
AVPConfig *config = [self.player getConfig];
// Enable Metal rendering.
config.videoRenderType = 1;
[self.player setConfig:config];
[self.player prepare];
Sous-titres externes
Pour un exemple de code détaillé, consultez le module ExternalSubtitle dans le projet API-Example. Ce projet d'exemple en Objective-C montre comment intégrer les fonctionnalités principales du SDK ApsaraVideo Player pour iOS.
Le SDK ApsaraVideo Player pour iOS permet d'ajouter et de changer des sous-titres externes aux formats SRT, SSA, ASS et VTT.
L'exemple suivant montre comment mettre en œuvre cette fonctionnalité.
-
Créez une vue pour afficher les sous-titres.
Créez une vue adaptée au format des sous-titres.
// Initialize a custom subTitleLabel. UILabel *subTitleLabel = [[UILabel alloc] initWithFrame:frame]; // Add the subtitle label to a custom superView. [superView addSubview:subTitleLabel]; -
Configurez les listeners liés aux sous-titres.
// Called when an external subtitle track is added. - (void)onSubtitleExtAdded:(AliPlayer*)player trackIndex:(int)trackIndex URL:(NSString *)URL {} // Callback for the subtitle header. - (void)onSubtitleHeader:(AliPlayer *)player trackIndex:(int)trackIndex Header:(NSString *)header{} // Called when a subtitle is displayed. - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle { subTitleLabel.text =subtitle; subTitleLabel.tag =subtitleID; } // Called when a subtitle is hidden. - (void)onSubtitleHide:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID{ [subTitleLabel removeFromSuperview]; } -
Ajoutez une piste de sous-titres.
[self.player addExtSubtitle:URL]; -
Changez de piste de sous-titres.
[self.player selectExtSubtitle:trackIndex enable:YES];
Sous-titres externes (rendu personnalisé)
Grâce à AliVttSubtitleView et AliVttRenderImpl, cette fonctionnalité prend pleinement en charge les sous-titres externes WebVTT et permet de personnaliser des styles tels que la police, la couleur et la taille.
Cas d'utilisation :
Vous souhaitez personnaliser les styles des sous-titres WebVTT, tels que la police, la couleur et la taille.
Votre intégration utilise le SDK Alibaba Cloud Player v7.11.0 ou ultérieur ainsi que AliVttSubtitleView.
Prise en charge des sous-titres multilingues (comme l'arabe, le chinois, le japonais et le coréen) avec association automatique des polices correspondantes.
Prérequis :
Vous avez ajouté les fichiers de police requis (.ttf) à votre projet Xcode.
Vous avez configuré un listener de sous-titres pour recevoir le contenu WebVTT.
Les polices requises sont chargées via l'appel de la méthode loadFontFromBundle.
Personnaliser les styles de sous-titres
-
Créez une classe d'implémentation de rendu personnalisée héritant d'AliVttRenderImpl.
// CustomFontVttRenderImpl.h @interface CustomFontVttRenderImpl : AliVttRenderImpl @end // CustomFontVttRenderImpl.m @implementation CustomFontVttRenderImpl // Optional: Override the font generation logic. - (UIFont *)customizeFont:(UIFont *)originalFont contentAttribute:(VttContentAttribute *)contentAttribute contentText:(NSString *)text { // Example: Automatically select a font based on the content. if ([self containsArabicCharacters:text]) { return [UIFont fontWithName:@"NotoSansArabic-Regular" size:originalFont.pointSize]; } if ([self containsCJKCharacters:text]) { return [UIFont fontWithName:@"NotoSansCJKsc-Regular" size:originalFont.pointSize]; } return originalFont; } // Optional: Force a specific color. - (void)applyColorStyle:(NSMutableDictionary *)attrs contentAttribute:(VttContentAttribute *)contentAttribute { // Force the color to red. attrs[NSForegroundColorAttributeName] = [UIColor redColor]; } // Optional: Enlarge the font. - (void)applyFontStyle:(NSMutableDictionary *)attrs contentAttribute:(VttContentAttribute *)contentAttribute context:(RenderContext *)context { CGFloat originalSize = contentAttribute.fontSizePx / context.contentsScale; CGFloat newSize = originalSize * 2.0; // Enlarge by 2x. UIFont *font = [self generateFontWithName:contentAttribute.fontName fontSize:newSize isBold:contentAttribute.mBold isItalic:contentAttribute.mItalic]; attrs[NSFontAttributeName] = font; } // Helper: Detect Arabic characters. - (BOOL)containsArabicCharacters:(NSString *)text { for (NSUInteger i = 0; i < text.length; i++) { unichar c = [text characterAtIndex:i]; if ((c >= 0x0600 && c <= 0x06FF) || (c >= 0x0750 && c <= 0x077F)) { return YES; } } return NO; } // Helper: Detect CJK characters. - (BOOL)containsCJKCharacters:(NSString *)text { for (NSUInteger i = 0; i < text.length; i++) { unichar c = [text characterAtIndex:i]; if ((c >= 0x4E00 && c <= 0x9FFF) || // Chinese (c >= 0x3040 && c <= 0x309F) || // Japanese Hiragana (c >= 0xAC00 && c <= 0xD7AF)) { // Korean return YES; } } return NO; } @end -
(Facultatif) Chargez dynamiquement une police personnalisée.
- (void)loadCustomFontFromBundle:(NSString *)fontName { NSString *path = [[NSBundle mainBundle] pathForResource:fontName ofType:@"ttf"]; if (path) { NSData *fontData = [NSData dataWithContentsOfFile:path]; CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)fontData); CGFontRef fontRef = CGFontCreateWithDataProvider(provider); if (CTFontManagerRegisterGraphicsFont(fontRef, NULL)) { NSLog(@"Font registered successfully: %@", fontName); } else { NSLog(@"Font registration failed: %@", fontName); } CGFontRelease(fontRef); CGDataProviderRelease(provider); } } -
Initialisez la vue des sous-titres et liez le moteur de rendu personnalisé.
// Create the subtitle view. AliVttSubtitleView *subtitleView = [[AliVttSubtitleView alloc] init]; // Set the custom renderer factory. [subtitleView setRenderImplFactory:^AliVttRenderImpl*() { CustomFontVttRenderImpl *impl = [[CustomFontVttRenderImpl alloc] init]; // Optional: Preload a font. [impl loadCustomFontFromBundle:@"LongCang-Regular"]; return impl; }]; // Attach to the player. [player setExternalSubtitleView:subtitleView]; -
Gérez les callbacks de sous-titres du lecteur.
Implémentez les méthodes suivantes sur votre AVPDelegate :
// Subtitle header (contains style and region definitions). - (void)onSubtitleHeader:(AliPlayer *)player trackIndex:(int)trackIndex Header:(NSString *)header { [self.subtitleView setVttHeader:player trackIndex:trackIndex Header:header]; } // Show the subtitle. - (void)onSubtitleShow:(AliPlayer *)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle { [self.subtitleView show:player trackIndex:trackIndex subtitleID:subtitleID subtitle:subtitle]; } // Hide the subtitle. - (void)onSubtitleHide:(AliPlayer *)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID { [self.subtitleView hide:player trackIndex:trackIndex subtitleID:subtitleID]; } // Subtitle track added successfully. Use this callback to enable the track. - (void)onSubtitleExtAdded:(AliPlayer *)player trackIndex:(int)trackIndex URL:(NSString *)URL { [player selectExtSubtitle:trackIndex enable:YES]; }
Lecture audio uniquement
Pour activer la lecture audio uniquement, désactivez la piste vidéo. Configurez PlayerConfig avant d'appeler prepare.
AVPConfig *config = [self.player getConfig];
config.disableVideo = YES;
[self.player setConfig:config];
Changement de décodeur
Le SDK Player pour iOS prend en charge le décodage matériel pour H.264 et H.265. Cette fonctionnalité est activée par défaut et contrôlée par la propriété enableHardwareDecoder. Si l'initialisation du décodage matériel échoue, le lecteur bascule automatiquement vers le décodage logiciel pour garantir la poursuite de la lecture.
// Enable hardware decoding (enabled by default).
self.player.enableHardwareDecoder = YES;
Lorsque le lecteur passe automatiquement du décodage matériel au décodage logiciel, il déclenche le callback onPlayerEvent, comme illustré dans l'exemple suivant :
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_SWITCH_TO_SOFTWARE_DECODER) {
// Switched to software decoding.
}
}
Lecture adaptative H.265
Si le modèle d'appareil figure sur la liste de blocage H.265 basée sur le cloud ou si le décodage matériel H.265 échoue, un mécanisme de repli adaptatif se déclenche. Si un flux de secours H.264 est configuré, le lecteur le lance automatiquement. Sinon, le lecteur revient au décodage logiciel H.265.
Cette fonctionnalité n'est disponible qu'après activation du service de décodage adaptatif natif cloud. Vous devrez soumettre un formulaire Yida pour demander une licence.
Le service de décodage adaptatif natif cloud fournit deux capacités principales : 1. Distribution dynamique des données de compatibilité de décodage matériel depuis le cloud. 2. Repli adaptatif des flux H.265 vers H.264.
Le SDK peut toujours basculer automatiquement vers le décodage logiciel en cas d'échec du décodage matériel, même sans ce service à valeur ajoutée.
L'exemple suivant montre comment définir un flux de secours :
// The application layer should maintain a dictionary to map original URLs to their backup URLs.
NSString* getBackupUrlCallback(AVPBizScene scene, AVPCodecType codecType, NSString* oriurl){
NSMutableDictionary *globalMap = [AliPlayerViewController getGlobalBackupUrlMap];
NSString *backupUrl = globalMap[oriurl];
return backupUrl;
}
[AliPlayerGlobalSettings setAdaptiveDecoderGetBackupURLCallback:getBackupUrlCallback];
Streaming à débit binaire adaptatif
Vous pouvez générer des flux adaptatifs multi-débits à l'aide d'un groupe de modèles de conditionnement et de transcodage vidéo dans ApsaraVideo VOD. Pour plus d'informations, consultez Configurer le streaming à débit binaire adaptatif pour ApsaraVideo VOD.
-
Pour lire des flux adaptatifs depuis ApsaraVideo VOD avec la méthode de lecture VidAuth, définissez la liste des définitions sur
AUTO. Sinon, le lecteur sélectionne par défaut un flux basse définition. Pour plus d'informations sur l'ordre de lecture par défaut des définitions, consultez Si une vidéo est transcodée en plusieurs définitions, quelle définition le SDK ApsaraVideo Player lit-il par défaut ? L'exemple suivant montre comment procéder :AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.definitions = @"AUTO";
Le SDK ApsaraVideo Player pour iOS prend en charge les flux adaptatifs multi-débits. Une fois la méthode prepare exécutée avec succès, vous pouvez appeler la méthode getMediaInfo pour obtenir les informations TrackInfo de chaque flux.
AVPMediaInfo *info = [self.player getMediaInfo];
NSArray<AVPTrackInfo*>* tracks = info.tracks;
Pendant la lecture, vous pouvez changer de flux en appelant la méthode selectTrack du lecteur. Pour activer le streaming à débit binaire adaptatif, passez SELECT_AVPTRACK_TYPE_VIDEO_AUTO.
// Switch to a specific stream.
[self.player selectTrack:track.trackIndex];
// Enable adaptive bitrate streaming.
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];
Le callback onTrackChanged confirme le changement de flux.
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
if (info.trackType == AVPTRACK_TYPE_VIDEO) {
// The video track has changed.
}
// etc
}
Facultatif : Avant d'appeler la méthode selectTrack pour activer le streaming à débit binaire adaptatif, vous pouvez plafonner la définition vidéo pour empêcher le lecteur de basculer vers un débit binaire inattendu élevé. Appliquez cette configuration avant d'appeler la méthode prepare ou la méthode moveTo pour la lecture en liste.
AVPConfig *config = [self.player getConfig];
config.maxAllowedAbrVideoPixelNumber = 921600; // Set the maximum pixel count for ABR to 921600 (1280 * 720). This ensures that the player only switches to definitions with a pixel count less than or equal to this value.
[self.player setConfig:config];
Capture d'écran
Le SDK Player pour iOS offre une fonctionnalité permettant de prendre une capture d'écran de la vidéo en cours. Cette fonctionnalité est implémentée par l'API snapShot. Elle capture les données brutes et les renvoie sous forme de bitmap. Le callback associé est onCaptureScreen. Voici un exemple :
// Snapshot callback
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
// Process the snapshot.
}
// Take a snapshot of the current frame.
[self.player snapShot];
La capture d'écran n'inclut pas l'interface utilisateur.
Prévisualisation
Le SDK ApsaraVideo Player pour iOS prend en charge une fonctionnalité de prévisualisation lorsqu'il est configuré avec ApsaraVideo VOD. Le SDK supporte la lecture via VidSts et VidAuth. La méthode VidAuth est recommandée. Pour plus d'informations, consultez Prévisualiser des vidéos.
Après avoir configuré la fonctionnalité de prévisualisation, utilisez la méthode setPreviewTime de l'interface VidPlayerConfigGen pour définir la durée de prévisualisation du lecteur. Voici un exemple de lecture VidSts :
AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
....
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setPreviewTime:20]; // 20-second preview
source.playConfig = [vp generatePlayerConfig]; // Apply the configuration to the playback source.
...
Lorsque vous définissez une durée de prévisualisation et utilisez le SDK Player iOS pour lire une vidéo, le serveur renvoie uniquement le contenu vidéo correspondant à la période de prévisualisation, et non la vidéo complète.
Vous pouvez utiliser la classe VidPlayerConfigGenerator pour définir les paramètres de requête côté serveur. Pour plus d'informations, consultez Descriptions des paramètres de requête.
Définir le Referer
Le SDK Player pour iOS permet de définir le Referer pour mettre en œuvre un contrôle d'accès. Cette fonctionnalité s'articule avec les listes de blocage et d'autorisation de Referer que vous configurez dans la console ApsaraVideo VOD. Vous pouvez définir le Referer dans l'objet AVPConfig, comme illustré dans l'exemple suivant :
// Get the configuration.
AVPConfig *config = [self.player getConfig];
// Set the Referer.
config.referer = referer;
....// Other settings.
// Apply the configuration to the player.
[self.player setConfig:config];
User-Agent
Le SDK Player iOS fournit AVPConfig pour définir un User-Agent personnalisé, que le lecteur inclura ensuite dans toutes les requêtes réseau ultérieures. L'exemple suivant montre comment procéder :
// Get the current configuration.
AVPConfig *config = [self.player getConfig];
// Set the User-Agent.
config.userAgent = userAgent;
//... other settings
// Apply the configuration to the player.
[self.player setConfig:config];
Configurer le nombre de tentatives réseau et le délai d'expiration
Pour configurer le délai d'expiration réseau et le nombre de tentatives pour le SDK Player iOS, utilisez l'objet AVPConfig. Par exemple :
// Get the configuration.
AVPConfig *config = [self.player getConfig];
// Set the network timeout in milliseconds.
config.networkTimeout = 5000;
// Set the maximum number of retries. The retry interval is determined by networkTimeout. A value of 0 disables retries, allowing the application to implement its own retry policy. The default is 2.
config.networkRetryCount = 2;
//... Other settings
// Apply the configuration to the player.
[self.player setConfig:config];
Si
networkRetryCountest supérieur à 0, le lecteur effectue jusqu'ànetworkRetryCounttentatives lorsqu'un problème réseau survient pendant le chargement. L'intervalle entre les tentatives est déterminé parnetworkTimeout.Si le lecteur ne parvient pas à charger le contenu après toutes les tentatives, le callback
onErrorest déclenché, et AVPErrorModel.code prend la valeur ERROR_LOADING_TIMEOUT.Si
networkRetryCountest égal à 0, un délai d'expiration réseau déclenche le callbackonPlayerEventavec le paramètreeventWithStringdéfini surEVENT_PLAYER_NETWORK_RETRY. Vous pouvez alors appeler la méthodereloaddu lecteur pour réessayer la requête réseau ou effectuer d'autres actions.
Contrôle du cache et de la latence
La gestion du cache est essentielle pour garantir des performances optimales du lecteur. Une configuration appropriée permet d'accélérer le démarrage et de réduire les saccades. Le Player SDK for iOS fournit des interfaces permettant de configurer les paramètres de cache et de latence via l'objet AVPConfig :
// Retrieve the configuration.
AVPConfig *config = [self.player getConfig];
// The maximum latency in milliseconds. Note: This parameter is for live streaming only. If latency becomes high, the Player SDK synchronizes frames to keep it within this limit.
config.maxDelayTime = 5000;
// The maximum duration (in milliseconds) of data that the player can buffer.
config.maxBufferDuration = 50000;
// The high buffer duration in milliseconds. When network conditions are poor, the player stops loading data once the buffer reaches this duration.
config.highBufferDuration = 3000;
// The startup buffer duration in milliseconds. A smaller value results in a faster startup speed but may cause stuttering shortly after playback starts.
config.startBufferDuration = 500;
// Other settings.
// Apply the configuration to the player.
[self.player setConfig:config];
Les durées de mise en mémoire tampon doivent respecter la relation suivante : startBufferDuration ≤ highBufferDuration ≤ maxBufferDuration.
Si la durée maximale de mise en mémoire tampon (maxBufferDuration) dépasse 5 minutes, le système applique automatiquement une limite de 5 minutes afin d'éviter les exceptions de mémoire liées à un tampon excessivement volumineux.
Définir les en-têtes HTTP
Utilisez l'objet AVPConfig pour ajouter des en-têtes HTTP aux requêtes du lecteur :
// Get the configuration.
AVPConfig *config = [self.player getConfig];
// Define the headers.
NSMutableArray *httpHeaders = [[NSMutableArray alloc] init];
// For example, set the Host header when you use HTTPDNS.
[httpHeaders addObject:@"Host:example.com"];
// Set the headers.
config.httpHeaders = httpHeaders;
....// Other settings.
// Apply the configuration to the player.
[self.player setConfig:config];
Image dans l'image
Consultez le module PictureInPicture du projet API-Example pour obtenir des exemples de code détaillés. Ce projet d'exemple en Objective-C illustre l'intégration des fonctionnalités principales du Player SDK for iOS d'Alibaba Cloud.
La fonctionnalité image dans l'image (PiP) nécessite iOS 15 ou version ultérieure ainsi que l'ApsaraVideo Player SDK for iOS 5.4.9.0 ou version ultérieure.
Les versions de l'ApsaraVideo Player SDK for iOS antérieures à la 5.5.2.0 offrent uniquement des méthodes pour activer ou désactiver le mode PiP et afficher la fenêtre PiP lorsque l'application passe en arrière-plan. À partir de la version 5.5.2.0, il est également possible de définir un délégué PiP externe afin de personnaliser le comportement du mode image dans l'image.
Pour utiliser le mode PiP, assurez-vous qu'il est activé dans les réglages de votre appareil (Réglages > Général > Image dans l'image).
Activer le mode PiP
Une fois le mode image dans l'image activé, la vidéo continue de s'afficher dans une petite fenêtre lorsque l'application passe en arrière-plan. Au retour de l'application au premier plan, la vidéo reprend sa place dans son affichage d'origine. Pour activer ce mode, appelez setPictureInPictureEnable après que le lecteur a atteint l'état AVPEventPrepareDone. L'exemple suivant illustre cette procédure :
- (void)onPlayerEvent:(AliPlayer *)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventPrepareDone:
{
[self.player setPictureInPictureEnable:YES];
}
break;
default:
break;
}
}
L'appel de la méthode stop du lecteur ne ferme pas automatiquement la fenêtre image dans l'image. Par conséquent, vous devez désactiver le mode PiP en appelant setPictureInPictureEnable avant d'invoquer stop.
Définir le délégué PiP
Les exemples de code suivants présentent les interactions courantes entre la fenêtre image dans l'image (PiP) et celle du lecteur. Ils couvrent l'affichage des commandes de lecture telles que pause, lecture, avance rapide et retour arrière, ainsi que la mise en œuvre de la logique de relecture. Pour une référence complète des méthodes du délégué, consultez le fichier d'en-tête AliPlayerPictureInPictureDelegate.h, situé dans AliyunPlayer.framework au sein du dossier SDK de la démo du SDK lecteur.
-
Configurez le délégué pour le mode image dans l'image.
/** * @brief Sets the delegate for Picture-in-Picture events. */ -(void) setPictureinPictureDelegate:(id<AliPlayerPictureInPictureDelegate>)delegate; // Set the Picture-in-Picture delegate. [self.player setPictureinPictureDelegate:self]; -
Ajoutez des propriétés et implémentez les méthodes du délégué.
-
Ajoutez des propriétés à votre contrôleur de vue pour gérer l'état du lecteur et de la fenêtre image dans l'image.
#import "YourUIViewController.h" #import <AliyunPlayer/AliyunPlayer.h> @interface YourUIViewController () <AVPDelegate, AliPlayerPictureInPictureDelegate> // The player instance. @property (nonatomic, strong) AliPlayer *player; // The container view for the player. @property (nonatomic, strong) UIView *playerView; // Tracks whether the Picture-in-Picture window is paused. @property (nonatomic, assign) BOOL isPipPaused; // Tracks the current playback status of the player, updated by the onPlayerStatusChanged:oldStatus:newStatus: callback. @property (nonatomic, assign) AVPStatus currentPlayerStatus; // A weak reference to the picture-in-picture controller. This is set in the pictureInPictureControllerWillStartPictureInPicture: callback and should be set to nil before the view controller is deallocated. Using a weak reference is recommended. @property (nonatomic, weak) AVPictureInPictureController *pipController; // Tracks playback progress, updated by the 'position' parameter in the playback progress callback. @property (nonatomic, assign) int64_t currentPosition; @endRemarqueLa propriété
pipControllerdoit être déclarée avec un attributweakouassignafin d'éviter les cycles de rétention. Si vous utilisezassign, veillez à définir manuellement la propriété surnilau moment approprié. -
Dans votre méthode déléguée
onPlayerStatusChanged:, notifiez le contrôleur image dans l'image afin qu'il mette à jour son état.- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus { self.currentPlayerStatus = newStatus; if (_pipController) { [self.pipController invalidatePlaybackState]; } } -
Dans votre méthode déléguée
onPlayerEvent:, mettez à jour l'état du mode image dans l'image en réponse aux événements de lecture.- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType { if (eventType == AVPEventCompletion) { if (_pipController) { self.isPipPaused = YES; // When playback finishes, set the PiP state to paused. [self.pipController invalidatePlaybackState]; } } else if (eventType == AVPEventSeekEnd) { // The seek operation is complete. if (_pipController) { [self.pipController invalidatePlaybackState]; } } } -
Implémentez les méthodes du délégué.
-
Implémentez le rappel déclenché juste avant le démarrage du mode image dans l'image.
/** @brief Tells the delegate that Picture-in-Picture is about to start. @param pictureInPictureController The picture-in-picture controller. */ - (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController { if (!_pipController) { self.pipController = pictureInPictureController; } self.isPipPaused = !(self.currentPlayerStatus == AVPStatusStarted); [pictureInPictureController invalidatePlaybackState]; } -
Implémentez le rappel déclenché juste avant l'arrêt du mode image dans l'image.
/** @brief Tells the delegate that Picture-in-Picture is about to stop. @param pictureInPictureController The picture-in-picture controller. */ - (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController { self.isPipPaused = NO; [pictureInPictureController invalidatePlaybackState]; } -
Implémentez le rappel permettant de restaurer l'interface utilisateur avant l'arrêt du mode image dans l'image.
/** @brief Tells the delegate to restore the user interface before Picture-in-Picture stops. @param pictureInPictureController The picture-in-picture controller. @param completionHandler A completion handler to call with YES to allow the system to complete the restoration. */ - (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler { if (_pipController) { _pipController = nil; } completionHandler(YES); } -
Implémentez le rappel qui fournit la plage de temps de lecture disponible.
/** @brief Asks the delegate for the current playable time range. @param pictureInPictureController The picture-in-picture controller. @return The current playable time range. */ - (CMTimeRange)pictureInPictureControllerTimeRangeForPlayback:(nonnull AVPictureInPictureController *)pictureInPictureController layerTime:(CMTime)layerTime{ Float64 current64 = CMTimeGetSeconds(layerTime); Float64 start; Float64 end; if (currentPosition <= self.player.duration) { double curPostion = self.currentPosition / 1000.0; double duration = self.player.duration / 1000.0; double interval = duration - curPostion; start = current64 - curPostion; end = current64 + interval; CMTime t1 = CMTimeMakeWithSeconds(start, layerTime.timescale); CMTime t2 = CMTimeMakeWithSeconds(end, layerTime.timescale); return CMTimeRangeFromTimeToTime(t1, t2); } else { return CMTimeRangeMake(kCMTimeNegativeInfinity, kCMTimePositiveInfinity); } } -
Implémentez le rappel indiquant si la lecture est en pause.
/** @brief Asks the delegate whether playback is currently paused. @param pictureInPictureController The picture-in-picture controller. @return A Boolean value indicating whether playback is paused. */ - (BOOL)pictureInPictureControllerIsPlaybackPaused:(nonnull AVPictureInPictureController *)pictureInPictureController{ return self.isPipPaused; }RemarqueCe rappel est invoqué avant le lancement du mode image dans l'image. Il doit retourner
falseà ce stade pour permettre l'ouverture de la fenêtre PiP. Retournertrueempêche le démarrage du mode image dans l'image. -
Implémentez le rappel pour gérer les actions d'avance et de recul depuis les commandes du mode image dans l'image.
/** @brief Tells the delegate that the user has requested to skip forward or backward. @param pictureInPictureController The picture-in-picture controller. @param skipInterval The time interval to skip. @param completionHandler A completion handler that you must call after the seek operation is complete. */ - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController skipByInterval:(CMTime)skipInterval completionHandler:(nonnull void (^)(void))completionHandler { int64_t skipTime = skipInterval.value / skipInterval.timescale; int64_t skipPosition = self.currentPosition + skipTime * 1000; if (skipPosition < 0) { skipPosition = 0; } else if (skipPosition > self.player.duration) { skipPosition = self.player.duration; } [self.player seekToTime:skipPosition seekMode:AVP_SEEKMODE_INACCURATE]; [pictureInPictureController invalidatePlaybackState]; } -
Implémentez le rappel pour gérer les actions de lecture et de pause depuis les commandes du mode image dans l'image.
/** @brief Tells the delegate that the user has toggled the play/pause button. @param pictureInPictureController The picture-in-picture controller. @param playing A Boolean value indicating whether playback should start. */ - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController setPlaying:(BOOL)playing { if (!playing){ [self.player pause]; self.isPipPaused = YES; } else { // Tip: If you want the play button to restart the video after playback completes, add the following block. if (self.currentPlayerStatus == AVPStatusCompletion) { [self.player seekToTime:0 seekMode:AVP_SEEKMODE_ACCURATE]; } [self.player start]; self.isPipPaused = NO; } [pictureInPictureController invalidatePlaybackState]; }
-
-
Image dans l'image intégrée à l'application
Par défaut, le mode image dans l'image s'affiche en dehors de l'application. Pour mettre en œuvre un mode image dans l'image intégré à l'application, appelez d'abord l'interface suivante afin de vérifier si ce mode est actif :
/**
@brief Tells the delegate whether picture-in-picture is enabled.
@param pictureInPictureController The picture-in-picture controller reporting its state.
@param isEnable `YES` if picture-in-picture is enabled; `NO` otherwise.
*/
- (void)pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *)pictureInPictureController isEnable:(BOOL)isEnable;
Pour désactiver le démarrage automatique et passer à une activation manuelle pendant l'exécution du mode image dans l'image, utilisez l'exemple de code suivant :
- (void) pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *) pictureInPictureController isEnable:(BOOL) isEnable
{
if (isEnable && pictureInPictureController) {
_pipController = pictureInPictureController;
// Disable pip auto-start.
if (@available(iOS 15.0, *)) {
_pipController.canStartPictureInPictureAutomaticallyFromInline = false;
}
} else {
_pipController = NULL;
}
}
- (void) switchPip:(bool) enable {
if (_pipController == nil) {
return;
}
if (enable) {
// Start pip.
[_pipController startPictureInPicture];
} else {
// Stop pip.
[_pipController stopPictureInPicture];
}
}
Repli RTS en direct
Pour des exemples de code détaillés, reportez-vous au module RtsLiveStream dans le projet API-Example. Ce projet d'exemple en Objective-C montre comment intégrer les fonctionnalités principales du Player SDK for iOS d'Alibaba Cloud.
Pour plus d'informations, consultez Lecture en direct RTS.
Changer de canal audio
Utilisez la propriété outputAudioChannel pour définir le canal audio de sortie. Si la source d'entrée est stéréo, vous pouvez basculer la sortie vers le canal audio gauche ou droit. Ce paramètre reste sans effet lorsque la source d'entrée est mono.
Le réglage du canal audio de sortie affecte à la fois le rendu audio et le rappel des données PCM.
// Set the output audio channel using an AVPOutputAudioChannel enumeration value.
// AVP_AUDIO_CHANNEL_NONE: Plays the original audio channels from the input source. This is the default value.
// AVP_AUDIO_CHANNEL_LEFT: Plays only the left audio channel.
// AVP_AUDIO_CHANNEL_RIGHT: Plays only the right audio channel.
self.player.outputAudioChannel = AVP_AUDIO_CHANNEL_NONE;
Définir la couleur d'arrière-plan de la vidéo
Le Player SDK for iOS permet de définir la couleur d'arrière-plan de la vue de rendu.
Exemple d'API
/**
@brief
@param color the color
*/
/****
@brief Sets the video background color.
@param color The background color.
*/
-(void) setVideoBackgroundColor:(UIColor *)color;
Utilisation
// The parameter is an 8-digit hexadecimal value in ARGB format (alpha, red, green, blue).
// For example, 0x0000ff00 represents green.
[self.player setVideoBackgroundColor:0x0000ff00]
Spécifier un domaine de lecture avec VidAuth
Utilisez la méthode VidAuth pour spécifier des champs, tels que le domaine de lecture, associés à un identifiant vidéo (vid). Pour obtenir la liste des champs pris en charge, consultez Paramètres de requête GetPlayInfo.
Exemple d'API
/**
@brief Play a video by using the video ID and playback credential (PlayAuth). For more information, see: https://www.alibabacloud.com/help/en/vod/user-guide/use-playback-credentials-to-play-videos
@param source An AVPVidAuthSource object.
@see AVPVidAuthSource
*/
- (void)setAuthSource:(AVPVidAuthSource*)source;
Utilisation
Utilisez la méthode addVidPlayerConfigByStringValue de l'interface VidPlayerConfigGenerator pour ajouter le champ playDomain.
VidPlayerConfigGenerator* gen = [[VidPlayerConfigGenerator alloc]init];
// Add the playDomain field. For a list of supported fields, see:
// https://www.alibabacloud.com/help/en/vod/developer-reference/api-vod-2017-03-21-getplayinfo
[gen addVidPlayerConfigByStringValue:@"playDomain" value: @"com.example.xxx"];
[source setPlayConfig:[gen generatePlayerConfig]];
[self.player setAuthSource:source]:
Décodage en arrière-plan
Depuis la version 6.12.0, le SDK lecteur prend en charge le décodage en arrière-plan. L'activation de cette fonctionnalité permet au lecteur de continuer à décoder et à lire les flux vidéo, tout en déclenchant des rappels lorsque l'application s'exécute en arrière-plan. L'exemple suivant montre comment activer cette option :
// Set to 1 to enable background decoding or 0 to disable it. Default: 0.
[self.player setOption:ALLOW_DECODE_BACKGROUND valueInt:1];
Plugin de décodage H.266
Le codec H.266, également connu sous le nom de Versatile Video Coding (VVC), est une norme de codage vidéo de nouvelle génération offrant une qualité visuelle identique pour un débit binaire nettement inférieur. Afin d'optimiser les performances et de maîtriser la taille du SDK principal, le décodeur H.266 est fourni sous forme de plugin distinct que vous pouvez intégrer à la demande.
Prérequis
Player SDK ou all-in-one SDK V7.6.0 ou version ultérieure.
Vous disposez d'une licence Édition Professionnelle. Pour plus d'informations, consultez Obtenir une licence.
Le plugin de décodage H.266 pour le Player SDK prend uniquement en charge les vidéos H.266 transcodées par Alibaba Cloud Transcoding.
Intégrer le plugin
Activer le plugin
À partir de la version v7.7.0 du Player SDK for iOS, le plugin est activé par défaut et ne nécessite aucune activation manuelle.
[AliPlayerGlobalSettings enableCodecPlugin:@"vvc" valid:true];
Codes d'erreur
Pour les codes d'erreur liés au plugin de décodage H.266, consultez FAQ pour ApsaraVideo Player SDK.
Actualisation automatique de la source
Activez l'actualisation automatique de la source pour éviter les interruptions de lecture dues à l'expiration de l'authentification. Lorsqu'une source expire, le lecteur déclenche un rappel afin d'en obtenir une nouvelle, garantissant ainsi une lecture fluide et continue.
Prérequis
Le lecteur ou le SDK intégré doit être en version 7.9.0 ou ultérieure.
Utilisez une source VidAuth pour la lecture ou assurez-vous que la signature d'URL est configurée.
VidAuth source
Exemple d'API
/**
@brief Sets the callback for VidAuth source expiration notifications.
This callback is triggered when the player detects that the current VidAuth source has expired. A VidAuth source expires if its PlayAuth or playback URL has expired.
You can refresh the VidAuth source in this callback and pass the new object via the `callback` parameter to ensure smooth playback.
@param callback The callback block triggered when the VidAuth source expires.
Use this callback to update the player with a valid `VidAuth` object.
*/
-(void)setOnVidAuthExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;
Composants clés
Utilisation
Vous pouvez obtenir un PlayAuth en appelant l'opération GetVideoPlayAuth. Nous recommandons d'intégrer le SDK côté serveur pour VOD afin d'obtenir les identifiants, ce qui évite d'avoir à signer manuellement les URL. Pour plus d'informations, consultez le Portail OpenAPI.
[self.player setOnVidAuthExpiredCallback:^(id expiredSource, id<AVPSourceRefreshCallback> callback) {
// Get the AVPVidAuthSource object.
if ([expiredSource isKindOfClass:[AVPVidAuthSource class]]) {
AVPVidAuthSource *vidAuth = (AVPVidAuthSource *)expiredSource;
// ------------------- Start of user implementation -------------------
// Call your custom function to retrieve a new PlayAuth from your app server.
// clinetGetPlayAuthFunction is a sample function name. Replace it with your actual implementation.
[self clinetGetPlayAuthFunction:vidAuth.vid success:^(NSString* newPlayAuth){
// 1. In the success callback, after retrieving the new credential:
[vidAuth setPlayAuth:newPlayAuth];
// 2. Pass the updated source object back to the player via the SDK's callback.
[callback onSuccess:vidAuth];
} failure:^(NSString* errorMsg) {
// In the failure callback.
// errorMsg contains details about the error.
[callback onError:errorMsg];
}];
// ------------------- End of user implementation -------------------
}
}];
URL source
Exemple d'API
/**
@brief Sets the callback for URL source expiration notifications.
This callback is triggered when the player detects that the current URL source has expired.
You can refresh the URL source in this callback and return the new URL source via the `callback` parameter to ensure continuous playback.
@note For more information about how to configure URL signing, see the Alibaba Cloud documentation:
https://www.alibabacloud.com/help/en/vod/user-guide/configure-url-signing
@param callback The callback block triggered when the URL source expires.
You can use this callback to provide a valid `URLSource` object to update the player.
*/
-(void)setOnURLSourceExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;
Composants clés
Utilisation
[self.player setOnURLSourceExpiredCallback:^(id expiredSource, id<AVPSourceRefreshCallback> callback) {
// Get the AVPUrlSource object.
if ([expiredSource isKindOfClass:[AVPUrlSource class]]) {
AVPUrlSource *expiredUrlSource = (AVPUrlSource *)expiredSource;
NSString *expiredUrl = [expiredUrlSource.playerUrl absoluteString];
// Check if the URL contains "auth_key".
if (![expiredUrl containsString:@"auth_key="]) {
return;
}
// 1. Extract the original URL from the expired URL.
NSRange authKeyQuestionRange = [expiredUrl rangeOfString:@"?auth_key="];
NSRange authKeyAmpersandRange = [expiredUrl rangeOfString:@"&auth_key="];
NSInteger authKeyIndex = NSNotFound;
if (authKeyQuestionRange.location != NSNotFound) {
authKeyIndex = authKeyQuestionRange.location;
} else if (authKeyAmpersandRange.location != NSNotFound) {
authKeyIndex = authKeyAmpersandRange.location;
}
NSString *originalUrl = nil;
if (authKeyIndex != NSNotFound) {
originalUrl = [expiredUrl substringToIndex:authKeyIndex];
} else {
// If "auth_key" is not found, assume the entire URL is the original URL.
originalUrl = expiredUrl;
}
// 2. Prepare new authentication parameters: the authKey and the expiration time.
// Use the authKey class member if it is valid.
NSString *key = (self.authKey.length > 0) ? self.authKey : @"";
if (!NOT_EMPTY(key)) {
[callback onError:@"REFRESH_ERROR:key fail"];
return;
}
// Use the validTime class member if it is valid; otherwise, use a default value.
NSTimeInterval validTime = (self.validTime > 0) ? self.validTime : 3600; // Default: 3600 seconds.
NSTimeInterval newExpireTime = [[NSDate date] timeIntervalSince1970] + validTime;
// 3. Generate a new signed URL with CdnAuthUtil (Method A).
NSString *newAuthUrl = [CdnAuthUtil aAuthWithUri:originalUrl key:key exp:newExpireTime];
AVPUrlSource *resultSource = [[AVPUrlSource alloc] urlWithString:newAuthUrl];
// 4. Handle the callback.
if (newAuthUrl) {
[callback onSuccess:resultSource];
} else {
[callback onError:@"REFRESH_ERROR:refresh fail"];
}
}
}];
Fonctions utilitaires
L'exemple suivant utilise la méthode d'authentification A.
Amélioration audio
Le SDK ApsaraVideo Player pour iOS intègre un plugin d'amélioration audio destiné à optimiser l'expérience d'écoute. Il comprend trois fonctionnalités principales : la normalisation du volume, l'amélioration des dialogues et le son surround.
Fonctionnalités
-
Normalisation du volume : ajuste automatiquement l'ensemble du contenu audio à un niveau sonore constant, ce qui améliore la lecture des vidéos dont le volume d'origine est trop faible ou trop élevé.
Canaux pris en charge : mono, stéréo, 5.1 et 7.1.
Fréquences d'échantillonnage prises en charge : 16 kHz, 44,1 kHz et 48 kHz.
-
Amélioration des dialogues : met intelligemment en valeur les voix pour les rendre plus claires dans les scènes bruyantes, sans altérer le timbre original.
Canaux pris en charge : stéréo.
Fréquences d'échantillonnage prises en charge : 44,1 kHz et 48 kHz.
-
Son surround : applique un rendu surround virtuel aux pistes audio multicanales et stéréo afin d'offrir une expérience immersive sur casque ou haut-parleurs standards. Deux modes sont disponibles : 3DSurround et MegaBass.
Canaux pris en charge : mono, stéréo, 5.1 et 7.1.
Fréquences d'échantillonnage prises en charge : 44,1 kHz et 48 kHz.
Prérequis
La version du SDK ApsaraVideo Player pour iOS ou du SDK tout-en-un doit être v7.13.0 ou ultérieure.
Une licence Édition Professionnelle est requise. Pour plus d'informations, consultez Obtenir une licence pour le SDK ApsaraVideo Player.
La fonctionnalité d'amélioration audio prend en charge les sources audio suivantes :
Flux VOD : nécessite un transcodage média dans ApsaraVideo VOD.
Flux en direct : toute source est prise en charge.
Intégrer le plugin
Intégration via CocoaPods
Ajoutez la dépendance du plugin à votre fichier Podfile :
Pour connaître la dernière version du SDK ApsaraVideo Player pour iOS, consultez les Notes de version du SDK ApsaraVideo Player pour iOS.
// x.x.x must match the version of the player SDK.
pod 'AliPlayerSDK_iOS_AUDIO_ENHANCE_FILTER', 'x.x.x'
Intégration locale
Téléchargez la dernière version du SDK ApsaraVideo Player pour iOS. Ajoutez le fichier audioEnhanceFilter.framework dans Frameworks, Libraries, and Embedded Content, définissez Embed sur Embed & Sign, puis configurez les Framework Search Paths. Pour plus d'informations, consultez la section Intégration locale.
API
setFilterValid
Cette méthode contrôle l'interrupteur principal de la fonctionnalité d'amélioration audio. Le nom target du filtre d'amélioration audio est audioEnhance. La désactivation de cette fonctionnalité entraîne également celle de toutes ses sous-fonctionnalités. Par défaut, elle est désactivée.
[player setFilterValid:@"audioEnhance" valid:YES]; // Enable
[player setFilterValid:@"audioEnhance" valid:NO]; // Disable
setFilterConfig
Définissez l'objet FilterConfig avant d'appeler la méthode prepare. La configuration prend effet au démarrage de la lecture.
AVPFilterConfig *filterConfig = [[AVPFilterConfig alloc] init];
AVPFilter *filterItem = [[AVPFilter alloc] initWithTarget:@"audioEnhance"];
AVPFilterOptions *opts = [[AVPFilterOptions alloc] init];
// Surround sound
[opts setOptions:@"enable_surround" value:@YES];
[opts setOptions:@"surround_effect_type" value:@"3DSurround"]; // The type must be set when you first enable surround sound.
// Dialogue enhancement
[opts setOptions:@"enable_dialoguenhance" value:@YES];
[opts setOptions:@"dialoguenhance_voice" value:@(1.0)]; // Range: 1.0 to 10.0. The voice level must be set when you first enable dialogue enhancement.
// Volume normalization
[opts setOptions:@"enable_normalizer" value:@YES];
[filterItem setOptions:opts];
[filterConfig addFilter:filterItem];
[player setFilterConfig:filterConfig];
|
Paramètre |
Type |
Description |
|
|
Boolean |
Indique s'il faut activer la fonctionnalité de son surround. |
|
|
String |
Mode de son surround. Valeurs valides : |
|
|
Boolean |
Indique s'il faut activer la fonctionnalité d'amélioration des dialogues. |
|
|
Float |
Intensité de l'amélioration des dialogues. Plage : 1.0 à 10.0. |
|
|
Boolean |
Indique s'il faut activer la fonctionnalité de normalisation du volume. |
updateFilterConfig
Appelez cette méthode pour ajuster dynamiquement les paramètres après la préparation du lecteur ou pendant la lecture.
L'appel de updateFilterConfig avant la méthode prepare n'a aucun effet. Utilisez la méthode setFilterConfig pour la configuration initiale.
AVPFilterOptions *opts = [[AVPFilterOptions alloc] init];
[opts setOptions:@"enable_surround" value:@YES];
[opts setOptions:@"surround_effect_type" value:@"3DSurround"]; // The type can only be set when enabling surround sound for the first time. It is ignored on subsequent calls because the filter is already initialized.
[player updateFilterConfig:@"audioEnhance" options:opts];
Le type de son surround ("3DSurround" ou "MegaBass") et l'intensité de l'amélioration des dialogues (dialoguenhance_voice) doivent être configurés avec la propriété enable lors de leur première activation. Dans le cas contraire, ils sont initialisés à leurs valeurs par défaut ("3DSurround" pour le son surround et 1.0 pour l'intensité des dialogues) et ne peuvent plus être modifiés pendant la lecture.
Performances
Définir une scène de lecteur
La définition d'une scène de lecteur applique automatiquement les paramètres optimaux pour ce scénario, tels que les paramètres de mémoire tampon et les bascules de fonctionnalités. Les paramètres personnalisés définis via la méthode setConfig remplacent les valeurs par défaut de la scène.
Après avoir défini une scène de lecteur, appelez la méthode
getConfigpour consulter la configuration effective.
Exemple d'API
/**
@brief Sets the player scene.
@param scene The player scene.
@see AVPScene
*/
-(void) setPlayerScene:(AVPScene)scene;
Scènes de lecteur
typedef enum _AVPScene {
/**
* No specific scene is set.
*/
SceneNone,
/**
* Long video scene, suitable for videos over 30 minutes.
*/
SceneLong,
/**
* Medium video scene, suitable for videos between 5 and 30 minutes.
*/
SceneMedium,
/**
* Short video scene, suitable for videos up to 5 minutes.
*/
SceneShort,
/**
* Live streaming scene.
*/
SceneLive,
/**
* RTS live scene.
*/
SceneRTSLive
} AVPScene;
Utilisation
// Set the short video scene.
[self.player setPlayerScene:SceneShort];
// Set the medium video scene.
[self.player setPlayerScene:SceneMedium];
// Set the long video scene.
[self.player setPlayerScene:SceneLong];
// Set the live streaming scene.
[self.player setPlayerScene:SceneLive];
Pré-rendu
Le SDK Alibaba Cloud Player pour iOS peut effectuer le rendu de la première image d'une vidéo avant même le début de la lecture, ce qui permet d'accélérer le démarrage.
Cette fonctionnalité est désactivée par défaut.
Vous devez définir la
Viewdu lecteur avant d'appelerPrepareafin de garantir le rendu de l'image dans laViewdès qu'elle est prête.L'activation de cette fonctionnalité modifie l'ordre de déclenchement des événements de succès de préparation et de rendu de la première image. Lorsque cette fonctionnalité est désactivée, l'événement de succès de préparation précède celui du rendu de la première image. Lorsqu'elle est activée, le rendu de la première image peut se produire avant le succès de préparation, selon la vitesse de décodage et de rendu. Cela n'affecte pas la lecture.
L'exemple suivant montre comment activer cette fonctionnalité :
[self.player setOption:ALLOW_PRE_RENDER valueInt:1];
Cache local
Pour des exemples de code détaillés, reportez-vous au module PreloadUrl du projet API-Example. Ce projet d'exemple, écrit en Objective-C, illustre l'intégration des fonctionnalités principales du SDK Alibaba Cloud Player pour iOS.
Le SDK Alibaba Cloud Player pour iOS offre une fonctionnalité de cache local. Celle-ci améliore la vitesse de démarrage et de recherche, réduit les saccades et économise le trafic réseau lors des lectures répétées.
Activer le cache local
La fonctionnalité de cache local est désactivée par défaut. Pour l'utiliser, activez-la via la méthode enableLocalCache de la classe AliPlayerGlobalSettings. L'exemple suivant illustre cette procédure.
/**
* Enables the local cache. When enabled, content is cached to local files.
* @param enable A boolean value that specifies whether to enable the local cache. true: enabled, false: disabled. Default value: false.
* @param maxBufferMemoryKB This parameter is deprecated in v5.4.7.1 and later and has no effect.
* @param localCacheDir The directory for local cache files. You must specify an absolute path.
*/
[AliPlayerGlobalSettings enableLocalCache:true maxBufferMemoryKB:1024 localCacheDir:@""];
/**
@brief Configures the automatic cleanup of local cache files.
@param expireMin This parameter is deprecated in v5.4.7.1 and later and has no effect.
@param maxCapacityMB The maximum cache size in MB. Default value: 20 GB. During cleanup, if the total cache size exceeds this limit, the oldest cache items are deleted one by one until the total size is within the limit.
@param freeStorageMB The minimum free disk space in MB. Default value: 0. During cleanup, if the available disk space is less than this value, cache files are deleted one by one until the free space is equal to or greater than this value, or until all cached files are deleted.
*/
[AliPlayerGlobalSettings setCacheFileClearConfig:0 maxCapacityMB:0 freeStorageMB:0];
/**
* A callback to get the hash value of a URL. This value is used as the unique ID for the URL. You must ensure that each URL has a unique hash value.
*/
// You must implement this function and pass its pointer to setCacheUrlHashCallback.
static NSString *CaheUrlHashHandle(NSString *url) {
return @"xxx";
}
[AliPlayerGlobalSettings setCacheUrlHashCallback:&CaheUrlHashHandle];
-
Si les URL de lecture vidéo contiennent des paramètres d'authentification, ceux-ci changent entre la mise en cache et la lecture. Pour améliorer le taux de réussite du cache pour une même URL sous différentes authentifications, supprimez les paramètres d'authentification avant de calculer la valeur de hachage (par exemple MD5) via
setCacheUrlHashCallback. Par exemple, pour une URL telle quehttp://****.mp4?aaa, calculez le hachage en utilisanthttp://****.mp4. Toutefois, pour les vidéos m3u8 chiffrées, si vous supprimez les paramètres d'authentification des keyURL avant le hachage, différentes vidéos risquent d'utiliser la même clé, provoquant un échec de lecture. Solution : dans le callbacksetCacheUrlHashCallback, vérifiez le domaine et ne supprimez les paramètres d'authentification que pour les domaines de lecture (http(s)://xxxxx.m3u8?aaaa), et non pour les domaines keyURL (http(s)://yyyyy?bbbb). Utilisez curl pour récupérer la playlist M3U8 de la vidéo HLS chiffrée, où playURL correspond à l'adresse M3U8 et keyURL à l'adresse de la clé de déchiffrement AES-128. Exemple de sortie terminal :# playURL: M3U8 playlist request C:\Users\futan>curl "https://videxxxv.cc/a003xxx2a-hd-encrypt-stream.m3u8?MtsHlsUriToken=uheAz07oi-jlo9CeIU6LxxxAr4a3WtzrJXnCn4ClS44dTYHCQGmXBlo7TyuPLE0a&auth_key=17xxxrmonwFHJ" #EXTM3U #EXT-X-VERSION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 # keyURL: AES-128 encryption key address #EXT-X-KEY:METHOD=AES-128,URI="https://apxxx.cc/decrypt?Ciphertext=NWNiNDQyN2MtNjV1ZS00ZWIwLTk0YTAtNTJhOWIyZWV1OTY2MzdoRTJ6TjVxcXkweFY2xxxNCt4OGNFRGNReHRG&MtsHlsUriToken=uheAz07oi-jlo9CeIU6LxxxAr4a3WtzrJXnCn4ClS44dTYHCQGmXBlo7TyuPLE0a" #EXTINF:10.000000, e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00001.ts?auth_key=1706560316-65b7xxx39f1d6c77 #EXTINF:10.000000, e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00002.ts?auth_key=1706560316-65b7xxxe8eca2faf #EXTINF:10.000000, e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00003.ts?auth_key=1706560316-65b7xxx50c6981b3 #EXTINF:10.000000, e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00004.ts?auth_key=1706560316-65b7xxxf7228c594 #EXTINF:10.000000, e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00005.ts?auth_key=1706560316-65b7xxx6dc68c35d -
Si un serveur diffuse le même fichier média via HTTP et HTTPS, vous pouvez améliorer le taux de réussite du cache en supprimant ou en normalisant le protocole avant de calculer la valeur de hachage. Par exemple :
Si les URL de lecture sont
https://****.mp4ethttp://****.mp4, utilisez****.mp4pour calculer la valeur de hachage.Si l'URL de lecture est
https://****.mp4, vous pouvez systématiquement utiliserhttp://****.mp4pour calculer la valeur de hachage.
-
Pour le SDK Alibaba Cloud Player v5.5.4.0 et versions ultérieures, si vous lisez un flux HLS dont l'URL contient des paramètres d'authentification, vous pouvez définir le champ
AVPConfig.enableStrictAuthModepour sélectionner un mode d'authentification. La valeur par défaut est false pour les anciennes versions et true à partir de la v7.13.0.Authentification non stricte (
false) : les informations d'authentification sont mises en cache avec le contenu média. Si seule une partie du média a été mise en cache précédemment, le lecteur utilise les informations d'authentification en cache pour demander la portion non mise en cache. Si la période de validité de l'authentification de l'URL est courte ou si la lecture reprend après une longue pause, l'authentification peut expirer. Pour gérer ce cas, vous devez mettre en œuvre la fonctionnalité de rafraîchissement automatique de la source.Authentification stricte (
true) : les informations d'authentification ne sont pas mises en cache. L'authentification s'effectue au début de chaque session de lecture. Cela peut entraîner un échec de lecture en l'absence de connexion réseau.
Activer ou désactiver le cache pour une URL
Pour désactiver la fonctionnalité de cache local pour une URL spécifique, configurez-la dans la player config. Voici un exemple :
// Get the configuration.
AVPConfig *config = [self.player getConfig];
// Specifies whether to enable local caching for the playback URL. Default value: true.
// To enable local caching for this URL, both this setting and the global setting in AliPlayerGlobalSettings must be enabled.
// If this is set to false, local caching is disabled for this URL.
config.enableLocalCache = false;
....// Other settings
// Apply the configuration to the player.
[self.player setConfig:config];
Utiliser le chemin de cache par défaut
Pour utiliser le chemin de cache par défaut, activez la mise en cache locale sans spécifier de répertoire dans AliPlayerGlobalSettings.
[AliPlayerGlobalSettings enableLocalCache:true];
Préchargement
Le SDK Alibaba Cloud Player pour iOS propose une fonctionnalité de préchargement, qui constitue une amélioration du cache local. Le préchargement télécharge une partie de la vidéo dans le cache avant le début de la lecture, ce qui accélère le démarrage.
Le préchargement présente les limitations suivantes :
Seuls les fichiers médias uniques sont pris en charge, tels que MP4, MP3, FLV et HLS.
Par défaut, le SDK Alibaba Cloud Player pour iOS planifie automatiquement les ressources réseau pour le préchargement afin de minimiser les interférences avec la vidéo en cours de lecture. La requête de préchargement n'est envoyée qu'une fois que la mémoire tampon de la vidéo en cours atteint un seuil spécifique. Pour désactiver ce comportement et gérer les requêtes de préchargement en temps réel, appelez la méthode suivante :
[AliPlayerGlobalSettings enableNetworkBalance:false];
Activez la fonctionnalité de cache local comme décrit dans la section Cache local.
-
Définissez la source de données.
VidAuth (recommandé)
AVPVidAuthSource* vidAuthSource = [[AVPVidAuthSource alloc] init]; [vidAuthSource setVid:@"your_video_id"]; // Required. The video ID. [vidAuthSource setPlayAuth:@"<yourPlayAuth>"]; // Required. The playback credential. You must call the GetVideoPlayAuth operation of ApsaraVideo for VOD to generate the credential. [vidAuthSource setRegion:@"your_region"]; // This parameter is deprecated in SDK v5.5.5.0 and later. The player automatically parses the region. For earlier versions, this parameter is required and defaults to cn-shanghai. [vidAuthSource setQuality:@"AUTO"]; // "AUTO" enables adaptive bitrate streaming.VidSts
AVPVidStsSource* vidStsSource = [[AVPVidStsSource alloc] init]; [vidStsSource setVid: @""]; // Required. The video ID. [vidStsSource setRegion:@""]; // Required. The region where ApsaraVideo VOD is activated. Default value: cn-shanghai. [vidStsSource setSecurityToken: @"<yourSecurityToken>"]; // Required. The STS security token. You must call the AssumeRole API operation of STS to obtain the token. [vidStsSource setAccessKeySecret: @"<yourAccessKeySecret>"]; // Required. The AccessKey secret of the temporary STS AccessKey pair. You must call the AssumeRole API operation of STS to obtain the AccessKey secret. [vidStsSource setAccessKeyId: @"<yourAccessKeyId>"]; // Required. The AccessKey ID of the temporary STS AccessKey pair. You must call the AssumeRole API operation of STS to obtain the AccessKey ID. [vidStsSource setQuality:@""]; // "AUTO" specifies adaptive bitrate streaming.UrlSource
NSString* url = @"your_playback_url"; // Required. The playback URL. It can be a third-party VOD URL or a playback URL from ApsaraVideo for VOD. AVPUrlSource* urlSource = [[AVPUrlSource alloc]urlWithString:url]; -
Définissez les paramètres de la tâche.
RemarqueCes paramètres s'appliquent uniquement aux vidéos à débits multiples. Vous ne devez définir qu'un seul des paramètres suivants :
setDefaultBandWidth,setDefaultResolutionousetDefaultQuality.AVPPreloadConfig *config = [[AVPPreloadConfig alloc]init]; // Set the preload bitrate for a multi-bitrate stream. [config setDefaultBandWidth:400000]; // Set the preload resolution for a multi-bitrate stream. [config setDefaultResolution:640 * 480]; // Set the preload quality for a multi-bitrate stream. [config setDefaultQuality:@"FD"]; // Set the preload duration. [config setDuration:1000]; -
Ajoutez un écouteur de tâche.
-
Construisez la tâche, ajoutez-la à l'instance
MediaLoaderV2et lancez le préchargement.VidAuth (recommandé)
// Build the preload task. AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithVidAuthSource:vidAuthSource preloadConfig:config]; // Get the MediaLoaderV2 instance. AliMediaLoaderV2* vodMedialoader = [AliMediaLoaderV2 shareInstance]; // Add the task and start preloading. NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];VidSts
// Build the preload task. AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithVidStsSource:vidStsSource preloadConfig:config]; // Get the MediaLoaderV2 instance. AliMediaLoaderV2* vodMedialoader = [[AliMediaLoaderV2 alloc]init]; // Add the task and start preloading. NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];UrlSource
// Build the preload task. AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithUrlSource:urlSource preloadConfig:config]; // Get the MediaLoaderV2 instance. AliMediaLoaderV2* vodMedialoader = [[AliMediaLoaderV2 alloc]init]; // Add the task and start preloading. NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self]; -
Facultatif : gérez les tâches.
[vodMedialoader cancelTask:taskId];// Cancel the preload task with the specified ID. [vodMedialoader pauseTask:taskId];// Pause the preload task with the specified ID. [vodMedialoader resumeTask:taskId];// Resume the preload task with the specified ID. -
Facultatif : supprimez les fichiers chargés.
Pour libérer de l'espace, vous pouvez supprimer les fichiers mis en cache. Comme le SDK Alibaba Cloud Player pour iOS ne fournit pas d'interface de suppression, vous devez supprimer manuellement les fichiers du répertoire de cache au sein de votre application.
Préchargement dynamique
La stratégie de préchargement dynamique vous permet de contrôler la mise en cache de la vidéo en cours ainsi que le nombre de vidéos à précharger. Cela vous aide à trouver un équilibre entre l'expérience de lecture et les coûts.
Préchargement de vidéos HLS à débits multiples
Dans un scénario listPlayer impliquant des vidéos HLS à débits multiples, vous pouvez précharger un flux correspondant à la qualité de lecture actuelle et choisir un mode de préchargement adapté à vos besoins métier.
Vitesse de téléchargement
Vous pouvez obtenir la vitesse de téléchargement de la vidéo en cours de lecture via le paramètre speed du callback onCurrentDownloadSpeed. L'exemple suivant illustre cette procédure.
- (void)onCurrentDownloadSpeed:(AliPlayer *)player speed:(int64_t)speed{
intspeed_=speed;
}
Fonctionnalités réseau
HTTPDNS
HTTPDNS résout les noms de domaine via HTTP vers des serveurs spécifiques, réduisant ainsi les risques de détournement DNS et offrant une résolution plus rapide et plus stable.
Le SDK ApsaraVideo Player fournit un service HTTPDNS amélioré pour les domaines Alibaba Cloud CDN, permettant une planification précise du CDN et une résolution en temps réel.
Exemple d'HTTPDNS amélioré
L'HTTPDNS amélioré ne fonctionne que pour les domaines Alibaba Cloud CDN. Assurez-vous que votre domaine est bien un domaine Alibaba Cloud CDN et qu'il est correctement configuré. Pour ajouter des domaines CDN dans VOD, consultez Ajouter un domaine accéléré. Alibaba Cloud CDN.
// Enable enhanced HTTPDNS.
[AliPlayerGlobalSettings enableEnhancedHttpDns:YES];
// Optional. Add a domain name for HTTPDNS pre-resolution.
[[AliDomainProcessor shareInstance] addPreResolveDomain:@"player.***alicdn.com"];
HTTP/2
À partir de la version v5.5.0.0, le SDK Alibaba Cloud Player pour iOS active HTTP/2 par défaut.
Le SDK Alibaba Cloud Player pour iOS prend en charge HTTP/2, qui utilise le multiplexage pour éviter le blocage de tête de ligne et améliorer les performances de lecture. Exemple :
[AliPlayerGlobalSettings setUseHttp2:true];
Préconnexion TCP
Pour les requêtes de lecture vidéo HTTP (et non HTTPS), l'établissement préalable d'une connexion TCP améliore considérablement l'expérience utilisateur en réduisant le temps de connexion, en garantissant une lecture immédiate et continue, et en optimisant l'utilisation des ressources réseau et système. Exemple :
// The domain format is host[:port]. The port is optional. Use semicolons (;) to separate multiple domain names.
// Global setting.
// This is an absolute setting. Each time you call this method, the new string replaces the previous one. An empty string disables pre-connection.
[AliPlayerGlobalSettings setOption:SET_PRE_CONNECT_DOMAIN value: @"domain1;domain2"];
Téléchargement de vidéos
Pour un exemple de code détaillé, consultez le module Video Download and Offline Playback (Download) dans API-Example. Ce projet d'exemple en Objective-C illustre l'intégration des fonctionnalités principales du SDK ApsaraVideo Player pour iOS.
Le SDK ApsaraVideo Player pour iOS permet de télécharger du contenu ApsaraVideo VOD afin de le lire hors ligne. Le SDK propose deux modes de téléchargement : le téléchargement standard et le téléchargement sécurisé.
Téléchargement standard : les données vidéo téléchargées ne sont pas chiffrées par Alibaba Cloud et peuvent être lues à l'aide de lecteurs tiers.
Téléchargement sécurisé : les données vidéo téléchargées sont chiffrées par Alibaba Cloud. Elles ne peuvent pas être lues par des lecteurs tiers ; seule la lecture via ApsaraVideo Player est possible.
Utilisation
La fonctionnalité de téléchargement de vidéos est disponible uniquement pour les sources VidSts et VidAuth.
Pour utiliser cette fonctionnalité, vous devez activer et configurer le mode de téléchargement dans la console ApsaraVideo VOD. Pour plus d'informations, consultez téléchargement hors ligne.
Cette fonctionnalité prend en charge la reprise des téléchargements interrompus.
Procédure
-
Facultatif : Configurez le fichier de clé pour le téléchargement sécurisé. Cette étape n'est requise que pour ce mode spécifique.
RemarqueAssurez-vous que les informations contenues dans le fichier de clé configuré correspondent bien à celles de votre application. Dans le cas contraire, le téléchargement de la vidéo échouera.
Si vous optez pour le mode de téléchargement sécurisé, vous devez configurer le SDK ApsaraVideo Player avec le fichier de clé généré dans la console ApsaraVideo VOD. Ce fichier sert au déchiffrement et à la vérification lors du téléchargement et de la lecture vidéo. Pour savoir comment générer ce fichier, consultez Activer le téléchargement sécurisé.
Effectuez cette configuration une seule fois dans votre application, comme illustré dans l'exemple suivant :
NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"]; [AliPrivateService initKey:encrptyFilePath]; -
Créez et configurez le téléchargeur.
L'exemple de code ci-dessous illustre cette étape :
AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init]; [downloader setSaveDirectory:self.downLoadPath]; [downloader setDelegate:self]; -
Définissez les écouteurs d'événements.
Le téléchargeur prend en charge plusieurs écouteurs d'événements. Voici un exemple de mise en œuvre :
-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { // A download item is successfully prepared. } -(void)onError:(AliMediaDownloader *)downloader errorModel:(AVPErrorModel *)errorModel { // An error occurred during download. } -(void)onDownloadingProgress:(AliMediaDownloader *)downloader percentage:(int)percent { // Download progress percentage. } -(void)onProcessingProgress:(AliMediaDownloader *)downloader percentage:(int)percent { // Processing progress percentage. } -(void)onCompletion:(AliMediaDownloader *)downloader { // The download is successful. } -
Préparez la source de téléchargement.
Appelez la méthode
preparepour préparer la source. Les sources VidSts et VidAuth sont prises en charge. L'exemple suivant montre comment procéder :-
VidSts
// Create a VidSts source. AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init]; stsSource.region = @"your_region"; // Your ApsaraVideo VOD service region. Default value: cn-shanghai. stsSource.vid = @"your_video_id"; // The video ID. stsSource.securityToken = @"<yourSecurityToken>"; // The STS security token. To get this token, call the STS AssumeRole operation. stsSource.accessKeySecret = @"<yourAccessKeySecret>"; // The AccessKey secret of the temporary STS credential. To get this secret, call the STS AssumeRole operation. stsSource.accessKeyId = @"<yourAccessKeyId>"; // The AccessKey ID of the temporary STS credential. To get this ID, call the STS AssumeRole operation. // If you have enabled parameter pass-through for HLS encryption in the ApsaraVideo VOD console // and the default parameter name is MtsHlsUriToken, you must set the config and pass it to the VidSts source. // If this feature is not enabled, you can skip the following code. VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init]; [vp setHlsUriToken:yourMtsHlsUriToken]; stsSource.playConfig = [vp generatePlayerConfig]; // Prepare the download source. [downloader prepareWithVid:stsSource]; -
VidAuth
// Create a VidAuth source. AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.vid = @"your_video_id"; // The video ID. authSource.playAuth = @"<yourPlayAuth>"; // The playback credential. To get this credential, call the ApsaraVideo VOD GetVideoPlayAuth operation. authSource.region = @"your_region"; // Deprecated in ApsaraVideo Player SDK V5.5.5.0 and later because the player automatically parses the region. // Required for earlier versions. // Your ApsaraVideo VOD service region. Default value: cn-shanghai. // If you have enabled parameter pass-through for HLS encryption in the ApsaraVideo VOD console // and the default parameter name is MtsHlsUriToken, you must set the config and pass it to the VidAuth source. // If this feature is not enabled, you can skip the following code. VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init]; [vp setHlsUriToken:yourMtsHlsUriToken]; authSource.playConfig = [vp generatePlayerConfig]; // Prepare the download source. [downloader prepareWithVid:authSource];
RemarqueSi vous activez le transfert de paramètres pour le chiffrement HLS dans la console ApsaraVideo VOD et que le nom du paramètre par défaut est MtsHlsUriToken, vous devez définir la valeur MtsHlsUriToken dans la source de téléchargement, comme indiqué dans le code ci-dessus. Pour plus d'informations, consultez transfert de paramètres pour le chiffrement HLS.
-
-
Sélectionnez une piste vidéo après la préparation de la source.
Une fois la source de téléchargement préparée, la méthode
onPreparedest appelée. Le paramètremediaInfodu rappel contient des informations sur chaque piste vidéo disponible, notamment la qualité vidéo. Sélectionnez une piste à télécharger. L'exemple suivant illustre cette opération :-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { NSArray<AVPTrackInfo*>* tracks = info.tracks; // For example, to download the first track: [downloader selectTrack:[tracks objectAtIndex:0].trackIndex]; } -
Mettez à jour la source de téléchargement et lancez le téléchargement.
Afin d'éviter l'expiration des identifiants VidSts et VidAuth, il est recommandé de mettre à jour les informations de la source avant de démarrer le téléchargement. Voici un exemple de code :
// Update the download source. [downloader updateWithVid:vidSource] // Start the download. [downloader start]; -
Libérez le téléchargeur une fois le téléchargement terminé ou en cas d'échec.
Appelez la méthode
destroypour libérer le téléchargeur.[self.downloader destroy]; self.downloader = nil;
Lecture chiffrée
ApsaraVideo VOD prend en charge le chiffrement standard HLS, le chiffrement propriétaire Alibaba Cloud et le chiffrement DRM. La vidéo en direct ne prend en charge que le chiffrement DRM. Pour plus d'informations, consultez Lecture chiffrée.
Lecture RTS native
Le SDK du lecteur iOS intègre le SDK Native RTS pour permettre la diffusion en direct à faible latence. Pour plus d'informations, consultez Mettre en œuvre le tirage de flux basé sur RTS sur iOS.