Riproduzione di elementi multimediali in background legacyLegacy background media playback

Questo articolo descrive il modello legacy con due processi per l'aggiunta del supporto dell'audio in background nella tua app UWP.This article describes the legacy, two-process model for adding background audio support to your UWP app. A partire da Windows 10, versione 1607, è disponibile un modello con processo singolo per l'audio in background, molto più semplice da implementare.Starting with Windows 10, version 1607, a single-process model for background audio that is much simpler to implement. Per altre informazioni sulle raccomandazioni correnti per l'audio in background, vedi Riprodurre elementi multimediali in background.For more information on the current recommendations for background audio, see Play media in the background. Questo articolo è progettato per offrire supporto per le app già sviluppate per l'uso del modello con due processi legacy.This article is intended to provide support for apps that are have already been developed using the legacy two-process model.

Nota

A partire da Windows, la versione 1703, BackgroundMediaPlayer è deprecata e potrebbe non essere disponibile nelle versioni future di Windows.Starting with Windows, version 1703, BackgroundMediaPlayer is deprecated and may not be available in future versions of Windows.

Architettura dell'audio in backgroundBackground audio architecture

Un'app che esegue riproduzioni in background è costituita da due processi.An app performing background playback consists of two processes. Il primo è rappresentato dall'app principale, contenente l'interfaccia utente e la logica client dell'app ed eseguita in primo piano.The first process is the main app, which contains the app UI and client logic, running in the foreground. Il secondo è l'attività di riproduzione in background, che implementa IBackgroundTask come tutte le attività in background delle app UWP.The second process is the background playback task, which implements IBackgroundTask like all UWP app background tasks. L'attività in background contiene i servizi di logica di riproduzione audio e background.The background task contains the audio playback logic and background services. L'attività in background comunica con il sistema tramite i controlli di trasporto multimediale di sistema.The background task communicates with the system through the System Media Transport Controls.

Il diagramma seguente fornisce una panoramica del modo in cui è progettato il sistema.The following diagram is an overview of how the system is designed.

Architettura dell'audio in background in Windows 10

Media PlayerMediaPlayer

Lo spazio dei nomi Windows.Media.Playback contiene le API usate per riprodurre audio in background.The Windows.Media.Playback namespace contains APIs used to play audio in the background. Esiste una singola istanza di MediaPlayer per app tramite la quale viene eseguita la riproduzione.There is a single instance of MediaPlayer per app through which playback occurs. L'app per audio in background chiama metodi e imposta proprietà nella classe MediaPlayer per l'impostazione di traccia corrente, avvio della riproduzione, sospensione, avanzamento rapido, riavvolgimento e così via.Your background audio app calls methods and sets properties on the MediaPlayer class to set the current track, start playback, pause, fast forward, rewind, and so on. L'istanza dell'oggetto lettore multimediale è sempre accessibile tramite la proprietà BackgroundMediaPlayer.Current.The media player object instance is always accessed through the BackgroundMediaPlayer.Current property.

Proxy/stub MediaPlayerMediaPlayer Proxy and Stub

Quando si accede a BackgroundMediaPlayer.Current dal processo in background dell'app, l'istanza di MediaPlayer viene attivata nell'host dell'attività in background, dove potrà essere modificata direttamente.When BackgroundMediaPlayer.Current is accessed from your app's background process, the MediaPlayer instance is activated in the background task host and can be manipulated directly.

Quando si accede a BackgroundMediaPlayer.Current dall'applicazione in primo piano, l'istanza di MediaPlayer restituita è effettivamente un proxy che comunica con uno stub nel processo in background.When BackgroundMediaPlayer.Current is accessed from the foreground application, the MediaPlayer instance that is returned is actually a proxy that communicates with a stub in the background process. Questo stub comunica con l'istanza effettiva di MediaPlayer, anch'essa ospitata nel processo in background.This stub communicates with the actual MediaPlayer instance, which is also hosted in the background process.

I processi in primo piano e in background possono accedere alla maggior parte delle proprietà dell'istanza di MediaPlayer, ad eccezione di MediaPlayer.Source e MediaPlayer.SystemMediaTransportControls, che sono accessibili solo dal processo in background.Both the foreground and background process can access most of the properties of the MediaPlayer instance, with the exception of MediaPlayer.Source and MediaPlayer.SystemMediaTransportControls which can only be accessed from the background process. L'app in primo piano e il processo in background possono ricevere notifiche di eventi specifici del supporto, ad esempio MediaOpened, MediaEndede MediaFailed.The foreground app and the background process can both receive notifications of media-specific events like MediaOpened, MediaEnded, and MediaFailed.

Elenchi di riproduzionePlayback Lists

Uno scenario comune per applicazioni per audio in background è la riproduzione di più elementi in sequenza.A common scenario for background audio applications is to play multiple items in a row. Questa operazione può essere ottenuta in modo più semplice mediante il processo in background usando un oggetto MediaPlaybackList, che può essere impostato come origine in MediaPlayer assegnandolo alla proprietà MediaPlayer.Source.This is most easily accomplished in your background process by using a MediaPlaybackList object, which can be set as a source on the MediaPlayer by assigning it to the MediaPlayer.Source property.

