Tous les produits
Search
Centre de documentation

ApsaraVideo VOD:Fonctionnalités de base du SDK ApsaraVideo Player pour iOS

Dernière mise à jour :Aug 20, 2026

Créez une instance de lecteur iOS et configurez les fonctionnalités de lecture de base, telles que les sources de lecture, le volume, la vitesse de lecture, le changement de résolution et le changement de piste audio.

Important

Pour exécuter et tester la démo, téléchargez le SDK ApsaraVideo Player et suivez les instructions pour le compiler et l'exécuter.

Configurer une source vidéo

Le SDK ApsaraVideo Player pour iOS prend en charge la lecture de vidéos à la demande (VOD) et la diffusion en direct.

  • Méthodes de lecture VOD : VidAuth (recommandé pour les utilisateurs d'ApsaraVideo VOD), VidSts, UrlSource et lecture chiffrée.

  • Méthodes de lecture de flux en direct : UrlSource et lecture chiffrée.

Remarque
  • UrlSource lit les médias à partir d'une URL. VidSts et VidAuth lisent les médias par ID de média (Vid).

  • Pour obtenir des informations sur les régions prises en charge, consultez les ID de région ApsaraVideo VOD.

Lecture VOD

VidAuth (Recommandé)

Pour lire une vidéo VOD à l'aide de VidAuth, définissez la propriété vid sur l'ID du média et la propriété playAuth sur l'identifiant de lecture.

  • ID du média : Vous pouvez obtenir l'ID du média après avoir téléchargé un fichier multimédia. Dans la console ApsaraVideo VOD, choisissez Media Files > Audio/Video. Vous pouvez également appeler l'API SearchMedia.

  • Identifiant de lecture : Appelez l'opération GetVideoPlayAuth pour obtenir l'identifiant de lecture. Nous vous recommandons d'intégrer le SDK côté serveur d'ApsaraVideo VOD afin d'éviter la génération manuelle de signatures. Pour des exemples, consultez OpenAPI Explorer.

Nous recommandons VidAuth plutôt que VidSts pour les utilisateurs d'ApsaraVideo VOD, car VidAuth offre une meilleure utilisabilité et sécurité. Pour plus d'informations, consultez la rubrique Méthode par identifiant vs méthode STS.

Si vous activez le transfert de paramètres de chiffrement HLS dans la console ApsaraVideo VOD, le nom de paramètre par défaut est MtsHlsUriToken. Pour plus d'informations, consultez la rubrique Transfert de paramètres pour le chiffrement HLS.

AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
authSource.vid = @"Vid";                 // Required. The video ID (VideoId).
authSource.playAuth = @"<yourPlayAuth>"; // Required. The playback credential from GetVideoPlayAuth.
authSource.region = @"regionID";         // Deprecated for SDK V5.5.5.0 and later. The player automatically parses the region. For earlier versions, this parameter is required. Default: cn-shanghai.
// authSource.authTimeout = 3600;        // Optional. Set the validity period of the playback URL in seconds. This value overwrites the validity period configured in the ApsaraVideo VOD console. Default: 3600. Make sure that the value is greater than the video duration to prevent URL expiration during playback.

// If you enable HLS encryption parameter pass-through in the ApsaraVideo VOD console and the default parameter is MtsHlsUriToken, configure it as follows:
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
authSource.playConfig = [vp generatePlayerConfig];

[self.player setAuthSource:authSource];

VidSts

La lecture VidSts utilise des identifiants STS temporaires au lieu des identifiants de lecture VOD. Avant de lire des vidéos VOD à l'aide de VidSts, obtenez un jeton STS et une paire de clés d'accès (AccessKey ID et AccessKey Secret). Pour plus d'informations, consultez la rubrique Obtenir un jeton STS.

Si vous activez le transfert de paramètres de chiffrement HLS dans la console ApsaraVideo VOD, le nom de paramètre par défaut est MtsHlsUriToken. Pour plus d'informations, consultez la rubrique Transfert de paramètres pour le chiffrement HLS.

AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
source.vid = @"Vid";                                // Required. The video ID (VideoId).
source.region = @"regionID";                        //  Required. The ApsaraVideo VOD region. Default: cn-shanghai.
source.securityToken = @"<yourSecurityToken>";      // Required. The STS token from AssumeRole.
source.accessKeySecret = @"<yourAccessKeySecret>";  // Required. The temporary AccessKey secret from STS (AssumeRole).
source.accessKeyId = @"<yourAccessKeyId>";          // Required. The temporary AccessKey ID from STS (AssumeRole).
// source.authTimeout = 3600;                       // Optional. Set the validity period of the playback URL in seconds. This value overwrites the validity period configured in the ApsaraVideo VOD console. Default: 3600. Make sure that the value is greater than the video duration to prevent URL expiration during playback.
// If you enable HLS encryption parameter pass-through in the ApsaraVideo VOD console and the default parameter is MtsHlsUriToken, configure it as follows:
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
source.playConfig = [vp generatePlayerConfig];
// Set the playback source.
[self.player setStsSource:source]

UrlSource

Pour lire une vidéo VOD à l'aide de UrlSource, transmettez directement l'URL de lecture.

  • Vous pouvez appeler l'opération GetPlayInfo pour obtenir les URL de lecture depuis ApsaraVideo VOD. Nous vous recommandons d'intégrer le SDK côté serveur d'ApsaraVideo VOD. Pour des exemples, consultez OpenAPI Explorer.

  • Pour les fichiers locaux, assurez-vous que vous disposez des autorisations nécessaires pour accéder au fichier. Utilisez des chemins complets tels que /sdcard/video/sample.mp4 ou content://media/video/123.

AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // Required. A VOD URL, third-party URL, or local file path.
[self.player setUrlSource:urlSource]; 

Lecture chiffrée

Les vidéos VOD prennent en charge le chiffrement HLS, le chiffrement vidéo Alibaba Cloud et le chiffrement DRM. Pour la lecture, consultez la rubrique Lire une vidéo chiffrée.

Lecture de flux en direct

Pour la lecture de flux en direct, consultez la rubrique Lecture standard de flux en direct.

Contrôler la lecture

Le SDK ApsaraVideo Player pour iOS fournit des méthodes pour démarrer, mettre en pause, arrêter et rechercher une position dans la lecture.

Préparer la lecture

Appelez la méthode prepare pour préparer la vidéo à la lecture.

[self.player prepare];

Le rappel onPlayerEvent avec AVPEventPrepareDone est invoqué lorsque la préparation est terminée.

Démarrer la lecture

Appelez la méthode start pour commencer à lire la vidéo :

[self.player start];

Mettre la lecture en pause

Appelez la méthode pause pour mettre la vidéo en pause :

[self.player pause];

Reprendre la lecture

Appelez la méthode start pour reprendre la lecture après une pause :

[self.player start];

Accéder à une position spécifique

Appelez seekToTime pour accéder à une position spécifique. Cette méthode est utile lorsque les utilisateurs font glisser la barre de progression ou reprennent la lecture à partir d'une position enregistrée.

// Seek to a specific position (in milliseconds)
// Accurate seek
[self.player seekToTime:position seekMode:AVP_SEEKMODE_ACCURATE];
// Inaccurate seek
[self.player seekToTime:position seekMode:AVP_SEEKMODE_INACCURATE];

Modes de recherche :

  • Recherche précise (AVP_SEEKMODE_ACCURATE) : Accède à la position exacte. Plus lent, mais plus précis.

  • Recherche imprécise (AVP_SEEKMODE_INACCURATE) : Accède à l'image clé la plus proche. Plus rapide, mais moins précis.

Démarrer la lecture à partir d'une position spécifique

Pour démarrer la lecture à partir d'une position spécifique (plutôt que de rechercher pendant la lecture), appelez setStartTime avant d'appeler prepare :

// Set the start time for the next prepare call (in milliseconds).
// This setting is only valid for the immediately following prepare call. The start time is automatically cleared after prepare is called.
// seekMode: accurate seek (AVP_SEEKMODE_ACCURATE) or inaccurate seek (AVP_SEEKMODE_INACCURATE).
[self.player setStartTime:time seekMode:seekMode];

Arrêter la lecture

Appelez la méthode stop pour arrêter la lecture :

[self.player stop];

Dissocier la vue du lecteur

Après avoir arrêté la lecture et avant de détruire l'instance du lecteur, dissociez la vue du lecteur pour libérer les ressources de rendu et éviter les fuites de mémoire.

// Unbind the player view
self.player.playerView = nil;
Remarque

Dissociez la vue du lecteur après avoir appelé stop et avant d'appeler destroy ou destroyAsync. La séquence complète de fin de lecture est la suivante : stop → dissocier la vue → destroy / destroyAsync.

Détruire le lecteur

Vous pouvez détruire le lecteur de manière synchrone ou asynchrone pour libérer les ressources.

// Synchronous destroy. Blocks until player resources are released. Automatically calls stop.
[self.player destroy];
// Asynchronous destroy. Returns immediately. Automatically calls stop.
[self.player destroyAsync];

Recommandations :

  • Utilisez destroyAsync si vous avez besoin de temps de réponse rapides.

  • N'effectuez aucune opération sur l'objet lecteur pendant la destruction asynchrone.

  • Il n'est pas nécessaire d'appeler stop avant destroyAsync car le processus de destruction inclut une opération d'arrêt asynchrone.

Écouter les événements du lecteur

Le SDK ApsaraVideo Player fournit des rappels délégués pour surveiller les changements d'état du lecteur, la progression de la lecture, les erreurs et d'autres événements.

Définir le délégué du lecteur

Implémentez le protocole AVPDelegate dans votre contrôleur de vue pour recevoir les rappels du lecteur.

Important : Implémentez les rappels onError et onPlayerEvent pour gérer les erreurs et surveiller les changements d'état de la lecture.

@interface SimplePlayerViewController ()<AVPDelegate>
@end
- (void)viewDidLoad {
    self.player = [[AliPlayer alloc] init];
    self.player.playerView = self.avpPlayerView.playerView;
    self.player.delegate = self;
    //...
}
/**
 @brief Delegate callback for player errors.
 @param player The player instance.
 @param errorModel Contains the error details.
 */
- (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
    // Handle the error (e.g., show an alert) and stop playback.
}
/**
 @brief Delegate callback for player events.
 @param player The player instance.
 @param eventType The type of the event. See AVPEventType.
 */
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType{
    switch(eventType){
        case AVPEventPrepareDone:{
            // Triggered when the media has been prepared and is ready to play.
        }
            break;
        case AVPEventAutoPlayStart:
            // Triggered when autoplay begins.
            break;
        case AVPEventFirstRenderedStart:
            // Triggered when the first frame is rendered.
            break;
        case AVPEventCompletion:
            // Triggered when playback completes.
            break;
        case AVPEventLoadingStart:
            // Triggered when buffering starts.
            break;
        case AVPEventLoadingEnd:
            // Triggered when buffering finishes.
            break;
        case AVPEventSeekEnd:
            // Triggered when a seek operation completes.
            break;
        case AVPEventLoopingStart:
            // Triggered when a new loop begins.
            break;
        default:
            break;
    }
}
/**
 @brief Callback for the current playback position.
 @param player The player instance.
 @param position The current playback position in milliseconds.
 */
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    // Update the progress bar.
}
/**
 @brief Callback for the current buffered position.
 @param player The player instance.
 @param position The current buffered position in milliseconds.
 */
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    // Update the buffer progress indicator.
}
/**
 @brief Callback for when track information is ready.
 @param player The player instance.
 @param info An array of AVPTrackInfo objects for the available streams.
 */
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    // Retrieve information for available bitrates/tracks.
}
/**
 @brief Callback for when a subtitle should be displayed.
 @param player The player instance.
 @param index The index of the subtitle entry.
 @param subtitle The subtitle text to be displayed.
 */
