Langage: HTML | XAML

Comment lire du contenu audio en arrière-plan (XAML)

Applies to Windows only

Pour lire du contenu audio en arrière-plan, déclarez la tâche en arrière-plan Audio et gérez les boutons SystemMediaTransportControls.

Important  Windows 8.1 introduit la classe SystemMediaTransportControls qui remplace la classe MediaControl. Vous devez utiliser SystemMediaTransportControls dans votre application.

Remarque  Si la lecture en arrière-plan est activée pour un flux vidéo est activée, quand l’application passe en arrière-plan, vous entendez le contenu audio mais ne voyez pas la vidéo. Ce comportement est délibéré. Cela réduit la consommation d’énergie de l’appareil lors de la lecture de la vidéo en arrière-plan.

Pour voir cette fonctionnalité en action dans un exemple de lecture de média complet, voir Lecture de contenu multimédia de A à Z.

Prérequis

Cette rubrique part du principe que vous savez créer une application élémentaire du Windows Store en C++, C# ou Visual Basic. Pour obtenir de l’aide lors de la création de votre première application, voir Créer votre première application du Windows Store en C# ou Visual Basic.

Cette rubrique considère que vous connaissez la classe MediaElement. Pour une introduction sur l’utilisation de la classe MediaElement, voir Démarrage rapide : vidéo et audio.

Instructions

Étape 1: Déclarer la tâche audio en arrière-plan

Vous devez déclarer explicitement que votre application exécutera les tâches en arrière-plan.

  1. Ouvrez le fichier projet de votre application dans Microsoft Visual Studio.
  2. Dans l’Explorateur de solutions, double-cliquez sur le fichier Package.appmanifest pour ouvrir la boîte de dialogue Package.appmanifest.
  3. Cliquez sur l’onglet Déclarations, puis sélectionnez Tâches en arrière-plan dans la liste déroulante Déclarations disponibles.
  4. Cliquez sur Ajouter, puis activez la case à cocher Audio.

    Vous pouvez aussi soumettre une déclaration en arrière-plan pour un flux vidéo en utilisant le même fichier manifeste que celui que vous avez créé pour l’audio au cours des étapes précédentes. Pour ce faire, affectez à l’audio l’attribut « Task Type ».

  5. Spécifiez le point d’entrée. Dans la plupart des cas, si votre projet est appelé Foo, vous spécifierez Foo.App.

Étape 2: Définir la propriété AudioCategory

Affectez à la propriété AudioCategory sur MediaElementla valeur Communications ou BackgroundCapableMedia. Vous pouvez aussi spécifier cette propriété dans le code.

Le code XAML suivant crée une classe MediaElement et affecte à la propriété AudioCategory la valeur BackgroundCapableMedia.


<MediaElement Name="media" 
              AudioCategory="BackgroundCapableMedia" 
              Source="Somesong.mp3" />


Étape 3: Prendre en charge SystemMediaTransportControls

Windows 8.1 introduit la classe SystemMediaTransportControls qui remplace la classe MediaControl. Vous devez utiliser SystemMediaTransportControls dans votre application. Par souci d’exhaustivité, les étapes permettant d’implémenter la prise en charge audio en arrière-plan avec la classe MediaControl sont incluses ci-dessous, mais vous devez uniquement utiliser la classe SystemMediaTransportControls. Voir Comment utiliser les contrôles de transport de média système pour approfondir l’utilisation de SystemMediaTransportControls.

Même si une application est déclarée pour la lecture audio en arrière-plan, l’application doit activer les boutons de lecture et de mise en pause SystemMediaTransportControls en affectant à IsPlayEnabled et IsPauseEnabled la valeur true. L’application doit également gérer l’événement ButtonPressed, qui notifie l’application quand l’utilisateur appuie sur les boutons de contrôle de transport de média système. En offrant cette prise en charge pour une gestion minimale des événements, l’utilisateur peut lire ou mettre en pause le contenu audio sans ramener l’application au premier plan.

Pour mettre à jour les objets du thread d’interface utilisateur à partir du gestionnaire d’événements ButtonPressed, tel que l’objet MediaElement, vous devez marshaler les appels via CoreDispatcher. La raison en est que le gestionnaire d’événements ButtonPressed n’est pas appelé à partir du thread d’interface utilisateur. De plus, seul le thread d’interface utilisateur peut modifier les objets qu’il contient. Si vous essayez de modifier des objets d’interface utilisateur à partir d’un autre thread que le thread d’interface utilisateur, une exception est levée. L’exemple de code ci-dessous montre comment procéder.

En complément de la gestion de l’événement ButtonPressed, vous devez également envoyer des notifications à la classe SystemMediaTransportControls quand l’état du média est modifié, s’il est en pause ou en cours de lecture par exemple. Pour envoyer des notifications à la classe SystemMediaTransportControl concernant la modification de l’état du média, affectez à sa propriété PlaybackStatus l’une des valeurs dans MediaPlaybackStatus.

Voici du code qui définit la classe SystemMediaTransportControlsdans une application qui lit de l’audio en arrière-plan. Le code exécute les étapes suivantes :

Voici le code qui crée MediaElement.


