Lire du contenu multimédia en arrière-plan

Cet article explique comment configurer votre application afin que le média continue à être lu lorsque votre application passe du premier plan à l’arrière-plan. Cela signifie que même une fois que l’utilisateur a réduit votre application, retourné à l’écran d’accueil ou s’est éloigné de votre application d’une autre façon, votre application peut continuer à lire l’audio.

Les scénarios de lecture audio en arrière-plan sont les suivants :

  • Playlists longues : l’utilisateur affiche brièvement une application de premier plan pour sélectionner et démarrer une playlist, après quoi l’utilisateur s’attend à ce que la playlist continue de jouer en arrière-plan.

  • Utilisation du sélecteur de tâches : l’utilisateur affiche brièvement une application de premier plan pour commencer à lire l’audio, puis bascule vers une autre application ouverte à l’aide du sélecteur de tâches. L’utilisateur s’attend à ce que l’audio continue à lire en arrière-plan.

L’implémentation audio en arrière-plan décrite dans cet article permet à votre application de s’exécuter universellement sur tous les appareils Windows, notamment Mobile, Desktop et Xbox.

Remarque

Le code de cet article a été adapté à partir de l’exemple audio en arrière-plan UWP.

Explication du modèle un processus

Avec Windows 10, version 1607, un nouveau modèle à processus unique a été introduit, ce qui simplifie considérablement le processus d’activation de l’audio en arrière-plan. Auparavant, votre application devait gérer un processus en arrière-plan en plus de votre application de premier plan, puis communiquer manuellement les modifications d’état entre les deux processus. Sous le nouveau modèle, vous ajoutez simplement la fonctionnalité audio en arrière-plan à votre manifeste d’application, et votre application continue de lire automatiquement l’audio lorsqu’elle passe à l’arrière-plan. Deux nouveaux événements de cycle de vie d’application, EnteredBackground et LeavingBackground permettent à votre application de savoir quand elle entre et quitte l’arrière-plan. Lorsque votre application passe aux transitions vers ou à partir de l’arrière-plan, les contraintes de mémoire appliquées par le système peuvent changer, de sorte que vous pouvez utiliser ces événements pour vérifier votre consommation de mémoire actuelle et libérer des ressources afin de rester en dessous de la limite.

En éliminant la communication interprocessus complexe et la gestion de l’état, le nouveau modèle vous permet d’implémenter l’audio en arrière-plan beaucoup plus rapidement avec une réduction significative du code. Toutefois, le modèle à deux processus est toujours pris en charge dans la version actuelle pour la compatibilité descendante. Pour plus d’informations, consultez le modèle audio en arrière-plan hérité.

Configuration requise pour l’audio en arrière-plan

Votre application doit répondre aux exigences suivantes pour la lecture audio pendant que votre application est en arrière-plan.

  • Ajoutez la fonctionnalité lecture multimédia en arrière-plan au manifeste de votre application, comme décrit plus loin dans cet article.
  • Si votre application désactive l’intégration automatique de MediaPlayer à system Media Transport Controls (SMTC), par exemple en définissant la propriété CommandManager.IsEnabled sur false, vous devez implémenter l’intégration manuelle avec le SMTC pour activer la lecture multimédia en arrière-plan. Vous devez également effectuer une intégration manuelle avec SMTC si vous utilisez une API autre que MediaPlayer, telle que AudioGraph, pour lire l’audio si vous souhaitez que l’audio continue à être lu lorsque votre application passe à l’arrière-plan. Les exigences minimales d’intégration smTC sont décrites dans la section « Utiliser les contrôles de transport multimédia système pour l’audio en arrière-plan » du contrôle manuel des contrôles de transport de média système.
  • Pendant que votre application est en arrière-plan, vous devez rester sous les limites d’utilisation de la mémoire définies par le système pour les applications en arrière-plan. Des conseils sur la gestion de la mémoire en arrière-plan sont fournis plus loin dans cet article.

Fonctionnalité de manifeste de lecture multimédia en arrière-plan

Pour activer l’audio en arrière-plan, vous devez ajouter la fonctionnalité de lecture multimédia en arrière-plan au fichier manifeste de l’application, Package.appxmanifest.