- (void)onSubtitleShow:(AliPlayer*)player index:(int)index subtitle:(NSString *)subtitle {
    // Get and display the subtitle text.
}
/**
 @brief Callback for when a subtitle should be hidden.
 @param player The player instance.
 @param index The index of the subtitle entry that was shown.
 */
- (void)onSubtitleHide:(AliPlayer*)player index:(int)index {
    // Hide the subtitle.
}
/**
 @brief Callback for a screen capture request.
 @param player The player instance.
 @param image The captured screenshot as a UIImage.
 */
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
    // Preview or save the captured image.
}
/**
 @brief Callback for when a track change is complete.
 @param player The player instance.
 @param info The AVPTrackInfo object for the new, active track.
 */
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
    // Notification that the bitrate/track has changed.
}

Écouter les changements d'état du lecteur

Le rappel onPlayerStatusChanged est invoqué lorsque l'état du lecteur change :

- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
    switch (newStatus) {
    case AVPStatusIdle:{
           // Player is idle
        }
 break;
        case AVPStatusInitialzed:{
           // Player is initialized
        }
 break;
        case AVPStatusPrepared:{
           // Player prepared
        }
 break;
        case AVPStatusStarted:{
           // Playback started
        }
 break;
case AVPStatusPaused:{
           // Playback paused
        }
 break;
case AVPStatusStopped:{
           // Playback stopped
        }
 break;
case AVPStatusCompletion:{
           // Playback completed
        }
 break;
case AVPStatusError:{
           // Player error occurred
        }
 break;
        default:
            break;
    }
}

