Lire du contenu multimédia en arrière-planPlay media in the background

Cet article vous explique comment configurer votre application de telle sorte que le contenu multimédia continue à être lu quand votre application est déplacée du premier plan vers l’arrière-plan.This article shows you how to configure your app so that media continues to play when your app moves from the foreground to the background. Cela signifie que même après que l’utilisateur a réduit votre application, est revenu à l’écran d’accueil ou a quitté votre application d’une autre manière, votre application peut continuer à lire le contenu audio.This means that even after the user has minimized your app, returned to the home screen, or has navigated away from your app in some other way, your app can continue to play audio.

Scénarios de lecture audio en arrière-plan:Scenarios for background audio playback include:

  • Playslist de longue durée: l’utilisateur affiche brièvement une application au premier plan pour sélectionner et lancer une playslist, puis veut que la lecture de la playslist continue en arrière-plan.Long-running playlists: The user briefly brings up a foreground app to select and start a playlist, after which the user expects the playlist to continue playing in the background.

  • Utilisation du Sélecteur de tâches: l’utilisateur affiche brièvement une application au premier plan pour démarrer la lecture d’un contenu audio, puis passe dans une autre application ouverte à l’aide du Sélecteur de tâches.Using task switcher: The user briefly brings up a foreground app to start playing audio, then switches to another open app using the task switcher. Il veut que la lecture du contenu audio continue en arrière-plan.The user expects the audio to continue playing in the background.

L’implémentation audio en arrière-plan décrite dans cet article permettra à votre application de s’exécuter universellement sur tous les appareils Windows, y compris les appareils mobiles, de bureau et Xbox.The background audio implementation described in this article will allow your app to run universally on all Windows devices including Mobile, Desktop, and Xbox.

Note

Le code de cet article a été adapté de l’exemple Contenu audio en arrière-plan UWP.The code in this article was adapted from the UWP Background Audio sample.

Explication du modèle à processus uniqueExplanation of one-process model

Avec Windows10, version 1607, un nouveau modèle à processus unique simplifie considérablement la prise en charge de l’audio d’arrière-plan.With Windows 10, version 1607, a new single-process model has been introduced that greatly simplifies the process of enabling background audio. Auparavant, votre application devait gérer un processus en arrière-plan en plus de l’application de premier plan. De votre côté, vous deviez communiquer manuellement les modifications d’état de communication entre les deuxprocessus.Previously, your app was required to manage a background process in addition to your foreground app and then manually communicate state changes between the two processes. Sous le nouveau modèle, vous ajoutez simplement la capacité d’audio d’arrière-plan à votre manifeste d’application, de manière à ce que votre application continue à lire le contenu audio lorsqu’elle se déplace vers l’arrière-plan.Under the new model, you simply add the background audio capability to your app manifest, and your app will automatically continue playing audio when it moves to the background. Deuxévénements de cycle de vie d’application, EnteredBackground et LeavingBackground, indiquent à votre application les moments d’entrée et de sortie de l’arrière-plan.Two new application lifecycle events, EnteredBackground and LeavingBackground let your app know when it is entering and leaving the background. Quand votre application se déplace au sein des transitions à destination et en provenance de l’arrière-plan, les contraintes de mémoire mises en place par le système peuvent être modifiées, afin que vous puissiez utiliser ces événements pour évaluer votre consommation courante de mémoire et libérer des ressources vous permettant de rester sous la limite.When your app moves into the transitions to or from the background, the memory constraints enforced by the system may change, so you can use these events to check your current memory consumption and free up resources in order to stay below the limit.

En éliminant les activités complexes de communication intraprocessus et de gestion de l’état, le nouveau modèle vous permet d’implémenter l’audio d’arrière-plan bien plus rapidement, via une réduction considérable du code.By eliminating the complex cross-process communication and state management, the new model allows you to implement background audio much more quickly with a significant reduction in code. Toutefois, le modèle à deuxprocessus est toujours pris en charge pour la compatibilité descendante dans la version actuelle.However, the two-process model is still supported in the current release for backwards compatibility. Pour plus d’informations, consultez la page Contenu audio en arrière-plan.For more information, see Legacy background audio model.