<MediaElement x:Name="musicPlayer" 
          Source="Music/music1.mp3"
          AudioCategory="BackgroundCapableMedia"
          CurrentStateChanged="MusicPlayer_CurrentStateChanged" />


Voici le code qui configure SystemMediaTransportControls.


SystemMediaTransportControls systemControls;

void InitializeTransportControls()
{
    // Hook up app to system transport controls.
    systemControls = SystemMediaTransportControls.GetForCurrentView();
    systemControls.ButtonPressed += SystemControls_ButtonPressed;

    // Register to handle the following system transpot control buttons.
    systemControls.IsPlayEnabled = true;
    systemControls.IsPauseEnabled = true;
}


Voici du code qui gère l’événement CurrentStateChangedde la classe MediaElement et qui met à jour la propriété PlaybackStatus de la classe SystemMediaTransportControls.


void MusicPlayer_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (musicPlayer.CurrentState)
    {
        case MediaElementState.Playing:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}


Voici le code relatif au gestionnaire d’événements ButtonPressed et aux méthodes d’assistance destiné à lire et à mettre en pause MediaElement. Notez que les appels à Play et Pause sont marshalés sur le thread d’interface utilisateur via CoreDispatcher en utilisant Dispatcher.RunAsync.


void SystemControls_ButtonPressed(SystemMediaTransportControls sender,
    SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            PlayMedia();
            break;
        case SystemMediaTransportControlsButton.Pause:
            PauseMedia();
            break;
        default:
            break;
    }
}

async void PlayMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Play();
    });
}

async void PauseMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Pause();
    });
}


Pour plus d’informations sur la classe SystemMediaTransportControl, voir Comment utiliser les contrôles de transport de média système et l’exemple d’utilisation de SystemMediaTransportControls

Étape 4: Inscrire des gestionnaires sur MediaControl (Windows 8 uniquement)

Important  

La classe MediaControl a été remplacée dans Windows 8.1 SystemMediaTransportControl. Utilisez plutôt SystemMediaTransportControl.

Même si une application est inscrite pour lire de la musique ou une vidéo en arrière-plan, l’application doit gérer les événements MediaControl suivants : PlayPressed, PausePressed, StopPressed et PlayPauseTogglePressed. Grâce à cette prise en charge pour une gestion minimale des événements, l’utilisateur peut lire ou suspendre un flux musical ou vidéo en arrière-plan sans ramener l’application au premier plan.

Dans la plupart des cas, il vous faudra probablement créer des contrôles de transport (des boutons de lecture, d’arrêt et de pause) pour contrôler l’élément MediaElement. Cet article ne vous indique pas comment procéder pour cela, mais pour obtenir des exemples, voir Démarrage rapide : vidéo et audio et Démarrage rapide : création d’une application de lecteur multimédia.

MediaControl est une classe statique, il vous suffit donc d’ajouter les gestionnaires d’événements directement dans les événements de la classe.

  1. Dans le volet Explorateur de solutions, cliquez sur le fichier C# de votre application pour l’ouvrir. Dans cet exemple, nous utilisons le fichier MainPage.xaml.cs.
  2. Utilisez le code suivant pour inscrire les boutons bascule Lecture, Pause, Arrêt et Lecture/Pause pour votre application :
    
    MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
    MediaControl.PlayPressed += MediaControl_PlayPressed;
    MediaControl.PausePressed += MediaControl_PausePressed;
    MediaControl.StopPressed += MediaControl_StopPressed;
    
    
    
    
  3. Utilisez le code suivant pour gérer les événements qui sont déclenchés lorsque les événements Lecture, Pause, Arrêt et Lecture/Pause sont déclenchés :
    
    void MediaControl_StopPressed(object sender, object e)
    {
        // media is a MediaElement defined in XAML
        media.Stop();
    }
    
    void MediaControl_PausePressed(object sender, object e)
    {
        // media is a MediaElement defined in XAML
        media.Pause();
    }
    
    void MediaControl_PlayPressed(object sender, object e)
    {
        // media is a MediaElement defined in XAML
        media.Play();
    }
    
    void MediaControl_PlayPauseTogglePressed(object sender, object e)
    {
        if (MediaControl.IsPlaying == true)
        {
            // media is a MediaElement defined in XAML
            media.Pause();
        }
        else
        {
            // media is a MediaElement defined in XAML
            media.Play();
        }
    }
    
    
    

Remarques

Remarque  Si vous disposez d’une application qui réalise d’autres tâches en dehors de la diffusion d’éléments audio ou vidéo, votre application doit cesser toutes les tâches sans rapport avec du multimédia lorsqu’elle perd le focus et ne constitue plus la fenêtre active. Votre application peut toujours diffuser du contenu et, dans le cas d’un flux audio/vidéo, la diffusion vidéo sera automatiquement arrêtée.

Exemple complet

Pour obtenir un exemple complet de diffusion d’éléments audio et vidéo, voir l’exemple de lecture de média XAML.

Rubriques associées

Comment utiliser les contrôles de transport de média système
Exemple d’utilisation de SystemMediaTransportControls
Exemple de gestionnaire de lecture
Démarrage rapide : vidéo et audio
Démarrage rapide : création d’une application de lecteur multimédia
Lecture de contenu multimédia de A à Z

 

 

Afficher:
© 2014 Microsoft