Partager via


Créer, planifier et gérer des coupures de médias

Cet article explique comment créer, planifier et gérer des sauts multimédias dans votre application de lecture multimédia. Les coupures multimédias sont généralement utilisées pour insérer des publicités audio ou vidéo dans du contenu multimédia. À compter de Windows 10, version 1607, vous pouvez utiliser la classe MediaBreakManager pour ajouter rapidement et facilement des sauts multimédias à n’importe quel MediaPlaybackItem que vous jouez avec un MediaPlayer.

Après avoir planifié un ou plusieurs sauts multimédias, le système lirea automatiquement votre contenu multimédia à l’heure spécifiée pendant la lecture. MediaBreakManager fournit des événements afin que votre application puisse réagir lorsque les coupures de média démarrent, se terminent ou lorsqu’elles sont ignorées par l’utilisateur. Vous pouvez également accéder à une session MediaPlaybackSession pour vos sauts multimédias pour surveiller les événements tels que le téléchargement et la mise en mémoire tampon des mises à jour de progression.

Planifier des sauts de média

Chaque objet MediaPlaybackItem possède son propre MediaBreakSchedule que vous utilisez pour configurer les sauts multimédias qui seront lus lorsque l’élément est lu. La première étape d’utilisation de sauts de média dans votre application consiste à créer un MediaPlaybackItem pour votre contenu de lecture principal.

MediaPlaybackItem moviePlaybackItem =
    new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/movie.mkv")));

Pour plus d’informations sur l’utilisation de MediaPlaybackItem, MediaPlaybackList et d’autres API de lecture multimédia fondamentales, consultez éléments multimédias, playlists et pistes.

L’exemple suivant montre comment ajouter un saut de préroll à MediaPlaybackItem, ce qui signifie que le système lirea le saut multimédia avant de lire l’élément de lecture auquel appartient l’arrêt. Tout d’abord, un nouvel objet MediaBreak est instancié. Dans cet exemple, le constructeur est appelé avec MediaBreakInsertionMethod.Interrupt, ce qui signifie que le contenu principal sera suspendu pendant la lecture du contenu d’arrêt.

Ensuite, un nouvel élément MediaPlaybackItem est créé pour le contenu qui sera lu pendant la pause, par exemple une publicité. La propriété CanSkip de cet élément de lecture a la valeur false. Cela signifie que l’utilisateur ne pourra pas ignorer l’élément à l’aide des contrôles multimédias intégrés. Votre application peut toujours choisir d’ignorer l’ajout par programme en appelant SkipCurrentBreak.

La propriété PlaybackList de l’arrêt multimédia est un MediaPlaybackList qui vous permet de lire plusieurs éléments multimédias en tant que playlist. Ajoutez un ou plusieurs objets MediaPlaybackItem de la collection Items de la liste pour les inclure dans la playlist du saut de média.

Enfin, planifiez l’arrêt du média à l’aide de la propriété BreakSchedule de l’élément de lecture de contenu principal. Spécifiez l’arrêt pour qu’il s’agit d’un saut de préroll en l’affectant à la propriété PrerollBreak de l’objet de planification.

MediaBreak preRollMediaBreak = new MediaBreak(MediaBreakInsertionMethod.Interrupt);
MediaPlaybackItem prerollAd = 
    new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/preroll_ad.mp4")));
prerollAd.CanSkip = false;
preRollMediaBreak.PlaybackList.Items.Add(prerollAd);

moviePlaybackItem.BreakSchedule.PrerollBreak = preRollMediaBreak;

Vous pouvez maintenant lire l’élément multimédia principal et le saut multimédia que vous avez créé sera lu avant le contenu principal. Créez un objet MediaPlayer et définissez éventuellement la propriété Lecture automatique sur true pour démarrer la lecture automatiquement. Définissez la propriété Source du MediaPlayer sur votre élément de lecture de contenu principal. Il n’est pas obligatoire, mais vous pouvez affecter MediaPlayer à un MediaPlayerElement pour afficher le média dans une page XAML. Pour plus d’informations sur l’utilisation de MediaPlayer, consultez Lire l’audio et la vidéo avec MediaPlayer.

_mediaPlayer = new MediaPlayer();
_mediaPlayer.AutoPlay = true;
_mediaPlayer.Source = moviePlaybackItem;
mediaPlayerElement.SetMediaPlayer(_mediaPlayer);

Ajoutez une pause postroll qui se lit après la lecture de l’élément MediaPlaybackItem contenant votre contenu principal, en utilisant la même technique qu’un saut de préroll, sauf que vous affectez votre objet MediaBreak à la propriété PostrollBreak.

MediaBreak postrollMediaBreak = new MediaBreak(MediaBreakInsertionMethod.Interrupt);
MediaPlaybackItem postRollAd =
    new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/postroll_ad.mp4")));
postrollMediaBreak.PlaybackList.Items.Add(postRollAd);

moviePlaybackItem.BreakSchedule.PostrollBreak = postrollMediaBreak;

