Aller au contenu

Mode boucle et lecture par plage de position

Ce guide explique comment utiliser le mode boucle et les fonctionnalités personnalisées de position de début et fin (plage de position) dans Media Player SDK à la fois pour MediaPlayerCore (moteur DirectShow) et MediaPlayerCoreX (moteur GStreamer).

Vue d'ensemble

Les deux moteurs Media Player prennent en charge :

  • Mode boucle : redémarrer automatiquement la lecture lorsque le média atteint la fin
  • Plage de position : lire uniquement un segment spécifique du média entre les positions de début et de fin
  • Mode combiné : boucler un segment spécifique du média en continu

Ces fonctionnalités sont utiles pour :

  • Créer des boucles vidéo pour des kiosques ou des écrans
  • Lecture d'aperçu de segments spécifiques
  • Tester des portions spécifiques de fichiers multimédias
  • Créer des boucles vidéo d'arrière-plan fluides
  • Applications éducatives présentant du contenu répété

MediaPlayerCore (moteur DirectShow)

MediaPlayerCore est le moteur de lecteur multimédia basé sur DirectShow et réservé à Windows.

Propriétés du mode boucle

Propriété Loop

Active ou désactive la lecture en boucle automatique.

// Activer le mode boucle
mediaPlayer.Loop = true;

// Désactiver le mode boucle
mediaPlayer.Loop = false;

Valeur par défaut : false

Comportement : - Lorsque activée, la lecture redémarre automatiquement depuis le début lorsque la fin est atteinte - L'événement OnLoop se déclenche chaque fois que la lecture redémarre - Pour les listes de lecture, la boucle s'applique à toute la liste, pas aux fichiers individuels

Propriété Loop_DoNotSeekToBeginning

Contrôle s'il faut se positionner au début lorsque la boucle redémarre.

// Redémarrer sans se positionner au début (boucle fluide)
mediaPlayer.Loop_DoNotSeekToBeginning = true;

// Se positionner au début avant de redémarrer (par défaut)
mediaPlayer.Loop_DoNotSeekToBeginning = false;

Valeur par défaut : false

Comportement : - N'affecte le comportement que lorsque Loop est true - Lorsque true, redémarre depuis la position actuelle sans se positionner - Améliore les performances et évite les artefacts visuels durant les transitions de boucle - Utile pour un bouclage fluide du contenu

Propriétés de plage de position

Propriété Selection_Active

Active ou désactive la sélection de plage de lecture.

// Activer la lecture par plage de position
mediaPlayer.Selection_Active = true;

// Désactiver la lecture par plage de position (lire le fichier entier)
mediaPlayer.Selection_Active = false;

Valeur par défaut : false

Comportement : - Lorsque active, la lecture est contrainte entre Selection_Start et Selection_Stop - Le lecteur s'arrête ou boucle automatiquement en atteignant Selection_Stop - Utile pour lire des segments spécifiques ou créer des aperçus de clips

Propriété Selection_Start

Définit la position de début pour la lecture basée sur une plage.

// Commencer la lecture à 30 secondes
mediaPlayer.Selection_Start = TimeSpan.FromSeconds(30);

// Commencer la lecture à 2 minutes 15 secondes
mediaPlayer.Selection_Start = new TimeSpan(0, 2, 15);

Type : TimeSpan

Exigences : - Utilisée uniquement lorsque Selection_Active est true - Doit être inférieure à Selection_Stop - Doit être dans la durée du média - Le lecteur se positionne automatiquement à cet endroit au démarrage

Propriété Selection_Stop

Définit la position de fin pour la lecture basée sur une plage.

// Arrêter la lecture à 1 minute
mediaPlayer.Selection_Stop = TimeSpan.FromSeconds(60);

// Lire jusqu'à la fin du fichier
mediaPlayer.Selection_Stop = TimeSpan.Zero;

Type : TimeSpan

Exigences : - Utilisée uniquement lorsque Selection_Active est true - Doit être supérieure à Selection_Start - Utilisez TimeSpan.Zero pour lire jusqu'à la fin du fichier multimédia - Lorsque la lecture atteint cette position, elle s'arrête (ou boucle si Loop est activée)