Configurer l'affichage vidéo

Configurez la mise à l'échelle, la rotation et la mise en miroir de la vidéo pendant la lecture.

Modes de mise à l'échelle

Le SDK prend en charge trois modes de mise à l'échelle :

// Scale to fit the view while maintaining the aspect ratio (letterboxing).
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
// Scale to fill the view while maintaining the aspect ratio (cropping).
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFILL;
// Stretch to fill the view. The aspect ratio is not maintained. Image distortion may occur.
self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
Remarque

Les paramètres de mode de mise à l'échelle ne s'appliquent pas au mode Picture-in-Picture (PiP).

Rotation

Faites pivoter la vidéo dans le sens horaire selon un angle spécifié :

// No rotation
self.player.rotateMode = AVP_ROTATE_0;
// Rotate 90 degrees clockwise
self.player.rotateMode = AVP_ROTATE_90;
// Rotate 180 degrees clockwise
self.player.rotateMode = AVP_ROTATE_180;
// Rotate 270 degrees clockwise
self.player.rotateMode = AVP_ROTATE_270;

Mise en miroir

Appelez setMirrorMode pour mettre la vidéo en miroir. Le SDK prend en charge la mise en miroir horizontale et verticale :

// No mirroring
self.player.mirrorMode = AVP_MIRRORMODE_NONE;
// Horizontal mirroring
self.player.mirrorMode = AVP_MIRRORMODE_HORIZONTAL;
// Vertical mirroring
self.player.mirrorMode = AVP_MIRRORMODE_VERTICAL;