Vous pouvez également planifier un ou plusieurs sauts de midroll qui s’exécutent à un moment spécifié dans la lecture du contenu principal. Dans l’exemple suivant, MediaBreak est créé avec la surcharge du constructeur qui accepte un objet TimeSpan , qui spécifie l’heure de lecture de l’élément multimédia principal lorsque l’arrêt est lu. Là encore, MediaBreakInsertionMethod.Interrupt est spécifié pour indiquer que la lecture du contenu principal sera suspendue pendant la lecture de l’arrêt. L’arrêt midroll est ajouté à la planification en appelant InsertMidrollBreak. Vous pouvez obtenir une liste en lecture seule des sauts de midroll actuels dans la planification en accédant à la propriété MidrollBreaks.

MediaBreak midrollMediaBreak = new MediaBreak(MediaBreakInsertionMethod.Interrupt, TimeSpan.FromMinutes(10));
midrollMediaBreak.PlaybackList.Items.Add(
    new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/midroll_ad_1.mp4"))));
midrollMediaBreak.PlaybackList.Items.Add(
    new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/midroll_ad_2.mp4"))));
moviePlaybackItem.BreakSchedule.InsertMidrollBreak(midrollMediaBreak);

L’exemple de saut intermédiaire suivant illustré utilise la méthode d’insertion MediaBreakInsertionMethod.Replace , ce qui signifie que le système continuera à traiter le contenu principal pendant la lecture de l’arrêt. Cette option est généralement utilisée par les applications multimédias de diffusion en continu en direct où vous ne souhaitez pas que le contenu soit suspendu et se trouve derrière le flux en direct pendant la lecture de la publicité.

Cet exemple utilise également une surcharge du constructeur MediaPlaybackItem qui accepte deux paramètres TimeSpan. Le premier paramètre spécifie le point de départ dans l’élément d’arrêt du média où la lecture commence. Le deuxième paramètre spécifie la durée pendant laquelle l’élément de saut de média sera lu. Par conséquent, dans l’exemple suivant, MediaBreak commence à jouer à 20 minutes dans le contenu principal. Lorsqu’il est lu, l’élément multimédia démarre 30 secondes à partir du début de l’élément multimédia d’arrêt et est lu pendant 15 secondes avant la lecture du contenu multimédia principal.

midrollMediaBreak = new MediaBreak(MediaBreakInsertionMethod.Replace, TimeSpan.FromMinutes(20));
MediaPlaybackItem ad = 
    new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/midroll_ad_3.mp4")),
    TimeSpan.FromSeconds(30),
    TimeSpan.FromSeconds(15));
ad.CanSkip = false;
midrollMediaBreak.PlaybackList.Items.Add(ad);

Ignorer les sauts de média

Comme mentionné précédemment dans cet article, la propriété CanSkip d’un MediaPlaybackItem peut être définie pour empêcher l’utilisateur d’ignorer le contenu avec les contrôles intégrés. Toutefois, vous pouvez appeler SkipCurrentBreak à partir de votre code à tout moment pour ignorer l’arrêt actuel.

private void SkipButton_Click(object sender, RoutedEventArgs e) => _mediaPlayer.BreakManager.SkipCurrentBreak();

Gérer les événements MediaBreak

Il existe plusieurs événements liés aux coupures de médias que vous pouvez inscrire pour prendre des mesures en fonction de l’état changeant des coupures de média.

_mediaPlayer.BreakManager.BreakStarted += BreakManager_BreakStarted;
_mediaPlayer.BreakManager.BreakEnded += BreakManager_BreakEnded;
_mediaPlayer.BreakManager.BreakSkipped += BreakManager_BreakSkipped;
_mediaPlayer.BreakManager.BreaksSeekedOver += BreakManager_BreaksSeekedOver;

BreakStarted est déclenché lors du démarrage d’un saut de média. Vous souhaiterez peut-être mettre à jour votre interface utilisateur pour informer l’utilisateur que le contenu de coupure de média est en cours de lecture. Cet exemple utilise MediaBreakStartedEventArgs passé dans le gestionnaire pour obtenir une référence à l’arrêt multimédia qui a démarré. Ensuite, la propriété CurrentItemIndex est utilisée pour déterminer l’élément multimédia dans la playlist du saut multimédia en cours de lecture. Ensuite, l’interface utilisateur est mise à jour pour afficher à l’utilisateur l’index de publicité actuel et le nombre d’annonces restantes en pause. N’oubliez pas que les mises à jour de l’interface utilisateur doivent être effectuées sur le thread d’interface utilisateur. L’appel doit donc être effectué à l’intérieur d’un appel à RunAsync.

private async void BreakManager_BreakStarted(MediaBreakManager sender, MediaBreakStartedEventArgs args)
{
    MediaBreak currentBreak = sender.CurrentBreak;
    var currentIndex = currentBreak.PlaybackList.CurrentItemIndex;
    var itemCount = currentBreak.PlaybackList.Items.Count;

    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>            
        statusTextBlock.Text = $"Playing ad {currentIndex + 1} of {itemCount}");
}