Non è possibile accedere a un oggetto MediaPlaybackList dal processo in primo piano impostato nel processo in background.It is not possible to access a MediaPlaybackList from the foreground process that was set in the background process.

Controlli di sistema per il trasporto multimedialeSystem Media Transport Controls

Un utente può controllare la riproduzione audio senza usare direttamente l'interfaccia utente dell'applicazione tramite, ad esempio, dispositivi Bluetooth, SmartGlass e i controlli di trasporto multimediale di sistema.A user may control audio playback without directly using your app's UI through means such as Bluetooth devices, SmartGlass, and the System Media Transport Controls. L'attività in background usa la classe SystemMediaTransportControls per sottoscrivere questi eventi di sistema avviati dall'utente.Your background task uses the SystemMediaTransportControls class to subscribe to these user-initiated system events.

Per ottenere un'istanza di SystemMediaTransportControls dall'interno del processo in background, usa la proprietà MediaPlayer.SystemMediaTransportControls.To get a SystemMediaTransportControls instance from within the background process, use the MediaPlayer.SystemMediaTransportControls property. Le app in primo piano ottengono un'istanza della classe chiamando SystemMediaTransportControls. GetForCurrentView, ma l'istanza restituita è un'istanza di solo primo piano che non è correlata all'attività in background.Foreground apps get an instance of the class by calling SystemMediaTransportControls.GetForCurrentView, but the instance returned is a foreground-only instance that does not relate to the background task.

Invio di messaggi tra attivitàSending Messages Between Tasks

In alcuni casi dovrai gestire la comunicazione tra i due processi di un'app per audio in background.There are times when you will want to communicate between the two processes of a background audio app. Ad esempio, è possibile che l'attività in background debba notificare l'avvio della riproduzione di una nuova traccia all'attività in primo piano e poi inviare il titolo del nuovo brano all'attività in primo piano per visualizzarlo sullo schermo.For example, you might want the background task to notify the foreground task when a new track starts playing, and then send the new song title to the foreground task to display on the screen.

Un meccanismo di comunicazione semplice genera eventi sia nel processo in primo piano che in quello in background.A simple communication mechanism raises events in both the foreground and background processes. I metodi SendMessageToForeground e SendMessageToBackground richiamano ogni evento nel processo corrispondente.The SendMessageToForeground and SendMessageToBackground methods each invoke events in the corresponding process. I messaggi possono essere ricevuti sottoscrivendo gli eventi MessageReceivedFromBackground e MessageReceivedFromForeground .Messages can be received by subscribing to the MessageReceivedFromBackground and MessageReceivedFromForeground events.

I dati possono essere passati come argomento per i metodi di invio di messaggi che vengono quindi passati ai gestori eventi di ricezione dei messaggi.Data can be passed as an argument to the send message methods that are then passed into the message received event handlers. Passa i dati mediante la classe ValueSet.Pass data using the ValueSet class. Questa classe è un dizionario che contiene una stringa come chiave e altri tipi di valore come valori.This class is a dictionary that contains a string as a key and other value types as values. Puoi passare tipi di valore semplici, ad esempio numeri interi, stringhe e valori booleani.You can pass simple value types such as integers, strings, and booleans.

Durata dell'attività in backgroundBackground Task Life Cycle

La durata di un'attività in background è strettamente collegata allo stato di riproduzione corrente dell'app.The lifetime of a background task is closely tied to your app's current playback status. Quando un utente sospende la riproduzione dell'audio, ad esempio, il sistema potrebbe interrompere o annullare l'app a seconda delle circostanze.For example, when the user pauses audio playback, the system may terminate or cancel your app depending on the circumstances. Dopo un periodo di tempo senza la riproduzione audio, il sistema può automaticamente arrestare l'attività in background.After a period of time without audio playback, the system may automatically shut down the background task.

Il metodo IBackgroundTask.Run viene chiamato la prima volta che l'app accede a BackgroundMediaPlayer.Current dal codice in esecuzione nell'app in primo piano oppure quando registri un gestore per l'evento MessageReceivedFromBackground, a seconda di quale condizione si verifica prima.The IBackgroundTask.Run method is called the first time your app accesses either BackgroundMediaPlayer.Current from code running in the foreground app or when you register a handler for the MessageReceivedFromBackground event, whichever occurs first. Ti consigliamo di registrare il gestore di messaggi ricevuti prima di chiamare BackgroundMediaPlayer.Current per la prima volta, in modo che l'app in primo piano non perda i messaggi inviati dal processo in background.It is recommended that you register for the message received handler before calling BackgroundMediaPlayer.Current for the first time so that the foreground app doesn't miss any messages sent from the background process.

Per mantenere attiva l'attività in background, la tua app dovrà richiedere BackgroundTaskDeferral dal metodo Run e chiamare BackgroundTaskDeferral.Complete quando l'istanza dell'attività riceve l'evento Canceled o Completed.To keep the background task alive, your app must request a BackgroundTaskDeferral from within the Run method and call BackgroundTaskDeferral.Complete when the task instance receives the Canceled or Completed events. Non usare la tecnica del ciclo o dell'attesa nel metodo Run, perché ciò comporta un uso rilevante di risorse e potrebbe causare l'interruzione da parte del sistema dell'attività in background dell'app.Do not loop or wait in the Run method because this consumes resources and may cause your app's background task to be terminated by the system.