Événements MediaPlayerCore

Événement OnLoop

Se déclenche chaque fois que la lecture redémarre en mode boucle.

mediaPlayer.OnLoop += (sender, e) =>
{
    Console.WriteLine("Playback looped!");
    // Mettre à jour le compteur de boucle, effectuer des actions au point de boucle, etc.
};

Quand il se déclenche : - Uniquement lorsque la propriété Loop est true - Chaque fois que la lecture cycle de la fin vers le début - Après le positionnement au début (le cas échéant)

Cas d'usage : - Suivre les itérations de boucle - Mettre à jour les compteurs de boucle dans l'UI - Effectuer des actions à chaque point de boucle - Journaliser les statistiques de lecture

Exemples de code pour MediaPlayerCore

Exemple 1 : Mode boucle de base

using VisioForge.Core.MediaPlayer;
using VisioForge.Core.Types;

// Créer une instance de lecteur multimédia
var player = new MediaPlayerCore();

// Activer le mode boucle
player.Loop = true;

// S'abonner à l'événement de boucle
player.OnLoop += (sender, e) =>
{
    Console.WriteLine($"Loop iteration at {DateTime.Now}");
};

// Définir la source et lire
player.Playlist_Clear();
player.Playlist_Add(@"C:\Videos\sample.mp4");
await player.PlayAsync();

Exemple 2 : Boucle fluide sans positionnement

using VisioForge.Core.MediaPlayer;

var player = new MediaPlayerCore();

// Activer la boucle fluide (pas de positionnement au début)
player.Loop = true;
player.Loop_DoNotSeekToBeginning = true;

player.Playlist_Clear();
player.Playlist_Add(@"C:\Videos\background.mp4");
await player.PlayAsync();

Exemple 3 : Lire un segment spécifique

using VisioForge.Core.MediaPlayer;

var player = new MediaPlayerCore();

// Activer la plage de position
player.Selection_Active = true;

// Lire de 1 minute à 2 minutes
player.Selection_Start = TimeSpan.FromMinutes(1);
player.Selection_Stop = TimeSpan.FromMinutes(2);

player.Playlist_Clear();
player.Playlist_Add(@"C:\Videos\long-video.mp4");
await player.PlayAsync();

Exemple 4 : Boucler un segment spécifique

using VisioForge.Core.MediaPlayer;

var player = new MediaPlayerCore();

// Activer à la fois la boucle et la plage de position
player.Loop = true;
player.Selection_Active = true;

// Boucler le segment de 30 à 45 secondes
player.Selection_Start = TimeSpan.FromSeconds(30);
player.Selection_Stop = TimeSpan.FromSeconds(45);

// Suivre le nombre de boucles
int loopCount = 0;
player.OnLoop += (sender, e) =>
{
    loopCount++;
    Console.WriteLine($"Segment loop #{loopCount}");
};

player.Playlist_Clear();
player.Playlist_Add(@"C:\Videos\video.mp4");
await player.PlayAsync();

Exemple 5 : Mise à jour dynamique de la plage de position

using VisioForge.Core.MediaPlayer;

var player = new MediaPlayerCore();

player.Selection_Active = true;
player.Selection_Start = TimeSpan.FromSeconds(10);
player.Selection_Stop = TimeSpan.FromSeconds(20);

player.Playlist_Clear();
player.Playlist_Add(@"C:\Videos\video.mp4");
await player.PlayAsync();

// Plus tard, pendant la lecture, mettre à jour la plage
await Task.Delay(5000);

// Passer à un segment différent
player.Selection_Start = TimeSpan.FromSeconds(30);
player.Selection_Stop = TimeSpan.FromSeconds(40);

// Se positionner à la nouvelle position de début
player.Position_Set_Time(player.Selection_Start);

MediaPlayerCoreX (moteur GStreamer)

MediaPlayerCoreX est le moteur de lecteur multimédia multiplateforme basé sur GStreamer, prenant en charge Windows, Linux, macOS, Android et iOS.

Propriété du mode boucle

Propriété Loop

Active ou désactive la lecture en boucle automatique.

// Activer le mode boucle
mediaPlayer.Loop = true;

