Le type de scénario (SceneType) est une abstraction dans AliPlayerKit pour les scénarios de lecture. Spécifiez un scénario pour adapter automatiquement le comportement de l'interface utilisateur, les contrôles gestuels et la visibilité des emplacements.
Il n'est pas nécessaire de définir un SceneType pour les scénarios standard de vidéo à la demande (VOD). La valeur par défaut est SceneTypeVOD, qui offre des capacités de lecture complètes. Spécifiez explicitement un SceneType uniquement pour les scénarios autres que la VOD, tels que la diffusion en direct ou la lecture restreinte.
Introduction
Qu'est-ce que SceneType ?
SceneType est une énumération qui spécifie le scénario métier actuel du lecteur. Lorsque vous définissez le SceneType, AliPlayerKit :
Ajuste la visibilité des emplacements, par exemple en masquant la vignette dans un scénario de diffusion en direct.
Filtre les gestes, par exemple en désactivant la recherche de progression et l'ajustement de la vitesse de lecture dans les scénarios en direct ou restreints, ou en désactivant les gestes verticaux dans les scénarios de liste de vidéos.
S'adapte aux limitations des fonctionnalités, par exemple en garantissant que les utilisateurs regardent le contenu dans son intégralité et dans l'ordre dans un scénario restreint.
En définissant simplement une valeur d'énumération, le framework gère automatiquement ces adaptations. Cela réduit considérablement l'effort nécessaire pour personnaliser le lecteur pour différents scénarios métier.
Valeur principale
|
Valeur |
Description |
|
Adaptation sans configuration |
Après la définition d'un scénario, l'interface utilisateur et les comportements interactifs s'ajustent automatiquement. Il n'est pas nécessaire de configurer chaque emplacement et geste individuellement. |
|
Garantie de cohérence |
Toutes les instances de lecteur dans le même scénario maintiennent une interface utilisateur et un comportement interactif cohérents. |
|
Réduction des coûts de personnalisation |
Remplacez des dizaines de lignes de code relatives à la visibilité des emplacements et au filtrage des gestes par une seule ligne de code. |
|
Évolutivité |
Ajustez finement à l'aide de SlotConfig et GestureControlSlotConfig. |
Fonctionnalités
Aperçu des scénarios
AliPlayerKit intègre cinq types de scénarios qui couvrent la plupart des besoins de lecture :
|
Scénario |
Valeur d'énumération |
Description |
Activité concernée |
Différences par rapport à la VOD |
|
VOD |
|
Scénario par défaut. Prend en charge toutes les capacités de contrôle. |
VOD standard, cours, bibliothèque multimédia |
— |
|
Live |
|
Flux en temps réel sans durée fixe. Les opérations sur la timeline sont automatiquement désactivées. |
Diffusion en direct, événements sportifs, live commerce |
Désactive la recherche de progression et l'ajustement de la vitesse de lecture. Masque la vignette. |
|
Liste de vidéos |
|
Désactive les gestes verticaux pour éviter les conflits avec le défilement de la liste. |
Fils d'actualité, listes de courtes vidéos |
Désactive les gestes verticaux pour le volume et la luminosité. |
|
Lecture restreinte |
|
Empêche le saut pour garantir que les utilisateurs regardent la vidéo dans son intégralité. |
Surveillance d'examens, cours de formation |
Désactive la recherche de progression et l'ajustement de la vitesse de lecture. Masque la vignette. |
|
Minimal |
|
Interface épurée. Tous les contrôles doivent être implémentés séparément. |
Lecture en arrière-plan, interface utilisateur entièrement personnalisée |
Masque tous les composants de contrôle et les gestes. |
Définition de l'énumération
// SceneType.h
typedef NS_ENUM(NSInteger, SceneType) {
/** VOD scenario (default) */
SceneTypeVOD = 0,
/** Live streaming scenario */
SceneTypeLive = 1,
/** Video list or short video stream scenario */
SceneTypeVideoList = 2,
/** Restricted playback scenario */
SceneTypeRestricted = 3,
/** Minimal playback page scenario */
SceneTypeMinimal = 4,
};
Matrice des capacités des scénarios
Visibilité des emplacements
Le système d'emplacements contrôle automatiquement la visibilité des composants en fonction du type de scénario. La matrice suivante présente les règles par défaut issues de DefaultSlotFactory.defaultConfigs :
|
Emplacement |
VOD |
Live |
VideoList |
Restricted |
Minimal |
|
PlayerSurface |
✓ |
✓ |
✓ |
✓ |
✓ |
|
GestureControl |
✓ |
✓ |
✓ |
✓ |
✗ |
|
LandscapeHint |
✓ |
✓ |
✓ |
✓ |
✗ |
|
Cover |
✓ |
✗ |
✓ |
✗ |
✗ |
|
CenterDisplay |
✓ |
✓ |
✓ |
✓ |
✗ |
|
PlayState |
✓ |
✓ |
✓ |
✓ |
✓ |
|
LogPanel |
✓ |
✓ |
✓ |
✓ |
✗ |
|
TopBar |
✓ |
✓ |
✓ |
✓ |
✗ |
|
BottomBar |
✓ |
✓ |
✓ |
✓ |
✗ |
|
SettingMenu |
✓ |
✓ |
✓ |
✓ |
✗ |
|
OptionPanel |
✓ |
✓ |
✓ |
✓ |
✗ |
Descriptions des règles de visibilité :
PlayerSurfaceetPlayState: Visibles dans tous les scénarios (aucune configurationexcludedScenes).Cover: Non visible dans les scénariosLive,RestrictedouMinimal.Autres emplacements (
GestureControl,LandscapeHint,CenterDisplay,LogPanel,TopBar,BottomBar,SettingMenu,OptionPanel) : Non visibles uniquement dans le scénarioMinimal.
Différences de comportement des gestes
L'emplacement GestureControlSlot filtre en interne les gestes dans chaque méthode de gestion en fonction du currentSceneType :
|
Geste |
VOD |
Live |
VideoList |
Restricted |
Minimal |
|
Clic (Afficher/Masquer la barre de contrôle) |
✓ |
✓ |
✓ |
✓ |
✗ |
|
Double-clic (Lecture/Pause) |
✓ |
✓ |
✓ |
✓ |
✗ |
|
Appui long (Avance rapide) |
✓ |
✗ |
✓ |
✗ |
✗ |
|
Glissement horizontal (Recherche de progression) |
✓ |
✗ |
✓ |
✗ |
✗ |
|
Glissement vertical gauche (Luminosité) |
✓ |
✓ |
✗ |
✓ |
✗ |
|
Glissement vertical droit (Volume) |
✓ |
✓ |
✗ |
✓ |
✗ |
Descriptions de la logique de filtrage :
Minimal : Toutes les méthodes de gestion des gestes (
handleSingleTap:,handleDoubleTap:,handleLongPress:ethandlePan:) effectuent unreturnimmédiat dès l'entrée.Live / Restricted : L'appui long et le glissement horizontal sont désactivés. Cette vérification est effectuée dans
handleLongPress:ettryStartDragWithCurrentPoint:.VideoList : Le glissement vertical est désactivé. La méthode
tryStartDragWithCurrentPoint:effectue unreturnimmédiat lorsqu'elle détecteSceneTypeVideoList.
Utilisation
Utilisation de base
Spécifiez le type de scénario à l'aide de la propriété AliPlayerModel.sceneType. La valeur par défaut est SceneTypeVOD, qu'il n'est pas nécessaire de définir explicitement.
Scénario VOD (par défaut, aucune configuration requise) :
VideoSource *source = [VideoSource urlSourceWithUrl:@"https://example.com/video.mp4"];
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
// model.sceneType defaults to SceneTypeVOD, no setup required
[controller configure:model];
Scénario de diffusion en direct :
VideoSource *source = [VideoSource urlSourceWithUrl:@"https://live.example.com/stream.m3u8"];
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeLive;
model.videoTitle = @"Live Channel";
[controller configure:model];
Scénario de liste de vidéos :
VideoSource *source = [VideoSource urlSourceWithUrl:@"https://live.example.com/stream.m3u8"];
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeLive;
model.videoTitle = @"live channel";
[controller configure:model];
Description détaillée de chaque scénario
VOD - Scénario VOD (par défaut)
Scénarios : Lecture vidéo standard, cours en ligne, navigation dans la bibliothèque multimédia, etc.
Capacités :
Prend en charge les 11 emplacements par défaut
Prend en charge les 6 gestes
Prend en charge la recherche de progression, l'ajustement de la vitesse de lecture et le changement de résolution
Prend en charge le basculement en plein écran
// No need to explicitly specify SceneType, the default is VOD
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.coverUrl = @"https://example.com/cover.jpg";
model.videoTitle = @"Great Video";
model.autoPlay = YES;
[controller configure:model];
Live - Scénario de diffusion en direct
Scénarios : Diffusion en direct en temps réel, événements sportifs en direct, live commerce, etc.
Principales différences par rapport à la VOD :
Désactivé : La recherche de progression (geste horizontal) et l'ajustement de la vitesse de lecture (geste d'appui long), car les flux en direct n'ont pas de durée fixe.
Masqué : L'emplacement de vignette, car les flux en direct n'ont pas besoin de vignette.
Conservé : Les gestes de clic/double-clic, l'ajustement du volume et de la luminosité.
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:liveSource];
model.sceneType = SceneTypeLive;
model.videoTitle = @"Popular Live Stream";
model.autoPlay = YES;
[controller configure:model];
VideoList - Scénario de liste de vidéos
Scénarios : Vidéos intégrées dans les fils d'actualité, listes de courtes vidéos, collections de vidéos défilantes, etc.
Principales différences par rapport à la VOD :
Désactivé : Les gestes de glissement vertical pour éviter les conflits avec le défilement de
UIScrollViewde la liste.Conservé : Toutes les autres fonctionnalités, telles que la recherche de progression, l'ajustement de la vitesse de lecture et les gestes de clic/double-clic/appui long.
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeVideoList;
model.autoPlay = YES;
[controller configure:model];
Restricted - Scénario de lecture restreinte
Scénarios : Vidéos de surveillance d'examens en ligne, cours de formation et de certification, scénarios de protection des droits d'auteur, etc.
Principales différences par rapport à la VOD :
Désactivé : La recherche de progression (geste horizontal) et l'ajustement de la vitesse de lecture (geste d'appui long) pour garantir que les utilisateurs regardent le contenu dans son intégralité et dans l'ordre.
Masqué : L'emplacement de vignette.
Conservé : Les gestes de clic/double-clic, l'ajustement du volume et de la luminosité.
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeRestricted;
model.videoTitle = @"Security Training Course";
model.autoPlay = YES;
// Usually used with screenshot prevention
model.disableScreenshot = YES;
[controller configure:model];
Minimal - Mode minimal
Scénarios : Lecture en arrière-plan, interface utilisateur entièrement personnalisée, lecture de vignettes d'aperçu, etc.
Principales différences par rapport à la VOD :
Masqué : Presque tous les emplacements de contrôle de l'interface utilisateur. Seuls
PlayerSurfaceetPlayStatesont conservés.Désactivé : Tous les gestes. L'emplacement
GestureControln'est pas visible dans le scénario Minimal, et ses méthodes internes de gestion des gestes effectuent toutes unreturnimmédiat.Cas d'utilisation : Scénarios nécessitant une interface utilisateur de contrôle de lecture entièrement personnalisée.
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeMinimal;
[controller configure:model];
// All controls must be implemented using the controller's API
// For example: [controller play]; [controller pause]; [controller seekTo:position];
Développement personnalisé
Réglage fin de la visibilité des emplacements
Si la visibilité prédéfinie des emplacements pour un scénario ne répond pas à vos exigences, ajustez-la finement à l'aide de SlotConfig :
// Example: Hide the TopBar in the Live scenario
SlotConfig *topBarConfig = [SlotConfig configWithSlotType:SlotTypeTopBar
excludedScenes:[NSSet setWithObjects:
@(SceneTypeMinimal),
@(SceneTypeLive), nil]];
// Register with SlotManager (overwrites the default SlotConfig for this slot type)
[playerView.slotManager registerSlotConfig:topBarConfig];
Vous pouvez également masquer un emplacement entier directement à l'aide de hideSlot:. Cette méthode ne dépend pas du scénario :
// Unconditionally hide the TopBar (requires calling rebuildSlots to take effect)
[playerView.slotManager hideSlot:SlotTypeTopBar];
registerSlotConfig: fournit un contrôle de visibilité au niveau du scénario, tandis que hideSlot: fournit un contrôle de visibilité au niveau de l'emplacement. Ils fonctionnent indépendamment. Un emplacement est construit uniquement s'il passe les deux vérifications.
Réglage fin du comportement des gestes
Le contrôle des gestes prend en charge deux méthodes de réglage fin :
Méthode 1 : Désactivez des gestes spécifiques à l'aide de l'API de masque binaire d'éléments SlotManager. Il s'agit de la méthode recommandée. Vous devez la configurer avant l'appel attach.
// Disable long press for fast-forward in the VOD scenario
[playerView.slotManager hideElements:GestureElementLongPress
forSlot:SlotTypeGestureControl];
Méthode 2 : Contrôlez les gestes directement à l'aide de GestureControlSlotConfig. Récupérez l'instance de l'emplacement après l'appel attach :
// Get the gesture control slot instance
GestureControlSlot *gestureSlot = (GestureControlSlot *)[playerView.slotManager slotViewForType:SlotTypeGestureControl];
// Modify the configuration (takes effect immediately)
GestureControlSlotConfig *config = [GestureControlSlotConfig defaultConfig];
config.longPressEnabled = NO;
config.horizontalDragEnabled = NO;
gestureSlot.config = config;
Les deux méthodes fonctionnent indépendamment. Le masque binaire d'éléments est appliqué lors de la construction de l'emplacement (pendant la phase setupContentView). GestureControlSlotConfig prend effet dynamiquement au moment de l'exécution.
Enregistrement d'emplacements personnalisés dans le scénario Minimal
Dans le scénario Minimal, la plupart des emplacements par défaut sont exclus par la configuration du scénario. Pour restaurer un emplacement, remplacez son SlotConfig :
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeMinimal;
// Override the scene configuration for BottomBar to remove the Minimal exclusion rule
[playerView.slotManager registerSlotConfig:
[SlotConfig configWithSlotType:SlotTypeBottomBar]]; // No excludedScenes = visible in all scenarios
[controller configure:model];
Conditions de visibilité dynamiques
Utilisez le rappel visibilityCondition de SlotConfig pour implémenter un contrôle dynamique au moment de l'exécution :
SlotConfig *coverConfig = [SlotConfig configWithSlotType:SlotTypeCover
excludedScenes:nil
visibilityCondition:^BOOL{
// Show the cover slot only if a cover URL exists
return model.coverUrl != nil;
}];
[playerView.slotManager registerSlotConfig:coverConfig];
La méthode isVisibleInScene: vérifie d'abord excludedScenes. Si une correspondance est trouvée, l'emplacement n'est pas visible. La méthode vérifie ensuite visibilityCondition. Si ce rappel renvoie NO, l'emplacement n'est pas visible. Un emplacement est visible uniquement s'il passe les deux vérifications.
Guide de sélection des scénarios
Flux de décision
Do you need a player control UI?
├── No → SceneTypeMinimal
└── Yes → Is it a live stream?
├── Yes → SceneTypeLive
└── No → Is the player embedded in a scrollable list?
├── Yes → SceneTypeVideoList
└── No → Do you need to prevent users from skipping?
├── Yes → SceneTypeRestricted
└── No → SceneTypeVOD (default)
Tableau récapitulatif de sélection des scénarios
|
Besoin métier |
Scénario recommandé |
Raisons principales |
|
Lecture vidéo standard |
|
Scénario par défaut, prise en charge complète des fonctionnalités |
|
Flux en direct / Événement sportif en temps réel |
|
Désactive automatiquement les opérations de progression non applicables |
|
Vidéo intégrée dans UIScrollView |
|
Évite automatiquement les conflits de gestes verticaux |
|
Formation / Examen / Protection des droits d'auteur |
|
Désactive automatiquement le saut et l'ajustement de la vitesse de lecture |
|
Interface utilisateur entièrement personnalisée |
|
Toile vierge sans interférence d'interface utilisateur intégrée |
|
Lecture en arrière-plan / Picture-in-Picture (PiP) |
|
Aucun composant de contrôle d'interface utilisateur nécessaire |
Référence rapide de l'API
Énumération SceneType
|
Valeur d'énumération |
Valeur entière |
Description |
|
|
0 |
Scénario VOD (par défaut) |
|
|
1 |
Scénario de diffusion en direct |
|
|
2 |
Scénario de liste de vidéos/flux de courtes vidéos |
|
|
3 |
Scénario de lecture restreinte |
|
|
4 |
Scénario de page de lecture minimale |
SlotConfig
|
Méthode / Propriété |
Description |
|
|
Crée une configuration sans scènes exclues (visible dans tous les scénarios) |
|
|
Crée une configuration avec des scènes exclues spécifiées |
|
|
Crée une configuration avec des scènes exclues et une condition dynamique |
|
|
Type d'emplacement ( |
|
|
Ensemble des scènes exclues, |
|
|
Bloc de condition de visibilité dynamique ( |
|
|
Vérifie si l'emplacement est visible dans un scénario spécifié |
GestureControlSlotConfig
|
Propriété |
Type |
Valeur par défaut |
Description |
|
|
|
|
Active ou désactive le geste de clic |
|
|
|
|
Active ou désactive le geste de double-clic |
|
|
|
|
Active ou désactive le geste d'appui long |
|
|
|
|
Active ou désactive le geste de glissement horizontal |
|
|
|
|
Active ou désactive le geste de glissement vertical gauche |
|
|
|
|
Active ou désactive le geste de glissement vertical droit |
|
|
Méthode de classe |
— |
Crée une configuration par défaut avec tous les gestes activés |
API liées aux scénarios de SlotManager
|
Méthode |
Description |
|
|
Enregistre une configuration de visibilité de scénario pour un type d'emplacement (remplace la configuration par défaut) |
|
|
Supprime la configuration de scénario pour un type d'emplacement spécifié (devient visible par défaut après suppression) |
|
|
Obtient la configuration de visibilité de scénario pour un type d'emplacement spécifié |
|
|
Masque un emplacement spécifié (niveau de l'emplacement, indépendant de la configuration du scénario) |
|
|
Affiche un emplacement précédemment masqué |
|
|
Masque des éléments au sein d'un emplacement ou désactive des gestes à l'aide d'un masque binaire |
|
|
Affiche des éléments au sein d'un emplacement ou active des gestes à l'aide d'un masque binaire |
|
|
Obtient l'instance de vue d'un emplacement monté |
|
|
Reconstruit tous les emplacements (doit être appelé après une modification de la configuration du scénario) |
Fichiers connexes
|
Fichier |
Description |
|
|
Définition de l'énumération SceneType |
|
|
Point d'entrée pour la définition du type de scénario (propriété |
|
|
Configuration de la visibilité des emplacements |
|
|
Fournisseur d'emplacements par défaut et règles de visibilité des scénarios |
|
|
Point d'entrée de gestion unifiée du système d'emplacements |
|
|
Définitions des masques binaires d'éléments de geste |
|
|
Emplacement de contrôle des gestes et définition de |
|
|
Classe de base des emplacements (méthode |
Pour plus d'informations, consultez la Référence de l'API.
Bonnes pratiques
Remarques
|
Élément |
Description |
|
Déterminer lors de la création |
Spécifiez SceneType lors de la création de |
|
Privilégier le scénario de liste |
Utilisez toujours |
|
Minimal nécessite un contrôle manuel |
Après avoir sélectionné Minimal, le développeur doit implémenter tous les contrôles de lecture à l'aide de l'API |
|
Réglage fin composable |
Si le comportement prédéfini ne répond pas entièrement à vos besoins, ajustez-le finement à l'aide de |
|
Live et Restricted ont un comportement similaire |
Leurs règles de filtrage des gestes sont identiques (désactivation de la recherche de progression et de l'ajustement de la vitesse de lecture). Les différences résident uniquement dans la visibilité de la vignette (masquée dans les deux cas) et la sémantique métier. |
FAQ
Quelle est la différence entre VOD et VideoList ?
La principale différence réside dans le geste vertical. SceneTypeVideoList désactive les gestes verticaux pour le volume et la luminosité afin d'éviter les conflits avec le geste de défilement du conteneur de liste. Les autres fonctionnalités sont identiques à celles de la VOD.
Comment implémenter des contrôles personnalisés dans le scénario Minimal ?
Contrôlez le comportement de lecture directement à l'aide de l'API AliPlayerController. Vous pouvez également enregistrer des emplacements personnalisés pour remplacer l'interface utilisateur :
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeMinimal;
[controller configure:model];
// Control directly through the controller API
[controller play];
[controller pause];
[controller seekTo:30000]; // Seek to 30 seconds
Comment restaurer la recherche de progression dans un scénario Live ?
Si votre scénario de diffusion en direct prend en charge le décalage temporel, restaurez le geste désactivé à l'aide de l'API de contrôle des éléments de SlotManager :
// Restore the horizontal drag gesture (progress seeking)
[playerView.slotManager showElements:GestureElementHorizontalDrag
forSlot:SlotTypeGestureControl];
Cette méthode restaure uniquement la visibilité au niveau des éléments. La logique de filtrage des scénarios à l'intérieur de GestureControlSlot est codée en dur et ne peut pas être contournée à l'aide de showElements:. Pour personnaliser entièrement le comportement des gestes, utilisez GestureControlSlotConfig ou remplacez GestureControlSlot.