Conditions requises pour l’audio d’arrière-planRequirements for background audio

Votre application doit satisfaire les exigences suivantes associées à la lecture de contenu audio durant sa mise en arrière-plan.Your app must meet the following requirements for audio playback while your app is in the background.

  • Ajoutez la fonctionnalité de Lecture de médias en arrière-plan à votre manifeste d’application, tel que décrit plus bas dans cet article.Add the Background Media Playback capability to your app manifest, as described later in this article.
  • Si votre application désactive l’intégration automatique de MediaPlayer avec les contrôles de transport de média système, en définissant par exemple la propriété CommandManager.IsEnabled sur False, vous devez implémenter l’intégration manuelle avec les contrôles de transport de média système afin de prendre en charge la lecture de médias en arrière-plan.If your app disables the automatic integration of MediaPlayer with the System Media Transport Controls (SMTC), such as by setting the CommandManager.IsEnabled property to false, then you must implement manual integration with the SMTC in order to enable background media playback. Vous devez également procéder à une intégration manuelle avec les contrôles de transport de média système si vous utilisez une API différente de MediaPlayer, telle que AudioGraph, afin de lire du contenu audio de manière ininterrompue durant la mise en arrière-plan de votre application.You must also manually integrate with SMTC if you are using an API other than MediaPlayer, such as AudioGraph, to play audio if you want to have the audio continue to play when your app moves to the background. La configuration minimale requise en matière d’intégration des contrôles de transport de média système est décrite dans la section «Utiliser les contrôles de transport de média système pour le son en arrière-plan» de Contrôle manuel des contrôles de transport de média système.The minimum SMTC integration requirements are described in the "Use the system media transport controls for background audio" section of Manual control of the System Media Transport Controls.
  • 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.While your app is in the background, you must stay under the memory usage limits set by the system for background apps. Les recommandations en matière de gestion de la mémoire pendant la mise en arrière-plan sont fournies plus loin dans cet article.Guidance for managing memory while in the background is provided later in this article.

Fonctionnalité de manifeste de lecture de médias en arrière-planBackground media playback manifest capability

Pour activer l’audio en arrière-plan, vous devez ajouter la fonctionnalité de lecture de médias en arrière-plan au fichier du manifeste d’application, Package.appxmanifest.To enable background audio, you must add the background media playback capability to the app manifest file, Package.appxmanifest.

Pour ajouter des fonctionnalités au manifeste d’application à l’aide du concepteur du manifesteTo add capabilities to the app manifest using the manifest designer

  1. Dans Microsoft Visual Studio, dans l’Explorateur de solutions, ouvrez le concepteur pour le manifeste de l’application en double-cliquant sur l’élément package.appxmanifest.In Microsoft Visual Studio, in Solution Explorer, open the designer for the application manifest by double-clicking the package.appxmanifest item.
  2. Sélectionnez l’onglet Fonctionnalités.Select the Capabilities tab.
  3. Sélectionnez la case Lecture de médias en arrière-plan.Select the Background Media Playback check box.

Pour définir la fonctionnalité en modifiant manuellement le manifeste xml de l’application, assurez-vous que le préfixe d’espace de noms uap3 est défini dans l’élément Package.To set the capability by manually editing the app manifest xml, first make sure that the uap3 namespace prefix is defined in the Package element. Si ce n’est pas le cas, ajoutez-le tel qu’illustré ci-dessous.If not, add it as shown below.

<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:Next, add the backgroundMediaPlayback capability to the Capabilities element:

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

Gérer la transition entre le premier plan et l’arrière-planHandle transitioning between foreground and background

