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.
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.
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.mp4oucontent://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;
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
destroyAsyncsi 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
stopavantdestroyAsynccar 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;
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
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
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.
-
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]; -
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];RemarqueLa 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.
-
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
.logdepuis 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.
-
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); }]; -
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 |
|
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.