Linguaggio: HTML | XAML

Come riprodurre audio in background (XAML)

Applies to Windows only

Per riprodurre audio in background dichiara l'attività in background Audio e gestisci i pulsanti SystemMediaTransportControls.

Importante  In Windows 8.1 è stata introdotta la classe SystemMediaTransportControls in sostituzione della classe MediaControl. Usa SystemMediaTransportControls nella tua app.

Nota  Se è abilitata la riproduzione di un flusso video in background, quando l'app passa alla modalità in background si continuerà a udire l'audio ma il video non sarà visibile. Questo è il comportamento previsto da progettazione e riduce il consumo di energia del dispositivo mentre il video viene riprodotto in background.

Per vedere questa funzionalità in azione nell'ambito di un esempio di riproduzione di elementi multimediali completa, vedi l'argomento su riproduzione di elementi multimediali dall'inizio alla fine.

Prerequisiti

In questo argomento si parte dal presupposto che tu sappia come creare una semplice app di Windows Store in C++, C# o Visual Basic. Per istruzioni sulla creazione della tua prima app, vedi Creare la prima app di Windows Store in C# o Visual Basic.

Questo argomento presuppone familiarità con MediaElement. Per un'introduzione all'uso della classe MediaElement, vedi Guida introduttiva: Video e audio.

Istruzioni

Passaggio 1: Dichiarare l'attività audio in background

Devi dichiarare in modo esplicito che la tua app eseguirà attività in background.

  1. Apri il file di progetto della tua app in Microsoft Visual Studio.
  2. Fai doppio clic sul file Package.appmanifest in Esplora soluzioni per aprire la finestra di dialogo Package.appmanifest.
  3. Fai clic sulla scheda Dichiarazioni, quindi seleziona Attività di background dalla casella a discesa Dichiarazioni disponibili.
  4. Fai clic su Aggiungi, quindi seleziona la casella di controllo Audio.

    Puoi anche creare una dichiarazione in background per un flusso video usando lo stesso file manifesto creato per l'audio nei passaggi precedenti. A questo scopo, imposta l'attributo del tipo di attività su audio.

  5. Specifica il punto di ingresso. Nella maggior parte dei casi, se il nome del progetto è Foo, specificherai Foo.App.

Passaggio 2: Impostare la proprietà AudioCategory

Imposta la proprietà AudioCategory di MediaElement su Communications o su BackgroundCapableMedia. Puoi anche specificare questa proprietà nel codice.

Il codice XAML seguente crea un MediaElement e imposta AudioCategory su BackgroundCapableMedia.


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


Passaggio 3: Supporto di SystemMediaTransportControls

In Windows 8.1 è stata introdotta la classe SystemMediaTransportControls in sostituzione della classe MediaControl. Usa SystemMediaTransportControls nella tua app. I passaggi necessari per implementare il supporto audio in background con MediaControl per completezza sono riportati di seguito, ma ti consigliamo di usare solo SystemMediaTransportControls. Per un approfondimento sull'uso di SystemMediaTransportControls, vedi Come usare i controlli del trasporto multimediale di sistema.

Anche se la riproduzione di audio in background è dichiarata, nell'app devono essere abilitati i pulsanti di riproduzione e pausa di SystemMediaTransportControls impostando IsPlayEnabled e IsPauseEnabled su true. L'app, inoltre, deve gestire l'evento ButtonPressed, che notifica all'app quando vengono premuti i pulsanti di controllo del trasporto multimediale di sistema. Fornendo questo supporto minimo per la gestione degli eventi, consenti agli utenti di riprodurre o mettere in pausa l'audio senza portare l'app in primo piano.

Per aggiornare gli oggetti nel thread dell'interfaccia utente dal gestore di eventi ButtonPressed, ad esempio un oggetto MediaElement, è necessario eseguire il marshalling delle chiamate tramite CoreDispatcher in quando il gestore di eventi ButtonPressed non viene chiamato dal thread dell'interfaccia utente e solo quest'ultimo può modificare gli oggetti del thread stesso. Se si tenta di modificare oggetti dell'interfaccia utente da un thread non di interfaccia utente, viene generata un'eccezione. Il codice di esempio seguente descrive come fare.