// Désactiver le mode boucle
mediaPlayer.Loop = false;

Valeur par défaut : false

Comportement : - Lorsque activée, la lecture redémarre automatiquement lorsque la fin du flux (EOS) est atteinte - Le MediaBlocksPipeline sous-jacent gère la logique de boucle - L'événement OnLoop se déclenche chaque fois que la lecture redémarre - Redémarre la lecture sans surcharge de positionnement

Propriétés de plage de position

Propriété Segment_Start

Définit la position de début pour la lecture par segment.

// Commencer la lecture à 45 secondes
mediaPlayer.Segment_Start = TimeSpan.FromSeconds(45);

// Commencer la lecture à 3 minutes
mediaPlayer.Segment_Start = TimeSpan.FromMinutes(3);

Type : TimeSpan

Valeur par défaut : TimeSpan.Zero

Comportement : - Définit l'endroit où la lecture doit commencer - Le lecteur se positionne automatiquement à cet endroit au démarrage - Utilisée en combinaison avec Segment_Stop pour définir la plage de lecture - Appliquée via la propriété MediaBlocksPipeline.StartPosition sous-jacente

Propriété Segment_Stop

Définit la position de fin pour la lecture par segment.

// Arrêter la lecture à 2 minutes
mediaPlayer.Segment_Stop = TimeSpan.FromMinutes(2);

// Lire jusqu'à la fin (pas de position d'arrêt)
mediaPlayer.Segment_Stop = TimeSpan.Zero;

Type : TimeSpan

Valeur par défaut : TimeSpan.Zero