Obtenir des informations de lecture

Obtenez la progression de la lecture, la durée totale et la progression de la mise en mémoire tampon pendant la lecture.

Progression de la lecture

La position de lecture actuelle est renvoyée dans le rappel onCurrentPositionUpdate :

- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// position is in milliseconds
NSString *position = [NSString stringWithFormat:@"%lld, position"];
}

Durée totale

Récupérez la durée totale de la vidéo après son chargement (par exemple, après l'événement AVPEventPrepareDone) :

-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
  switch (eventType) {
    case AVPEventPrepareDone: {
      if (self.player.duration >= 0) {
       NSString *duration  = self.player.duration;
      }
    }
      break;
    default:
      break;
  }
}

Durée de lecture réelle

Récupérez la durée de lecture réelle en temps réel. Cette valeur exclut le temps pendant lequel la lecture est en pause ou en cours de mise en mémoire tampon.

 NSString *duration = [player getPlayedDuration];

Progression de la mise en mémoire tampon

La progression actuelle de la mise en mémoire tampon est renvoyée dans le rappel onBufferedPositionUpdate :

- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    NSString *bufferPosition = position;
}

Métriques de rendu et de débit en temps réel

Obtenez le taux de rafraîchissement du rendu, le débit audio et vidéo, ainsi que le débit descendant du réseau en temps réel.