BreakEnded est déclenché lorsque tous les éléments multimédias de la pause ont terminé de jouer ou ont été ignorés. Vous pouvez utiliser le gestionnaire pour cet événement pour mettre à jour l’interface utilisateur pour indiquer que le contenu de coupure de média n’est plus en cours de lecture.

private async void BreakManager_BreakEnded(MediaBreakManager sender, MediaBreakEndedEventArgs args)
{
    // Update UI to show that the MediaBreak is no longer playing
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => statusTextBlock.Text = "");

    args.MediaBreak.CanStart = false;
}

L’événement BreakSkipped est déclenché lorsque l’utilisateur appuie sur le bouton Suivant dans l’interface utilisateur intégrée pendant la lecture d’un élément pour lequel CanSkip a la valeur true ou lorsque vous ignorez un saut dans votre code en appelant SkipCurrentBreak.

L’exemple suivant utilise la propriété Source du MediaPlayer pour obtenir une référence à l’élément multimédia pour le contenu principal. Le saut multimédia ignoré appartient à la planification d’arrêt de cet élément. Ensuite, le code vérifie si le saut multimédia ignoré est identique à la propriété PrerollBreak de la planification. Dans ce cas, cela signifie que le saut de préroll était le saut ignoré et, dans ce cas, un nouveau saut de midroll est créé et planifié pour lire 10 minutes dans le contenu principal.

private async void BreakManager_BreakSkipped(MediaBreakManager sender, MediaBreakSkippedEventArgs args)
{
    // Update UI to show that the MediaBreak is no longer playing
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => statusTextBlock.Text = "");

    MediaPlaybackItem currentItem = _mediaPlayer.Source as MediaPlaybackItem;
    if(!(currentItem.BreakSchedule.PrerollBreak is  null) 
        && currentItem.BreakSchedule.PrerollBreak == args.MediaBreak)
    {
        MediaBreak mediaBreak = new MediaBreak(MediaBreakInsertionMethod.Interrupt, TimeSpan.FromMinutes(10));
        mediaBreak.PlaybackList.Items.Add(await GetAdPlaybackItem());
        currentItem.BreakSchedule.InsertMidrollBreak(mediaBreak);
    }
}

BreaksSeekedOver est déclenché lorsque la position de lecture de l’élément multimédia principal passe au-dessus de l’heure planifiée pour un ou plusieurs sauts multimédias. L’exemple suivant vérifie si plusieurs sauts de média ont été recherchés, si la position de lecture a été déplacée vers l’avant et si elle a été déplacée vers l’avant moins de 10 minutes. Si c’est le cas, le premier saut recherché, obtenu à partir de la collection SeekedOverBreaks exposée par les arguments d’événement, est lu immédiatement avec un appel à la méthode PlayBreak de MediaPlayer.BreakManager.

private void BreakManager_BreaksSeekedOver(MediaBreakManager sender, MediaBreakSeekedOverEventArgs args)
{
    if(args.SeekedOverBreaks.Count > 1
        && args.NewPosition.TotalMinutes > args.OldPosition.TotalMinutes
        && args.NewPosition.TotalMinutes - args.OldPosition.TotalMinutes < 10.0)
        _mediaPlayer.BreakManager.PlayBreak(args.SeekedOverBreaks[0]);
}

Accéder à la session de lecture actuelle

L’objet MediaPlaybackSession utilise la classe MediaPlayer pour fournir des données et des événements liés au contenu multimédia en cours de lecture. MediaBreakManager dispose également d’une MediaPlaybackSession que vous pouvez accéder pour obtenir des données et des événements spécifiquement liés au contenu de coupure de média en cours de lecture. Les informations que vous pouvez obtenir à partir de la session de lecture incluent l’état de lecture actuel, la lecture ou la pause, ainsi que la position de lecture actuelle dans le contenu. Vous pouvez utiliser les propriétés NaturalVideoWidth et NaturalVideoHeight et NaturalVideoSizeChanged pour ajuster votre interface utilisateur vidéo si le contenu de saut multimédia a un rapport d’aspect différent de celui de votre contenu principal. Vous pouvez également recevoir des événements tels que BufferingStarted, BufferingEnded et DownloadProgressChanged, qui peuvent fournir des données de télémétrie précieuses sur les performances de votre application.

L’exemple suivant enregistre un gestionnaire pour l’événement BufferingProgressChanged ; dans le gestionnaire d’événements, il met à jour l’interface utilisateur pour afficher la progression actuelle de la mise en mémoire tampon.

_mediaPlayer.BreakManager.PlaybackSession.BufferingProgressChanged += PlaybackSession_BufferingProgressChanged;
private async void PlaybackSession_BufferingProgressChanged(MediaPlaybackSession sender, object args)
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        bufferingProgressBar.Value = sender.BufferingProgress);
}