Comportement : - Définit l'endroit où la lecture doit se terminer - Lorsque la lecture atteint cette position, la fin du flux (EOS) est déclenchée - Si Loop est activée, la lecture redémarre depuis Segment_Start - Utilisez TimeSpan.Zero pour aucune position d'arrêt (lire jusqu'à la fin) - Appliquée via la propriété MediaBlocksPipeline.StopPosition sous-jacente

Événements MediaPlayerCoreX

Événement OnLoop

Se déclenche chaque fois que la lecture redémarre en mode boucle.

mediaPlayer.OnLoop += (sender, e) =>
{
    Console.WriteLine("Playback looped!");
};

Quand il se déclenche : - Uniquement lorsque la propriété Loop est true - Lorsque la fin du flux (EOS) est atteinte - Avant que la lecture ne redémarre

Exemples de code pour MediaPlayerCoreX

Exemple 1 : Mode boucle de base

using VisioForge.Core.MediaPlayerX;
using VisioForge.Core.Types.X.Sources;

// Créer une instance de lecteur multimédia
var player = new MediaPlayerCoreX();

// Activer le mode boucle
player.Loop = true;

// S'abonner à l'événement de boucle
player.OnLoop += (sender, e) =>
{
    Console.WriteLine($"Loop iteration at {DateTime.Now}");
};

// Définir la source et lire
var source = await UniversalSourceSettings.CreateAsync(new Uri(@"C:\Videos\sample.mp4"));

await player.OpenAsync(source);
await player.PlayAsync();

Exemple 2 : Lire un segment spécifique

using VisioForge.Core.MediaPlayerX;
using VisioForge.Core.Types.X.Sources;

var player = new MediaPlayerCoreX();

// Définir la plage du segment : lire de 30s à 90s
player.Segment_Start = TimeSpan.FromSeconds(30);
player.Segment_Stop = TimeSpan.FromSeconds(90);

var source = await UniversalSourceSettings.CreateAsync(new Uri(@"C:\Videos\long-video.mp4"));

await player.OpenAsync(source);
await player.PlayAsync();

Exemple 3 : Boucler un segment spécifique

using VisioForge.Core.MediaPlayerX;
using VisioForge.Core.Types.X.Sources;

var player = new MediaPlayerCoreX();

// Activer la boucle et définir le segment
player.Loop = true;
player.Segment_Start = TimeSpan.FromMinutes(1);
player.Segment_Stop = TimeSpan.FromMinutes(2);

// Suivre le nombre de boucles
int loopCount = 0;
player.OnLoop += (sender, e) =>
{
    loopCount++;
    Console.WriteLine($"Segment loop #{loopCount}");
};

var source = await UniversalSourceSettings.CreateAsync(new Uri(@"C:\Videos\video.mp4"));

await player.OpenAsync(source);
await player.PlayAsync();

Exemple 4 : Vidéo en boucle multiplateforme

using VisioForge.Core.MediaPlayerX;
using VisioForge.Core.Types.X.Sources;

var player = new MediaPlayerCoreX();

// Activer la boucle fluide
player.Loop = true;

// Pour un chemin de fichier vidéo multiplateforme
string videoPath;
#if ANDROID
    videoPath = "/storage/emulated/0/Movies/background.mp4";
#elif IOS
    videoPath = Path.Combine(NSBundle.MainBundle.BundlePath, "background.mp4");
#else
    videoPath = Path.Combine(Environment.GetFolderPath(
        Environment.SpecialFolder.MyVideos), "background.mp4");
#endif

var source = await UniversalSourceSettings.CreateAsync(new Uri(videoPath));

await player.OpenAsync(source);
await player.PlayAsync();

Exemple 5 : Aperçu de segment avec mise à jour UI

using VisioForge.Core.MediaPlayerX;
using VisioForge.Core.Types.X.Sources;

var player = new MediaPlayerCoreX();

// Mode aperçu : afficher des clips de 10 secondes
TimeSpan clipDuration = TimeSpan.FromSeconds(10);

async Task PreviewSegment(TimeSpan startTime)
{
    player.Segment_Start = startTime;
    player.Segment_Stop = startTime + clipDuration;

    // Se positionner à la position de début
    await player.Position_SetAsync(startTime);

    Console.WriteLine($"Previewing segment: {startTime} to {startTime + clipDuration}");
}

var source = await UniversalSourceSettings.CreateAsync(new Uri(@"C:\Videos\movie.mp4"));

await player.OpenAsync(source);
await player.PlayAsync();

// Aperçu du premier segment
await PreviewSegment(TimeSpan.FromSeconds(0));

// Aperçu du segment démarrant à 30 secondes
await Task.Delay(11000);
await PreviewSegment(TimeSpan.FromSeconds(30));

Exemple 6 : Boucle avec pause à l'arrêt

using VisioForge.Core.MediaPlayerX;
using VisioForge.Core.Types.X.Sources;

var player = new MediaPlayerCoreX();

// Mode boucle avec pause au lieu d'arrêt en fin
player.Loop = true;
player.PauseOnStop = true; // Pause au lieu d'arrêt à l'EOS

player.OnLoop += (sender, e) =>
{
    Console.WriteLine("Reached end, pausing briefly before loop...");

    // Attendre avant de reprendre (si nécessaire)
    Task.Delay(1000).ContinueWith(_ => 
    {
        // La lecture redémarrera automatiquement grâce à Loop = true
    });
};

var source = await UniversalSourceSettings.CreateAsync(new Uri(@"C:\Videos\video.mp4"));

await player.OpenAsync(source);
await player.PlayAsync();

Bonnes pratiques

Considérations de performance

  1. Bouclage fluide (MediaPlayerCore) :
  2. Utilisez Loop_DoNotSeekToBeginning = true pour des boucles fluides sans artefacts visuels
  3. Testez avec votre format multimédia spécifique pour les meilleurs résultats

  4. Segments courts :

  5. Pour des segments très courts (< 1 seconde), assurez-vous que le média est correctement indexé
  6. Certains formats peuvent ne pas prendre en charge un positionnement précis à l'image près

  7. Multiplateforme (MediaPlayerCoreX) :

  8. Testez sur toutes les plateformes cibles car le comportement GStreamer peut légèrement varier
  9. Utilisez des codecs vidéo appropriés qui prennent en charge le positionnement (H.264, H.265)

Cas d'usage courants

Boucle vidéo de kiosque

// MediaPlayerCore (Windows)
player.Loop = true;
player.Loop_DoNotSeekToBeginning = true;

// MediaPlayerCoreX (multiplateforme)
player.Loop = true;

Fenêtre d'aperçu

// MediaPlayerCore
player.Selection_Active = true;
player.Selection_Start = previewStart;
player.Selection_Stop = previewEnd;

// MediaPlayerCoreX
player.Segment_Start = previewStart;
player.Segment_Stop = previewEnd;

Boucle de segment continue

// MediaPlayerCore
player.Loop = true;
player.Selection_Active = true;
player.Selection_Start = segmentStart;
player.Selection_Stop = segmentEnd;

// MediaPlayerCoreX
player.Loop = true;
player.Segment_Start = segmentStart;
player.Segment_Stop = segmentEnd;

Dépannage

La boucle ne fonctionne pas

MediaPlayerCore : - Vérifiez que la propriété Loop est définie avant d'appeler PlayAsync() - Vérifiez que l'événement OnStop n'appelle pas la méthode Stop() - Vérifiez que le fichier multimédia n'est pas corrompu

MediaPlayerCoreX : - Vérifiez que la propriété Loop est définie avant d'appeler PlayAsync() - Vérifiez que GStreamer est correctement initialisé - Vérifiez que le pipeline n'est pas libéré prématurément

Plage de position imprécise

MediaPlayerCore : - Vérifiez que Selection_Active est défini à true - Vérifiez que Selection_Start < Selection_Stop - Certains formats multimédias peuvent ne pas prendre en charge un positionnement précis à l'image près

MediaPlayerCoreX : - Vérifiez que Segment_Start et Segment_Stop sont valides - Utilisez des formats multimédias positionnables (MP4, MKV avec indexation correcte) - Vérifiez que le fichier multimédia prend en charge le positionnement (toutes les sources de streaming ne le font pas)

La lecture du segment commence à la mauvaise position

Les deux moteurs : - Vérifiez que les positions sont définies avant d'appeler PlayAsync() - Attendez que le média soit entièrement chargé avant de définir les positions - Utilisez un positionnement basé sur les images-clés pour une meilleure précision

Tableau comparatif des propriétés

Fonctionnalité MediaPlayerCore MediaPlayerCoreX
Mode boucle Loop (bool) Loop (bool)
Boucle fluide Loop_DoNotSeekToBeginning (bool) Intégrée (pas de propriété supplémentaire)
Plage active Selection_Active (bool) Implicite (quand les propriétés Segment sont définies)
Position de début Selection_Start (TimeSpan) Segment_Start (TimeSpan)
Position de fin Selection_Stop (TimeSpan) Segment_Stop (TimeSpan)
Événement de boucle OnLoop OnLoop
Plateforme Windows uniquement Multiplateforme
Moteur DirectShow GStreamer

Foire aux questions

Comment créer une boucle vidéo fluide sans artefacts en C# ?

Pour le moteur DirectShow (MediaPlayerCore), définissez Loop = true et Loop_DoNotSeekToBeginning = true pour éviter un retour visible entre les itérations. Pour le moteur multiplateforme GStreamer (MediaPlayerCoreX), le redémarrage fluide est intégré — il suffit de définir Loop = true. Dans les deux cas, utilisez des formats bien indexés comme MP4 avec encodage H.264 ou H.265 pour les transitions les plus fluides.

Media Player SDK prend-il en charge un positionnement précis à l'image près pour la lecture par segments ?

La précision du positionnement dépend du conteneur multimédia et du codec. Les fichiers MP4 et MKV avec une indexation correcte des images-clés fournissent les meilleurs résultats. Pour les segments très courts (moins d'une seconde), le lecteur peut atterrir sur l'image-clé la plus proche plutôt que sur la position exacte demandée. Si une précision au niveau de l'image est critique, encodez votre source avec une longueur de GOP (Group of Pictures) courte pour augmenter la densité des images-clés.

Puis-je boucler une plage de temps spécifique au lieu du fichier vidéo entier ?

Oui. Dans MediaPlayerCore, activez Loop et Selection_Active, puis définissez Selection_Start et Selection_Stop pour définir le segment. Dans MediaPlayerCoreX, activez Loop et définissez Segment_Start et Segment_Stop. Le lecteur répétera continuellement uniquement la plage spécifiée. Consultez les exemples de code « Boucler un segment spécifique » ci-dessus pour les deux moteurs.

Voir aussi