La tua attività in background riceve l'evento Completed al completamento del metodo Run e quando non viene richiesto il rinvio.Your background task gets the Completed event when the Run method is completed and deferral is not requested. In alcuni casi, quando l'app riceve l'evento Canceled, questo potrebbe essere seguito anche dall'evento Completed.In some cases, when your app gets the Canceled event, it can be also followed by the Completed event. Poiché l'attività può ricevere un evento Canceled mentre Run è in esecuzione, assicurati di gestire questa potenziale situazione di simultaneità.Your task may receive a Canceled event while Run is executing, so be sure to manage this potential concurrence.

Un'attività in background può essere annullata nelle situazioni seguenti:Situations in which the background task can be cancelled include:

  • Nei sistemi che applicano i criteri di esclusività secondarie viene avviata una nuova app con funzionalità di riproduzione audio.A new app with audio playback capabilities starts on systems that enforce the exclusivity sub-policy. Vedi la sezione Criteri di sistema per la durata dell'attività audio in background più avanti.See the System policies for background audio task lifetime section below.

  • È stata avviata un'attività in background ma la musica non è ancora in riproduzione e quindi l'app in primo piano viene sospesa.A background task has been launched but music is not yet playing, and then the foreground app is suspended.

  • Altre interruzioni multimediali, come telefonate in arrivo o chiamate VoIP.Other media interruptions, such as incoming phone calls or VoIP calls.

Un'attività in background può essere annullata senza alcun preavviso nelle situazioni seguenti:Situations in which the background task can be terminated without notice include:

  • Viene ricevuta una chiamata VoIP ma nel sistema non è disponibile memoria sufficiente per mantenere attiva l'attività in background.A VoIP call comes in and there is not enough available memory on the system to keep the background task alive.

  • Viene violato un criterio per le risorse.A resource policy is violated.

  • L'annullamento o il completamento dell'attività non avviene in modo normale.Task cancellation or completion does not end gracefully.

Criteri di sistema per la durata dell'attività audio in backgroundSystem policies for background audio task lifetime

I seguenti criteri aiutano a determinare come il sistema gestisce la durata delle attività audio in background.The following policies help determine how the system manages the lifetime of background audio tasks.

EsclusivitàExclusivity

Se attivato, questo criterio secondario limita il numero di attività audio in background a un massimo di 1 in un determinato momento.If enabled, this sub-policy limits the number of background audio tasks to be at most 1 at any given time. È attivato in Mobile e in altri SKU non desktop.It is enabled on Mobile and other non-Desktop SKUs.

Timeout inattivitàInactivity Timeout

A causa di vincoli delle risorse, il sistema può terminare l'attività in background dopo un periodo di inattività.Due to resource constraints, the system may terminate your background task after a period of inactivity.

Un'attività in background viene considerata "inattiva" se vengono soddisfatte entrambe le condizioni seguenti:A background task is considered “inactive” if both of the following conditions are met:

  • L'app in primo piano non è visibile (viene sospesa o terminata).The foreground app is not visible (it is suspended or terminated).

  • Il lettore multimediale in background non è in stato di riproduzione.The background media player is not in the playing state.

Se entrambe queste condizioni vengono soddisfatte, il criterio del sistema multimediale in background avvierà un timer.If both of these conditions are satisfied, the background media system policy will start a timer. Se nessuna delle due condizioni risulta variata alla scadenza del timer, il criterio del sistema multimediale in background terminerà l'attività in background.If neither condition has changed when the timer expires, the background media system policy will terminate the background task.

Durata condivisaShared Lifetime

Se attivato, questo criterio secondario fa sì che l'attività in background dipenda dalla durata dell'attività in primo piano.If enabled, this sub-policy forces the background task to be dependent on the lifetime of the foreground task. Se l'attività in primo piano viene chiusa dall'utente o dal sistema, anche l'attività in background verrà chiusa.If the foreground task is shut down, either by the user or the system, the background task will also shut down.

Tuttavia, tieni presente che questo non significa che l'attività in primo piano sia dipendente dall'attività in background.However, note that this does not mean that the foreground is dependent on the background. Se l'attività in background viene chiusa, questo non comporta la chiusura anche dell'attività in primo piano.If the background task is shut down, this does not force the foreground task to shut down.

La tabella seguente elenca i criteri applicati ai vari tipi di dispositivi.The following table lists the which policies are enforced on which device types.

Criteri secondariSub-policy DesktopDesktop MobileMobile AltroOther
EsclusivitàExclusivity DisabledDisabled AttivatoEnabled AttivatoEnabled
Timeout inattivitàInactivity Timeout DisabledDisabled AttivatoEnabled DisabledDisabled
Durata condivisaShared Lifetime AttivatoEnabled DisabledDisabled DisabledDisabled