Oltre a gestire l'evento ButtonPressed, devi anche notificare a SystemMediaTransportControls i cambiamenti di stato del contenuto multimediale, ad esempio quando viene messo in pausa o quando è in esecuzione. Per notificare a SystemMediaTransportControl i cambiamenti di stato del contenuto multimediale, imposta la relativa proprietà PlaybackStatus su uno dei valori presenti in MediaPlaybackStatus.

Ecco un esempio di codice per impostare SystemMediaTransportControls in un'app che riproduce audio in background. Il codice effettua le operazioni seguenti.

Ecco il codice che crea MediaElement.


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


Ecco il codice che configura 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;
}


Ecco un esempio di codice che gestisce l'evento CurrentStateChanged di MediaElement e aggiorna la proprietà PlaybackStatus di 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;
    }
}


Ecco il codice relativo al gestore di eventi ButtonPressed e i metodi helper per riprodurre e mettere in pausa MediaElement. Rileva che le chiamate a Play e Pause vengono sottoposte a marshalling nel thread di interfaccia utente tramite CoreDispatcher usando 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();
    });
}


Per altre info su SystemMediaTransportControl, vedi Come usare i controlli del trasporto multimediale di sistema e l'esempio di controlli del trasporto multimediale di sistema

Passaggio 4: Registra i gestori in MediaControl (solo Windows 8)

Importante  

MediaControl è stato sostituito da SystemMediaTransportControl in Windows 8.1. Al suo posto devi usare SystemMediaTransportControl.

Anche se un'app è registrata per la riproduzione di musica o video in background, deve gestire gli eventi MediaControl elencati di seguito: PlayPressed, PausePressed, StopPressed e PlayPauseTogglePressed. Fornendo questo supporto minimo per la gestione degli eventi, consenti agli utenti di riprodurre o mettere in pausa flussi musicali o video in background senza portare l'applicazione in primo piano.

In genere, per controllare MediaElement è consigliabile creare controlli per il trasporto, vale a dire pulsanti per la riproduzione, l'arresto e la messa in pausa. Questo articolo non spiega come creare questi controlli, per visualizzare esempi sull'argomento vedi Guida introduttiva: Video e audio e Guida introduttiva: Creazione di un'app lettore multimediale.

Dato che MediaControl è una classe statica, devi aggiungere i gestori di eventi direttamente agli eventi della classe.

  1. Nel riquadro Esplora soluzioni fai clic sul file C# dell'app per aprirlo. Questo esempio utilizza il file MainPage.xaml.cs.
  2. Usa il codice seguente per registrare i pulsanti di riproduzione, pausa e arresto e l'interruttore di attivazione/messa in pausa della tua app:
    
    MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
    MediaControl.PlayPressed += MediaControl_PlayPressed;
    MediaControl.PausePressed += MediaControl_PausePressed;
    MediaControl.StopPressed += MediaControl_StopPressed;
    
    
    
    
  3. Usa il codice seguente per gestire gli eventi che vengono generati quando si generano gli eventi di riproduzione, pausa, arresto e attivazione/messa in pausa:
    
    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();
        }
    }
    
    
    

Osservazioni

Nota  Se hai un'app che esegue altre attività in aggiunta alla trasmissione di flussi audio o video, quando l'app perde lo stato attivo e non è più nella finestra attiva, deve interrompere le operazioni non correlate a elementi multimediali. L'app può continuare a trasmettere flussi audio e, per i flussi audio-video, la trasmissione di flussi video si interromperà automaticamente.

Esempio completo

Per visualizzare un esempio completo di come trasmettere flussi audio e video, vedi l'esempio di riproduzione multimediale XAML .

Argomenti correlati

Come usare i controlli del trasporto multimediale di sistema
Esempio di controlli del trasporto multimediale di sistema
Esempio di Gestione riproduzione
Guida introduttiva: Video e audio
Guida introduttiva: Creazione di un'applicazione per un lettore multimediale
Riproduzione di elementi multimediali dall'inizio alla fine

 

 

Mostra:
© 2014 Microsoft