// Video rendering frame rate. Returns a float value.
[self.player getOption:AVP_OPTION_RENDER_FPS]
// Video bitrate. Returns a float value in bit/s.
[self.player getOption:AVP_OPTION_VIDEO_BITRATE]
// Audio bitrate. Returns a float value in bit/s.
[self.player getOption:AVP_OPTION_AUDIO_BITRATE]
// Network downstream bitrate. Returns a float value in bit/s.
[self.player getOption:AVP_OPTION_DOWNLOAD_BITRATE]

Gérer le volume

Contrôlez le volume de lecture et coupez le son.

Ajuster le volume

Appelez volume pour modifier le volume. Valeurs valides : de 0 à 2, où 1 correspond au volume d'origine. Les valeurs supérieures à 1 amplifient l'audio et peuvent introduire du bruit. Nous vous recommandons de maintenir le volume à 1 ou en dessous.

// Set the volume. Valid values: 0 to 2.
self.player.volume = 1.0f;
// Get the current volume.
self.player.volume

Couper le son de la vidéo

Coupez ou rétablissez le son :

self.player.muted = YES;

Définir la vitesse de lecture

Ajustez la vitesse de lecture de 0,5× à 5× la vitesse normale sans modifier la hauteur tonale :

// We recommend using multiples of 0.5 (e.g., 0.5, 1.0, 1.5, 2.0)
self.player.rate = 1.0f;

Changer de résolution

Remarque

Pour des exemples de code détaillés, consultez le module MultiResolution dans le projet API-Example.

Lecture basée sur VidAuth ou VidSts

Si vous utilisez VidAuth ou VidSts pour la lecture VOD, le SDK récupère automatiquement les définitions vidéo depuis ApsaraVideo VOD. Aucune configuration supplémentaire n'est requise.

Interroger les définitions disponibles

Après le chargement de la vidéo, récupérez les définitions disponibles (trackBitrate) dans le rappel onTrackReady :

- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    for (int i=0; i<info.count; i++) {
        AVPTrackInfo* track = [info objectAtIndex:i];
        switch (track.trackType) {
            case AVPTRACK_TYPE_VIDEO: {
                int trackBitrate = track.trackBitrate;
            }
                break;
        }
    }
}

Changer de définition

Appelez la méthode selectTrack avec l'index de la piste souhaitée :

[self.player selectTrack:index];

Écouter les événements de changement de définition

Le rappel onTrackChanged est invoqué après le changement de définition :

- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
 // Definition switched.
}

Activer le changement rapide

Activez le mode de changement rapide pour recevoir des réponses plus rapides lors du changement manuel de définitions :

AVPConfig *config = [self.player getConfig];
config.selectTrackBufferMode = 1;
[self.player setConfig:config];

Diffusion en direct basée sur UrlSource

Pour plus de détails, consultez la rubrique Lecture standard de flux en direct.

Activer la lecture en boucle

Activez la lecture en boucle pour redémarrer automatiquement la vidéo depuis le début lorsque la lecture est terminée :

self.player.loop = YES;