Pour ajouter des fonctionnalités au manifeste de l’application à l’aide du concepteur de manifestes

  1. Dans Microsoft Visual Studio, dans Explorateur de solutions, ouvrez le concepteur du manifeste de l’application en double-cliquant sur l’élément package.appxmanifest.
  2. Sélectionnez l’onglet Fonctionnalités.
  3. Activez la case à cocher Lecture multimédia en arrière-plan.

Pour définir la fonctionnalité en modifiant manuellement le xml du manifeste de l’application, vérifiez d’abord que le préfixe d’espace de noms uap3 est défini dans l’élément Package . Si ce n’est pas le cas, ajoutez-le comme indiqué ci-dessous.

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  IgnorableNamespaces="uap uap3 mp">

Ensuite, ajoutez la fonctionnalité backgroundMediaPlayback à l’élément Capabilities :

<Capabilities>
    <uap3:Capability Name="backgroundMediaPlayback"/>
</Capabilities>

Gérer la transition entre le premier plan et l’arrière-plan

Lorsque votre application passe du premier plan à l’arrière-plan, l’événement EnteredBackground est déclenché. Et lorsque votre application revient au premier plan, l’événement LeavingBackground est déclenché. Comme il s’agit d’événements de cycle de vie d’application, vous devez inscrire des gestionnaires pour ces événements lors de la création de votre application. Dans le modèle de projet par défaut, cela signifie l’ajouter au constructeur de classe App dans App.xaml.cs.

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;

    this.EnteredBackground += App_EnteredBackground;
    this.LeavingBackground += App_LeavingBackground;
}

Créez une variable pour suivre si vous exécutez actuellement en arrière-plan.

bool _isInBackgroundMode = false;

Lorsque l’événement EnteredBackground est déclenché, définissez la variable de suivi pour indiquer que vous êtes en cours d’exécution en arrière-plan. Vous ne devez pas effectuer de tâches longues dans l’événement EnteredBackground , car cela peut entraîner la transition vers l’arrière-plan pour apparaître lente pour l’utilisateur.

private void App_EnteredBackground(object sender, EnteredBackgroundEventArgs e)
{
    _isInBackgroundMode = true;
}

Dans le gestionnaire d’événements LeavingBackground , vous devez définir la variable de suivi pour indiquer que votre application n’est plus en cours d’exécution en arrière-plan.

private void App_LeavingBackground(object sender, LeavingBackgroundEventArgs e)
{
    _isInBackgroundMode = false;
}

Configuration requise pour la gestion de la mémoire

La partie la plus importante de la gestion de la transition entre le premier plan et l’arrière-plan consiste à gérer la mémoire utilisée par votre application. Étant donné que l’exécution en arrière-plan réduit les ressources mémoire que votre application est autorisée à conserver par le système, vous devez également vous inscrire aux événements AppMemoryUsageIncreased et AppMemoryUsageLimitChanging. Lorsque ces événements sont déclenchés, vous devez vérifier l’utilisation actuelle de la mémoire de votre application et la limite actuelle, puis réduire l’utilisation de la mémoire si nécessaire. Pour plus d’informations sur la réduction de l’utilisation de la mémoire lors de l’exécution en arrière-plan, consultez Mémoire libre lorsque votre application passe à l’arrière-plan.

Disponibilité du réseau pour les applications multimédias en arrière-plan

Toutes les sources multimédias prenant en charge le réseau, celles qui ne sont pas créées à partir d’un flux ou d’un fichier, conservent la connexion réseau active lors de la récupération du contenu distant et la libèrent quand elles ne le sont pas. MediaStreamSource, en particulier, s’appuie sur l’application pour signaler correctement la plage mise en mémoire tampon correcte à la plateforme à l’aide de SetBufferedRange. Une fois que tout le contenu est entièrement mis en mémoire tampon, le réseau ne sera plus réservé au nom de l’application.

Si vous devez effectuer des appels réseau qui se produisent en arrière-plan lorsque le média ne télécharge pas, ceux-ci doivent être encapsulés dans une tâche appropriée, telle que MaintenanceTrigger ou TimeTrigger. Pour plus d’informations, consultez Prendre en charge votre application avec des tâches en arrière-plan.