Lorsque votre application passe du premier plan à l’arrière-plan, l’événement EnteredBackground est déclenché.When your app moves from the foreground to the background, the EnteredBackground event is raised. Quand votre application revient au premier plan, l’événement LeavingBackground est déclenché.And when your app returns to the foreground, the LeavingBackground event is raised. Ces événements étant liés au cycle de vie de l’application, vous devez enregistrer des gestionnaires dédiés lors de sa création.Because these are app lifecycle events, you should register handlers for these events when your app is created. Dans le modèle de projet par défaut, vous devrez procéder à leur ajout dans le constructeur de la classe App, dans App.xaml.cs.In the default project template, this means adding it to the App class constructor in App.xaml.cs.

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

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

Créez une variable affectée à la détection de l’exécution en arrière-plan.Create a variable to track whether you are currently running in the background.

bool _isInBackgroundMode = false;

Lorsque l’événement EnteredBackground est déclenché, définissez la variable de détection afin d’indiquer que l’exécution se déroule actuellement en arrière-plan.When the EnteredBackground event is raised, set the tracking variable to indicate that you are currently running in the background. Vous n’avez pas intérêt à effectuer de tâches longues dans l’événement EnteredBackground, dans la mesure où la transition vers l’arrière-plan pourrait apparaître lente pour l’utilisateur.You should not perform long-running tasks in the EnteredBackground event because this may cause the transition to the background to appear slow to the user.

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

Dans le gestionnaire d’événement LeavingBackground, vous devez définir la variable de détection afin d’indiquer que votre application ne s’exécute plus en arrière-plan.In the LeavingBackground event handler, you should set the tracking variable to indicate that your app is no longer running in the background.

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

Exigences en matière de gestion de mémoireMemory management requirements

La partie la plus importante du traitement de la transition entre le premier plan et l’arrière-plan consiste à gérer la mémoire utilisée par votre application.The most important part of handling the transition between foreground and background is managing the memory that your app uses. L’exécution en arrière-plan impliquant la réduction des ressources de mémoire que votre application est autorisée à conserver au niveau du système, vous devez également procéder à une inscription pour les événements AppMemoryUsageIncreased et AppMemoryUsageLimitChanging.Because running in the background will reduce the memory resources your app is allowed to retain by the system, you should also register for the AppMemoryUsageIncreased and AppMemoryUsageLimitChanging events. Lorsque ces événements sont déclenchés, vous devez vérifier la quantité de mémoire actuellement utilisée par votre application ainsi que la limite actuelle, et réduire votre consommation de mémoire si nécessaire.When these events are raised, you should check your app's current memory usage and the current limit, and then reduce your memory usage if needed. Pour plus d’informations sur la manière de réduire votre consommation de mémoire pendant une exécution en arrière-plan, consultez la page Libérer de la mémoire lorsque votre application bascule en arrière-plan.For information about reducing your memory usage while running in the background, see Free memory when your app moves to the background.

Disponibilité du réseau pour les applications multimédias en arrière-planNetwork availability for background media apps

L’ensemble des sources multimédias reconnaissant le réseau, celles qui ne sont pas créées à partir d’un flux ou d’un fichier, maintiennent l’activité de la connexion réseau pendant la récupération du contenu à distance et abandonnent l’activité dans le cas contraire.All network aware media sources, those that are not created from a stream or a file, will keep the network connection active while retrieving remote content, and they release it when they are not. MediaStreamSource, particulièrement, s’appuie sur l’application pour signaler correctement à l’application la plage mise en tampon à l’aide de SetBufferedRange.MediaStreamSource, specifically, relies on the application to correctly report the correct buffered range to the platform using SetBufferedRange. Une fois que l’intégralité du contenu est mis en tampon, le réseau n’est plus réservé pour le compte de l’application.After the entire content is fully buffered, the network will no longer be reserved on the app’s behalf.

SI vous avez besoin d’effectuer des appels réseau intervenant en arrière-plan lorsqu’aucun contenu multimédia n’est en cours de téléchargement, ces opérations doivent être encapsulées dans une tâche appropriée telle que MaintenanceTrigger ou TimeTrigger.If you need to make network calls that occur in the background when media is not downloading, these must be wrapped in an appropriate task like MaintenanceTrigger or TimeTrigger. Pour plus d’informations, voir Prendre en charge votre application avec des tâches en arrière-plan.For more information, see Support your app with background tasks.