L'événement AVPEventLoopingStart est déclenché au début de chaque boucle :

- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventLoopingStart:
            break;
    }
}

Changer de piste audio

Basculez entre les pistes audio dans différentes langues pendant la lecture.

Types de flux pris en charge

Les types de flux suivants prennent en charge le changement de piste audio. Le comportement de basculement varie selon le type de flux.

Type de flux

Extension

Nombre de débits

Type de sous-flux

Comportement de basculement

Flux non listé (MP4)

.mp4

1

Une piste vidéo, plusieurs pistes audio et sous-titres

Vous pouvez basculer entre les pistes audio.

HLS mixte à débit unique

.m3u8

1

Une piste vidéo, plusieurs pistes audio et sous-titres

Vous pouvez basculer entre les pistes audio.

HLS à débit unique

.m3u8

1

Sous-flux vidéo, audio et légendes séparés

Vous pouvez basculer entre les pistes audio.

HLS mixte multi-débits

.m3u8

n

Sous-flux avec différents débits, chacun ayant une vidéo et plusieurs pistes audio

Vous pouvez basculer uniquement entre les sous-flux, pas entre les pistes audio au sein d'un sous-flux.

Obtenir les pistes audio disponibles

Le rappel onSubTrackReady est invoqué lorsque les informations sur les pistes audio sont disponibles :

  // onSubTrackReady. Typically triggered before the AVPEventPrepareDone event.
- (void)onSubTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    // Call getSubMediaInfo after this callback is triggered. Calling it before this callback returns an empty result.
    AVPMediaInfo* subMediaInfo = [player getSubMediaInfo];
    // Iterate through available audio tracks
    for (int i=0; i<subMediaInfo.tracks.count; i++) {
    	AVPTrackInfo* track = [mediaInfo.tracks objectAtIndex:i];
        // Find the target audio track from the track list.
    }
}

Changer de piste audio

Appelez la méthode selectTrack pour basculer vers une autre piste audio :

[self.player selectTrack:myTrack.trackIndex accurate:YES]

Utiliser les vignettes

Remarque

Pour des exemples de code détaillés, consultez le module Thumbnail dans le projet API-Example.

Les vignettes vidéo (feuilles de sprites) permettent aux utilisateurs de prévisualiser le contenu vidéo lors du défilement de la timeline.

Avant d'utiliser les vignettes, configurez les instantanés de sprites pour votre vidéo. Dans la console ApsaraVideo VOD, créez un modèle d'instantané avec Image Sprite comme type d'instantané, puis créez un workflow pour traiter la vidéo. Pour plus d'informations, consultez la rubrique Instantanés vidéo.

/**
 A flag indicating whether the current track has thumbnails. If false, thumbnail previews will not be displayed during seeking.
 */
@property (nonatomic,assign)BOOL trackHasThumbnai;

/**
 The custom UIImageView used to display the thumbnail preview image.
 */
@property (nonatomic,strong)UIImageView *thumbnaiView;

/**
  onPrepare
 */
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
  if(newStatus == AVPStatusPrepared){
       [self.player setThumbnailUrl:[URL];// When the player is prepared, set the thumbnail URL.
       self.trackHasThumbnai = YES;
  }
}
/**
 Callback triggered when the progress slider's value changes.
 @param playerView The player view instance.
 @param value The new progress value.
 */
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
    if (self.trackHasThumbnai) {
        [self.player getThumbnail:self.player.duration*value];
    }
}

/**
 @brief: Callback triggered upon successful retrieval of a thumbnail.
 @param positionMs: The requested time position for the thumbnail, in milliseconds.
 @param fromPos: The start time of the segment this thumbnail represents, in milliseconds.
 @param toPos: The end time of the segment this thumbnail represents, in milliseconds.
 @param image: The retrieved thumbnail image (`UIImage` on iOS, `NSImage` on macOS).
 */
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
    self.thumbnaiView.hidden = NO;
    [self.thumbnaiView setImage:(UIImage *)image];
}

