Trouvez des solutions aux problèmes courants rencontrés avec le SDK ApsaraVideo Player pour iOS, notamment les erreurs de compilation Xcode, les problèmes de lecture, le comportement de la fonction de recherche et la mise en cache.
Problèmes liés à la licence
Résolvez les problèmes de licence invalide ou expirée dans la rubrique Foire aux questions sur les licences.
Problèmes courants sur toutes les plateformes
Pour les problèmes indépendants de la plateforme, consultez la rubrique Foire aux questions sur le lecteur multiplateforme.
Les développeurs expérimentés peuvent également résoudre les erreurs de lecture de manière autonome.
Problèmes de développement
Des erreurs se produisent lors de l'empaquetage d'une application avec Xcode 14 et de sa soumission à l'App Store pour examen
Erreurs liées à Bitcode
Symptôme : Une erreur liée à Bitcode se produit lors de la soumission d'une build Xcode 14 à l'App Store :
ITMS-90482: Invalid Executable - The executable 'xxx.app/Frameworks/alivcffmpeg.framework/alivcffmpeg' contains bitcode.
Solution : Exécutez la commande xcrun bitcode_strip pour supprimer le bitcode du framework. ${framework_path} correspond au chemin du binaire du framework.
xcrun bitcode_strip ${framework_path} -r -o ${framework_path}
Erreurs liées à cURL
Symptôme : Une erreur liée à cURL se produit lors de la soumission d'une build Xcode 14 à l'App Store :
ITMS-90338: Non-public API usage - The app references non-public symbols in Frameworks/AliyunPlayer.framework/AliyunPlayer: _curl_multi_poll, _curl_multi_wakeup. If method names in your source code match the private Apple APIs listed above, altering your method names will help prevent this app from being flagged in future submissions. In addition, note that one or more of the above APIs may be located in a static library that was included with your app. If so, they must be removed. For further information, visit the Technical Support Information at http://developer.apple.com/support/technical/
Solution :
Si votre projet intègre uniquement le SDK ApsaraVideo Player (AliPlayerSDK_iOS), mettez à jour le SDK vers une version ultérieure à la 5.4.9.2.
Si votre projet intègre à la fois le SDK ApsaraVideo Player (AliPlayerPartSDK_iOS) et le SDK vidéo court, mettez à jour le SDK ApsaraVideo Player vers une version ultérieure à la 5.4.9.2, alivcffmpeg (QuCore-ThirdParty) vers la version 4.3.6 et le SDK vidéo court vers une version ultérieure à la 3,26.
Erreurs relatives aux API non publiques
Symptôme : Une erreur relative aux API non publiques se produit lors de la soumission d'une build Xcode 14 à l'App Store. Lors de la distribution d'une application avec Xcode, une boîte de dialogue Distribution completed with warnings apparaît, indiquant une App Store Connect Operation Error. L'erreur indique que l'application référence un sélecteur non public onCompletion: dans AliyunMediaDownloader.framework/AliyunMediaDownloader.
Solution : Il s'agit d'un avertissement provenant des builds Xcode 14 qui n'affecte généralement pas la publication si le projet se compile correctement. Si l'application ne peut pas être publiée, utilisez Xcode 13.
Erreurs liées aux plugins de post-traitement tels que mpf_filter.framework et vfi_filter.framework pour l'interpolation d'images et l'accentuation
Symptôme : Une erreur liée aux plugins de post-traitement (mpf_filter.framework, vfi_filter.framework) pour l'interpolation d'images et l'accentuation se produit lors de la soumission d'une build Xcode 14 à l'App Store. Lors de la distribution d'une application avec Xcode, une erreur Distribution failed with errors se produit, indiquant deux erreurs Asset validation failed : le CFBundleIdentifier com.alibaba.AliyunPlayer.mpf_filter de Payload/xxx.app/Frameworks/mpf_filter.framework et le CFBundleIdentifier com.alibaba.AliyunPlayer.vfi_filter de vfi_filter.framework contiennent des caractères invalides (traits de soulignement). Les CFBundleIdentifiers ne peuvent contenir que des caractères alphanumériques, des points (.) et des traits d'union (-).
Solution :
Si votre projet n'utilise pas le plugin mentionné dans le message d'erreur, vous pouvez le supprimer. Cela n'affecte pas les fonctionnalités du lecteur et permet de réduire la taille du package.
Si votre projet doit utiliser le plugin mentionné dans l'erreur, vous pouvez temporairement supprimer le
"_"de la chaîne de valeur dans la paire clé-valeur"Bundle identifier"du fichier Info.plist situé sous le chemin du framework, puis compiler et construire le projet.Vous pouvez effectuer une mise à niveau vers la version 5.5.2.0 ou ultérieure, dans laquelle la dénomination est corrigée.
Que faire si l'erreur « Xcode Error: PhaseScriptExecution failed with a nonzero exit code » se produit lors de la compilation et de l'exécution de la démo iOS ?
Suivez ces étapes : 1. Accédez au répertoire du projet. 2. Exécutez pod deintegrate.
3. Exécutez pod install.
Après avoir intégré le SDK ApsaraVideo Player pour iOS, puis-je déboguer et exécuter mon application sur un émulateur Xcode ?
Le SDK ApsaraVideo Player pour iOS ne prend pas en charge les émulateurs. Utilisez un iPhone physique pour déboguer et exécuter votre application.
Comment obtenir la progression actuelle de la lecture
Par défaut, le SDK ApsaraVideo Player signale la progression de la lecture toutes les 500 ms. Réduisez l'intervalle pour des mises à jour plus fréquentes :
AVPConfig *config = [self.player getConfig];
config.positionTimerIntervalMs = 100; // Change the callback interval. Unit: ms.
[self.player setConfig:config];
/**
@brief: The callback for the current playback position.
@param player: The player pointer.
@param position: The current playback position.
*/
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// The current playback progress.
long currentPosition = position;
}
Comment obtenir la largeur et la hauteur d'une vidéo
Trois méthodes sont disponibles :
-
Méthode 1 : Une fois le lecteur prêt (AVPEventPrepareDone), lisez la largeur et la hauteur à partir de l'instance AliPlayer.
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType { if (eventType == AVPEventPrepareDone) { NSLog(@"Video width: %d, height: %d", player.width, player.height); } } -
Méthode 2 : Écoutez le rappel de changement de taille de la vidéo, qui renvoie directement la largeur et la hauteur.
- (void)onVideoSizeChanged:(AliPlayer*)player width:(int)width height:(int)height rotation:(int)rotation { NSLog(@"Video width: %d, height: %d", width, height); } -
Méthode 3 : Écoutez le rappel d'informations sur la piste et lisez videoWidth et videoHeight à partir de AVPTrackInfo dans le tableau info.
RemarqueCette méthode dépend d'une requête réseau. Utilisez la méthode 1 ou la méthode 2 pour une meilleure fiabilité.
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info { for (int i=0; i<info.count; i++) { AVPTrackInfo *trackInfo = info[i]; NSLog(@"Video width: %d, height: %d", trackInfo.videoWidth, trackInfo.videoHeight); } }
La barre de progression revient en arrière après une opération de recherche
Cause : Par défaut, le lecteur utilise une recherche imprécise. Après une opération de recherche, le lecteur commence la lecture à partir d'une image clé proche du point de recherche.
Solution : Basculez vers le mode de recherche précise.
Comment basculer entre les modes de recherche précise et imprécise
Exemple :
// Switch to inaccurate seek.
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_INACCURATE];
// Switch to accurate seek.
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_ACCURATE];
La barre de progression revient toujours en arrière après le passage au mode de recherche précise
Cause : La recherche précise prend plus de temps que la recherche imprécise. Si la distance entre le point de recherche et l'image clé la plus proche est trop grande et dépasse l'intervalle maximal pour la recherche précise, le SDK ApsaraVideo Player bascule automatiquement vers la recherche imprécise. Cela provoque un retour en arrière de la barre de progression.
Solution : Augmentez l'intervalle maximal pour la recherche précise afin de réduire le repli vers la recherche imprécise. Un intervalle plus grand améliore la précision mais peut augmenter le temps de recherche lorsque les images clés sont éloignées :
// Unit: ms.
[self.player setMaxAccurateSeekDelta:10000];
Erreur lors de la mise en cache de la vidéo : encrypt check fail
La mise en cache fonctionne de la même manière que le téléchargement. Avec le téléchargement sécurisé activé, le fichier de vérification du chiffrement doit correspondre aux informations de l'application. Téléchargez le fichier depuis la rubrique Téléchargement hors ligne et ajoutez-le au SDK. Suivez les étapes décrites dans la rubrique Téléchargement de vidéos, sinon la mise en cache ou le téléchargement échouera.
Obtenir les données source audio et vidéo
Le code suivant fournit un exemple de la manière d'obtenir les données source audio et vidéo :
// Set the rendering callback.
self.player.renderingDelegate = self;
// Listen for the rendering callback.
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo {
if (frameInfo.frameType == Cicada_FrameType_Video) { // Underlying video data.
} else if (frameInfo.frameType == Cicada_FrameType_Audio) { // Underlying audio data.
}
return NO;
}
Comment obtenir les pixels de chaque image vidéo dans le lecteur ?
SDK ApsaraVideo Player pour iOS : Vous pouvez obtenir les pixels en écoutant le rappel onRenderingFrame.
player.renderingDelegate = self;
#pragma mark CicadaRenderingDelegate
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo{
if(frameInfo.frameType==Cicada_FrameType_Video){
// Video
NSLog(@"receive HW frame:%p pts:%ld foramt %d", frameInfo.video_pixelBuffer, frameInfo.pts, CVPixelBufferGetPixelFormatType(frameInfo.video_pixelBuffer));
} else if (frameInfo.frameType==Cicada_FrameType_Audio){
// Audio
}
return NO;
}
Logique de commutation adaptative du débit binaire
Après avoir activé la commutation adaptative du débit binaire avec l'API [self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];, le SDK surveille la vitesse du réseau. Si la vitesse atteint le niveau de débit binaire suivant dans les 10 secondes, le lecteur effectue la commutation ; sinon, il reste sur le débit binaire actuel.
Du haut vers le bas : le lecteur effectue la commutation une fois que le contenu à haut débit binaire mis en cache a fini d'être lu.
Du bas vers le haut : le lecteur effectue la commutation immédiatement.
Logique de nouvelle tentative personnalisée
Par défaut, le SDK tente deux fois de nouveau les opérations réseau ayant échoué, avec un délai d'expiration de 15 secondes. Si toutes les tentatives échouent, le rappel Error est déclenché.
Pour personnaliser la logique de nouvelle tentative, définissez le nombre de tentatives sur 0 et gérez les événements de nouvelle tentative en externe :
AVPConfig *config = [self.player getConfig];
config.networkRetryCount = 0; // Set the number of retries. In this example, the value is set to 0.
[self.player setConfig:config];
/**
@brief: The callback for player events.
@param player: The player pointer.
@param eventWithString: The player event type.
@param description: The description of the player event.
@see AVPEventType
*/
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_PLAYER_NETWORK_RETRY) { // Network error. A retry is required.
// TODO: Add the processing logic.
}
}
Une erreur 403 est signalée et la lecture d'un flux HLS échoue après la configuration de la mise en cache locale
Symptôme : La lecture d'un flux HLS (M3U8) avec VidAuth et la mise en cache locale activés échoue avec une erreur 403.
Cause : Si vous quittez avant que la vidéo ne soit entièrement mise en cache, le lecteur réutilise les identifiants VidAuth expirés lors de la prochaine tentative de lecture, ce qui provoque une erreur 403.
Solution : Dans le SDK V5.5.4.0 et versions ultérieures, définissez le champ AVPConfig.enableStrictAuthMode pour contrôler le mode d'authentification pour les flux HLS avec des paramètres d'authentification. La valeur par défaut est false.
Authentification non stricte (
false) : Les informations d'authentification sont mises en cache avec le contenu multimédia. Si seule une partie du média a été mise en cache précédemment, le lecteur utilise les informations d'authentification mises en cache pour demander la partie non mise en cache. Si l'authentification de l'URL a une courte période de validité ou si la lecture reprend après une longue pause, l'authentification peut expirer. Pour gérer cela, vous devez implémenter la fonctionnalité de actualisation automatique de la source.Authentification stricte (
true) : Les informations d'authentification ne sont pas mises en cache. L'authentification a lieu au début de chaque session de lecture. Cela peut entraîner un échec de la lecture s'il n'y a pas de connexion réseau.
La préemption audio empêche le SDK ApsaraVideo Player pour iOS de lire des vidéos
Symptôme : Lorsque votre projet utilise à la fois le SDK ApsaraVideo Player et d'autres contrôles audio, des problèmes de lecture tels que l'absence de son ou des saccades vidéo se produisent.
Cause : Le AVAudioSession dans iOS est un singleton. Sans configuration unifiée entre plusieurs contrôles audio, la préemption audio peut empêcher la lecture vidéo.
Solution : Vous pouvez configurer AVAudioSession de manière unifiée à un emplacement approprié dans votre projet. Par exemple, vous pouvez configurer la session audio de l'application comme catégorie de lecture et autoriser le mélange avec d'autres applications. Vous pouvez également configurer la session audio de l'application comme catégorie PlayAndRecord pour les scénarios d'enregistrement et de lecture. Si une erreur se produit pendant l'opération, le message d'erreur est stocké dans la variable err.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&err];
Vous pouvez également définir un proxy AVAudioSession personnalisé côté SDK pour contourner sa logique interne AVAudioSession et éviter la préemption :
-
Définissez le proxy.
[AliPlayer setAudioSessionDelegate:self]; -
Définissez l'écouteur pour le proxy.
return TRUEindique que le SDK ne configure plusAVAudioSessionen interne.#pragma mark CicadaAudioSessionDelegate - (BOOL)setActive:(BOOL)active error:(NSError **)outError { return YES; } - (BOOL)setCategory:(NSString *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return YES; } - (BOOL)setCategory:(AVAudioSessionCategory)category mode:(AVAudioSessionMode)mode routeSharingPolicy:(AVAudioSessionRouteSharingPolicy)policy options:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return YES; }
Un crash de pile pointant vers le SDK se produit lors de l'exécution du SDK ApsaraVideo Player pour iOS
Si un crash de pile pointant vers le SDK se produit lors de l'utilisation du SDK ApsaraVideo Player pour iOS, suivez ces étapes :
Effectuez une mise à niveau vers la dernière version du SDK ApsaraVideo Player pour iOS, qui inclut des améliorations continues de la stabilité. Téléchargez le dernier SDK depuis la rubrique Présentation du SDK.
Si le crash persiste après la mise à niveau, fournissez les informations complètes sur le crash au support technique d'Alibaba Cloud. Obtenir une assistance technique.
Le SDK ApsaraVideo Player pour iOS prend-il en charge le téléchargement pendant la lecture ?
Non. Le SDK prend en charge la mise en cache locale, qui télécharge les vidéos pendant la lecture pour une utilisation hors ligne ultérieure. Cependant, il ne prend pas en charge la lecture des fichiers mis en cache stockés dans un répertoire de fichiers distinct.
Le SDK ApsaraVideo Player pour iOS prend-il en charge l'obtention de la progression de la mise en mémoire tampon d'une vidéo ?
Oui. Le SDK ApsaraVideo Player pour iOS permet d'obtenir la vitesse de mise en mémoire tampon, le taux de trames de rendu en temps réel, les débits binaires audio et vidéo, ainsi que le débit binaire de téléchargement réseau. Consultez la rubrique Obtenir des informations de lecture.
Un crash se produit pendant l'exécution du lecteur
Pour identifier la cause :
-
Vérifiez si le crash se produit dans le SDK ApsaraVideo Player.
Vérifiez si la pile de crash contient le préfixe
AliyunPlayer. Si c'est le cas, le problème se situe dans le SDK ApsaraVideo Player. Effectuez une mise à niveau vers la dernière version du SDK ApsaraVideo Player et vérifiez si le problème est résolu.
Si le problème persiste, préparez les fichiers de crash (tous les threads), les journaux de crash et les scénarios de crash comme décrit dans la rubrique Comment obtenir les journaux.
Un crash lié à l'initialisation du programme ou au préchargement se produit lors de l'exécution du SDK ApsaraVideo Player V5.4.6.0
Mettez à jour le SDK ApsaraVideo Player vers une version ultérieure à la V5.4.7.1. Pour maintenir la stabilité de la V5.4.6.0, vous pouvez également utiliser la version de correctif à chaud pod 5.4.6.0-25587639.
Comment activer la lecture en plein écran
Le SDK ApsaraVideo Player pour iOS ne fournit pas d'API pour la lecture en plein écran. Vous devez implémenter cette fonctionnalité en vous basant sur le système. La démo du SDK ApsaraVideo Player pour iOS pour les versions 5.5.0.0 et ultérieures est adaptée à la méthode plein écran d'iOS 16.0 et ultérieur.
Le code suivant fournit un exemple de la manière d'implémenter cette fonctionnalité :
Après avoir exécuté la méthode plein écran du système, vous devez également ajuster le cadre de playerView défini pour l'instance Aliplayer en fonction de l'écran.
UIInterfaceOrientation orientation = UIInterfaceOrientationLandscapeLeft; // Rotate to full screen
......
// For iOS 16.0 and later
if (@available(iOS 16.0, *)) {
@try {
NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
UIWindowScene *ws = (UIWindowScene *)array[0];
Class GeometryPreferences = NSClassFromString(@"UIWindowSceneGeometryPreferencesIOS");
id geometryPreferences = [[GeometryPreferences alloc]init];
UIInterfaceOrientationMask orientationMask = UIInterfaceOrientationMaskLandscapeRight;
if (orientation == UIInterfaceOrientationPortrait) {
orientationMask = UIInterfaceOrientationMaskPortrait;
}
[geometryPreferences setValue:@(orientationMask) forKey:@"interfaceOrientations"];
SEL sel_method = NSSelectorFromString(@"requestGeometryUpdateWithPreferences:errorHandler:");
void (^ErrorBlock)(NSError *err) = ^(NSError *err){
NSLog(@"Screen rotation error:%@", [err debugDescription]);
};
if ([ws respondsToSelector:sel_method]) {
(((void (*)(id, SEL,id,id))[ws methodForSelector:sel_method])(ws, sel_method,geometryPreferences,ErrorBlock));
}
} @catch (NSException *exception) {
NSLog(@"Screen rotation error:%@", exception.reason);
} @finally {
}
} else { // For systems earlier than iOS 16.0
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
SEL selector = NSSelectorFromString(@"setOrientation:");
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
[invocation setArgument:&Orientation atIndex:2];
[invocation invoke];
}
[[UIApplication sharedApplication]setStatusBarOrientation:orientation animated:YES];
}
Des barres noires apparaissent pendant la lecture vidéo
Pour identifier la cause :
Vérifiez si la source vidéo comporte elle-même des bandes noires.
-
Appelez l'API suivante pour ajuster le mode de mise à l'échelle du lecteur.
/* AVP_SCALINGMODE_SCALEASPECTFILL: The video is scaled to fill the screen. The video may be cropped. AVP_SCALINGMODE_SCALEASPECTFIT: The video is scaled to fit the screen. Black bars may appear. AVP_SCALINGMODE_SCALETOFILL: The video is scaled to fill the screen without preserving the aspect ratio. The video may be distorted. */ self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL; Si le mode de mise à l'échelle ne répond pas à vos besoins, ajustez la largeur et la hauteur de la vue personnalisée pour
self.player.playerViewen modifiant leframedeself.player.playerView.
L'audio est lu mais aucune vidéo n'est affichée, et le journal indique « log[AFVTBDecoder] :IOS8VT: throw frame »
Pour identifier la cause :
Utilisez un autre lecteur pour lire la vidéo et vérifiez s'il s'agit d'un fichier audio uniquement.
-
Si la vidéo est lue normalement sur un autre lecteur et que les dimensions de la vidéo changent, basculez vers le décodage logiciel. Le code suivant montre comment effectuer ce basculement :
player.enableHardwareDecoder = NO
Quel est l'impact du basculement vers le décodage logiciel dans les lecteurs iOS ?
Après avoir défini player.enableHardwareDecoder = NO pour basculer vers le décodage logiciel, les principaux effets sont les suivants :
Le taux d'utilisation du CPU augmente, ce qui peut provoquer une surchauffe de l'appareil et une consommation électrique plus rapide.
Cela permet d'éviter efficacement les problèmes de compatibilité du décodage matériel, en particulier dans les scénarios de changement dynamique de la résolution vidéo ou de charge élevée de l'appareil, améliorant ainsi la stabilité de la lecture.
Dans cette rubrique, la sous-section « Lors de la lecture vidéo, il n'y a ni son ni image, le journal indique log[AFVTBDecoder] :IOS8VT: throw frame » suggère de résoudre ce problème en définissant player.enableHardwareDecoder = NO pour basculer vers le décodage logiciel. Voici une explication complémentaire des coûts et avantages de ce paramètre pour vous aider à peser le pour et le contre avant activation.
Des saccades et une désynchronisation audio-vidéo se produisent lors de la récupération de flux RTS sur un client iOS
Solution : Intégrez le dernier composant ultra-faible latence du lecteur. Implémenter la récupération de flux RTS sur un client iOS.
Lorsqu'une application iOS est en arrière-plan ou n'est pas démarrée, l'audio est lu mais aucune vidéo n'est affichée si l'utilisateur accède à l'application via une notification.
Solution : Supprimez UIApplicationStateActive == [[UIApplication sharedApplication] applicationState].
- (AliPlayer *)aliPlayer{
if (!_aliPlayer && UIApplicationStateActive == [[UIApplication sharedApplication] applicationState]) {
_aliPlayer = [[AliPlayer alloc] init];
_aliPlayer.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
_aliPlayer.rate = 1;
_aliPlayer.delegate = self;
_aliPlayer.playerView = self.playerView;
}
return _aliPlayer;
}
Lors de la lecture d'un flux en direct, le journal signale une erreur standard : « -5, IO error (Input/Output (I/O)) »
Lorsque vous lisez un flux en direct, utilisez les valeurs par défaut pour les paramètres de mise en cache et de contrôle de la latence (startBufferDuration, highBufferDuration et maxBufferDuration dans AVPConfig). Ne personnalisez pas ces paramètres. Vérifiez votre configuration par rapport à Configurer la mise en cache et le contrôle de la latence.
Après avoir mis la lecture en pause, navigué ailleurs, puis être revenu pour reprendre la lecture, une erreur liée à l'audio est signalée dans le journal : « Deactivating an audio session that has running I/O. » ou « All I/O should be stopped or paused prior to deactivating the audio session. »
Symptôme : Sur la page de lecture vidéo, vous mettez la lecture en pause et accédez à une autre page comportant de l'audio. À votre retour, vous ne pouvez pas reprendre la lecture et une erreur liée à l'audio telle que « Deactivating an audio session that has running I/O. » ou « All I/O should be stopped or paused prior to deactivating the audio session. » est signalée dans le journal.
Solution : Vérifiez les conflits dans les paramètres audio (propriétés AudioSession). Par exemple, lorsque vous quittez une autre page avec audio, les ressources audio peuvent ne pas être libérées à temps (l'enregistrement ou la lecture audio associé n'est pas arrêté rapidement).
Une erreur se produit lors de l'utilisation d'AliListPlayer pour lire une vidéo HLS (m3u8)
Les versions du SDK ApsaraVideo Player antérieures à la V5.4.5.0 ne prennent pas en charge l'utilisation du lecteur de liste AliListPlayer pour lire des vidéos HLS (m3u8). Les versions V5.4.5.0 et ultérieures prennent en charge la lecture de vidéos HLS (m3u8), mais vous devez activer la mise en cache locale. Mise en cache locale.
Impossible de lire une vidéo en arrière-plan
Symptôme : Le SDK ApsaraVideo Player pour iOS ne prend pas en charge la lecture en arrière-plan par défaut. La démo ne lit pas non plus les vidéos en arrière-plan.
Solution :
Activez la fonctionnalité de collecte de données en arrière-plan dans Xcode. Dans Xcode, sélectionnez la cible, ouvrez l'onglet Capabilities, définissez le commutateur Background Modes sur ON et, dans la liste des modes développée, sélectionnez Audio, AirPlay, and Picture in Picture.
-
Si vous avez implémenté des méthodes de surveillance de l'avant-plan/arrière-plan de l'application, mettez en commentaire les méthodes de pause et de reprise associées.
// Add an observer to detect when the app enters the background [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationEnterBackground) name: UIApplicationWillResignActiveNotification object:nil]; // This method is called when the app enters the foreground from the background [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name: UIApplicationDidBecomeActiveNotification object:nil]; // The pause method that needs to be commented out - (void)applicationEnterBackground { // [self.player pause]; } // The restart method that needs to be commented out - (void)applicationDidBecomeActive { // [self.player start]; }
L'erreur « Redirect to a url » se produit occasionnellement lors de la lecture vidéo
Cette erreur peut se produire car la source vidéo est détournée. Activez HTTPDNS sur le lecteur pour résoudre ce problème. Configurer HTTPDNS pour un client iOS.
Une erreur unsupported protocol se produit lors de la lecture d'un flux ARTC
Cause 1 : La couche de pont entre le lecteur et le composant RTS (AlivcArtc) ainsi que le composant RTS (RtsSDK) ne sont pas intégrés, bien que le SDK ApsaraVideo Player soit intégré.
Solution : Pour plus d'informations sur l'intégration des composants, consultez Implémenter la récupération de flux RTS sur un client iOS.
Cause 2 : La version de la couche de pont entre le lecteur et le composant RTS (AlivcArtc) est incohérente avec la version du lecteur.
Solution : La couche de pont (AlivcArtc) et le lecteur doivent avoir le même numéro de version. Implémenter la récupération de flux RTS sur un client iOS.
Si une vidéo est transcodée en plusieurs définitions, quelle définition le SDK ApsaraVideo Player lit-il par défaut ?
Le SDK lit la première définition disponible dans cet ordre : FD, LD, SD, HD, 2K, 4K, OD. Définition.
Comment spécifier la définition par défaut pour la lecture vidéo
Exemple :
// The following code provides an example of playback using VidSts.
AVPVidStsSource *stsSource = [[AVPVidStsSource alloc] init];
stsSource.vid = @"<vid>";
stsSource.accessKeyId = @"<accessKeyId>";
stsSource.securityToken = @"<securityToken>";
stsSource.accessKeySecret = @"<accessKeySecret>";
stsSource.quality = @""; // The expected definition for playback. Valid values: FD, LD, SD, HD, 2K, 4K, and OD.
stsSource.forceQuality = NO; // Specifies whether to forcibly play the video in the expected definition. NO: The video is not forcibly played in the expected definition. The player searches for definitions in the default order and plays the video in the first definition that it finds. YES: The video is forcibly played in the expected definition. If the expected definition is not found, the video is not played.
Si une définition comporte plusieurs flux, quel flux le SDK ApsaraVideo Player lit-il ?
Si une définition comporte plusieurs flux, le SDK ApsaraVideo Player lit le flux le plus récent.
Comment configurer une vidéo pour qu'elle soit lue sans filigrane mais téléchargée avec un filigrane ?
Transcodez la vidéo en plusieurs définitions. Lisez la définition sans filigrane et téléchargez la définition avec filigrane.
Le mode paysage ne prend pas effet
Le SDK ApsaraVideo Player pour iOS ne fournit pas de méthode pour implémenter le mode paysage. Vous devez implémenter cette fonctionnalité en vous basant sur l'API système iOS. Lorsque vous implémentez le mode paysage, assurez-vous de définir correctement le frame de aliplayer.playerView.
Comment obtenir les journaux
Soumettez les journaux lors de la demande d'assistance technique Alibaba Cloud pour accélérer la résolution des problèmes.
-
Obtenez les journaux.
Définissez le niveau de journal sur
LOG_LEVEL_TRACEavant d'obtenir les journaux. Obtenir les journaux du SDK. -
Fournissez les journaux générés à l'assistance technique Alibaba Cloud.
Après l'activation du cache local, la vidéo multi-débit (HLS) manque le cache.
Phénomène du problème : Le cache local a été activé et le préchargement effectué conformément à la documentation, mais la progression de la recherche arrière vers le cache manqué pendant la lecture, ou la lecture ne peut pas continuer après la déconnexion du réseau, ou la vérification du fichier cache indique qu'il n'existe pas, ou le répertoire cache est vide après la désactivation du préchargement.
Cause du problème : Dans le scénario multi-débit (HLS), si un certain flux n'est pas explicitement sélectionné pendant la lecture, le lecteur fonctionne en mode ABR (débit adaptatif) et les données en mode ABR ne sont pas écrites sur le disque, donc aucun cache local n'est généré. Ce n'est qu'après avoir appelé explicitement selectTrack pour sélectionner un certain flux de code que les données sélectionnées seront mises en cache localement. Si selectTrack n'est pas appelé (ou si SELECT_AVPTRACK_TYPE_VIDEO_AUTO est transmis), le traitement sera effectué selon le mode ABR.
Solution : Assurez-vous que le préchargement et la lecture utilisent la même définition et la même adresse de lecture, et sélectionnez explicitement le flux de code pendant la lecture.
Pendant l'étape de préchargement, activez le cache local pour lancer le préchargement sur le flux de code de la définition spécifiée.
La phase de lecture appelle
selectTrackaprès queonPlayerEventait reçu l'événement de fin de préparation (AVPEventPrepareDone), et sélectionne la même définition que le préchargement ;setUrlSource(AVPUrlSource) utilise la même adresse de lecture que le préchargement, puisprepareetstart.Si le débit de départ est incohérent avec le débit par défaut, la mise en mémoire tampon sera déclenchée. Il est recommandé de définir le débit de départ pour réduire les saccades lors du changement.
La lecture d'un fichier HLS (m3u8) téléchargé localement entraîne l'erreur « No such file or directory ».
Phénomène du problème : Après le téléchargement hors ligne de HLS, la lecture de l'adresse locale signale No such file or directory (fichier introuvable). Ce problème peut ne pas être systématique et est plus facile à reproduire dans des scénarios tels que le changement rapide de pages multiples (glissement rapide).
Cause du problème : Le téléchargement hors ligne de HLS ne télécharge généralement que les tranches ts et le m3u8 d'une seule des définitions (par exemple, 540p) afin d'économiser de l'espace, mais le master m3u8 enregistré localement conserve toujours les enregistrements de toutes les définitions (par exemple, 1080p/720p/540p/360p) tels quels. Pendant la lecture, si la définition téléchargée n'est pas spécifiée avant prepare, le lecteur essaiera de demander d'autres parties de définition qui n'existent pas localement selon la logique par défaut/adaptative, signalant ainsi que le fichier est introuvable. Une cause courante est l'omission d'un appel avec une clarté spécifiée, ou le timing de l'appel postérieur à prepare.
Solution :
setDefaultResolution est appelé avant prepare, en spécifiant la même définition que le téléchargement hors ligne.
Assurez-vous que tous les portails de lecture sont configurés avec une définition par défaut, y compris le glissement rapide, le multiplexage multi-instance, le changement de préchargement et autres branches, pour éviter de manquer un chemin.
getCurrentTrack peut être utilisé pour vérifier si la définition de démarrage réelle est la définition téléchargée.
Un décalage audio-vidéo se produit après le changement de vidéo, ou la même vidéo est lue à plusieurs reprises et manque le cache.
Phénomène du problème : Après l'activation du cache local, lors du changement de vidéos (comme le changement de numéro d'épisode), il y a un décalage du son et de l'image (l'écran affiche une nouvelle vidéo et le son correspond toujours à la vidéo précédente), ou la même vidéo est lue à plusieurs reprises sans atteindre le cache ; Après avoir vidé le cache, tout revient à la normale.
Cause du problème : Après l'activation du cache local, le lecteur utilise le Hash renvoyé par le rappel setCacheUrlHashCallback comme identifiant de cache unique pour chaque adresse de lecture (iOS implémente ce rappel via le pointeur de fonction C). Si le rappel ne garantit pas que « la même adresse de lecture renvoie toujours le même hash, un contenu différent renvoie un hash différent », cela entraînera une incompatibilité de clé de cache : un contenu différent atteint le même cache (se manifestant par un décalage audio-image), ou la même adresse génère un hash différent à chaque fois et ne peut pas atteindre le cache.
Solution :
Le rappel doit renvoyer de manière stable le même hash pour la même adresse de lecture, et des médias différents doivent renvoyer des hashes différents.
Par exemple, afin de supprimer le paramètre d'authentification pour améliorer le taux de réussite, seul le hash est calculé après la suppression du paramètre d'authentification pour l'adresse de lecture (m3u8/mp4) ; La keyURL du m3u8 chiffré n'a pas besoin d'être authentifiée, sinon les clés de différentes vidéos atteindront le même cache et provoqueront un échec de lecture - cela peut être géré différemment par nom de domaine dans le rappel.
Si le même fichier possède à la fois des adresses HTTP et HTTPS, le protocole peut être unifié ou le hash peut être calculé après la suppression de l'en-tête de protocole.
Pour plus de détails, reportez-vous à Fonctionnalités avancées.
Échec de l'authentification lors de la lecture d'une vidéo chiffrée privée Alibaba Cloud
Phénomène du problème : Lors de la lecture d'une vidéo chiffrée par Alibaba Cloud Video (chiffrement privé), l'authentification échoue ou la lecture est impossible.
Cause du problème : Le chiffrement vidéo Alibaba Cloud (chiffrement privé) est déchiffré par l'interaction entre le lecteur et le serveur, et la lecture doit être démarrée via la lecture vid. Si vous utilisez AVPUrlSource à la demande pour transférer directement l'adresse de lecture pour jouer (chiffrement privé courant), l'authentification et le déchiffrement ne peuvent pas être effectués, ce qui entraîne un échec.
Solution :
Les vidéos chiffrées privées sont lues sur iOS via
AVPVidAuthSource(VidAuth) ouAVPVidStsSource(VidSts) à la demande. Si le flux de sortie est mélangé avec des flux non chiffrés privés, vous pouvez définir le type de chiffrement surAliyunVoDEncryptionpour filtrer les flux chiffrés privés.Remarque : Seul le « Chiffrement privé par licence » prend en charge la lecture
AVPUrlSourceà la demande (MP4 doit être concaténé à la fin de l'URLetavirp_nuyila=1, HLS peut utiliser directement l'URL d'origine dans la version prise en charge correspondante), le chiffrement privé ordinaire ne s'applique pas.
Pour plus de détails, reportez-vous à Lire une vidéo chiffrée.