/**
 @brief: Callback triggered when thumbnail retrieval fails.
 @param positionMs: The time position for which the thumbnail request failed, in milliseconds.
 */
- (void)onGetThumbnailFailed:(int64_t)positionMs {
    self.thumbnaiView.hidden = YES;
}

Obtenir les journaux du SDK

Les journaux du SDK enregistrent l'état des requêtes, les résultats des invocations et les demandes d'autorisation pour le débogage pendant le développement. Le SDK propose deux méthodes pour obtenir les journaux.

Méthode 1 : Afficher les journaux dans la console de l'outil de développement

Cette méthode convient aux scénarios où vous pouvez reproduire le problème localement.

  1. Activez la journalisation et définissez le niveau de journalisation :

    // Enable SDK logging
    [AliPlayer setEnableLog:YES];
    // Set the log level (default: LOG_LEVEL_INFO). Use LOG_LEVEL_TRACE for detailed troubleshooting.
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:nil];
  2. Activez la journalisation au niveau des images (facultatif) :

    // Enable frame-level logging for detailed troubleshooting
    // 0 = disabled, 1 = enabled
    [AliPlayer setLogOption:FRAME_LEVEL_LOGGING_ENABLED value:value];
    Remarque

    La journalisation au niveau des images génère un grand volume de journaux et est principalement utilisée pour le dépannage des problèmes de lecture.

  3. Collectez les journaux :

    Option A : Afficher les journaux dans la console

    Après avoir reproduit le problème, récupérez les journaux depuis la console de votre outil de développement, tel que XCode.

    Option B : Écrire les journaux dans un fichier

    Définissez le chemin complet de votre fichier journal dans le sandbox de l'application.

    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentDirectory = [paths objectAtIndex:0];
    // Define your custom log file path. For example, create a file named 'xxxx.log'.
    NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:@"xxxx.log"];

    Redirigez les journaux vers un fichier personnalisé dans le sandbox de l'application :

    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout);
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);

    Après avoir reproduit le problème, récupérez le fichier .log depuis le répertoire personnalisé.

Méthode 2 : Définir LogCallback pour recevoir les journaux par programmation

Utilisez cette méthode lorsque vous ne pouvez pas reproduire le problème de manière fiable sur votre appareil. Le rappel exporte les journaux vers le canal de journalisation de votre application.

  1. Activez la journalisation et définissez le niveau de journalisation.

    // Enable SDK logging
    [AliPlayer setEnableLog:YES];
    // Set the log level. Default value: LOG_LEVEL_INFO. For troubleshooting, set it to LOG_LEVEL_TRACE.
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:^(AVPLogLevel logLevel, NSString *strLog) {
     NSLog(@"strLog:%@", strLog);
    }];
  2. Collectez les journaux :

    Après avoir reproduit le problème, les journaux sont automatiquement transférés vers le système de journalisation de votre application.

Dépannage

Problèmes courants

Problème

Cause possible

Solution

La vidéo ne se lance pas

Source de lecture invalide

Vérifiez que l'ID vidéo ou l'URL est correct

Écran noir

Vue du lecteur non définie

Assurez-vous que player.playerView est défini sur une vue valide

Identifiant de lecture expiré

Jeton expiré

Régénérez l'identifiant de lecture et réessayez

Audio présent mais pas de vidéo

Codec non pris en charge

Vérifiez le format vidéo et la compatibilité du codec

Lecture saccadée

Réseau médiocre

Activez la diffusion adaptative ou réduisez la qualité

Références

  • Fonctionnalités avancées : Découvrez des fonctionnalités avancées telles que Picture-in-Picture (PiP), le décalage temporel et la diffusion adaptative.

  • API : Explorez la référence API complète du SDK ApsaraVideo Player pour iOS.

  • Codes d'erreur mobiles : Consultez cette rubrique pour le dépannage.