Medienwiedergabe im Hintergrund (Legacy)Legacy background media playback

In diesem Artikel wird das ältere Modell zur Unterstützung von Hintergrundaudio für Ihre UWP-App beschrieben, das zwei Prozesse umfasst.This article describes the legacy, two-process model for adding background audio support to your UWP app. Ab Windows 10, Version 1607, wird ein Modell für die Audiowiedergabe im Hintergrund verwendet, das nur einen Prozess umfasst und sehr viel einfacher zu implementieren ist.Starting with Windows 10, version 1607, a single-process model for background audio that is much simpler to implement. Weitere Informationen zu den aktuellen Empfehlungen für Hintergrundaudio finden Sie unter Wiedergeben von Medien im Hintergrund.For more information on the current recommendations for background audio, see Play media in the background. Dieser Artikel bietet Hilfe bei der Unterstützung von Apps, die unter Verwendung des älteren Modells mit zwei Prozessen entwickelt wurden.This article is intended to provide support for apps that are have already been developed using the legacy two-process model.

Hinweis

Ab Windows, Version 1703, ist backgroundmediaplayer veraltet und in zukünftigen Versionen von Windows möglicherweise nicht mehr verfügbar.Starting with Windows, version 1703, BackgroundMediaPlayer is deprecated and may not be available in future versions of Windows.

Architektur von HintergrundaudioBackground audio architecture

Eine App für die Hintergrundwiedergabe besteht aus zwei Prozessen.An app performing background playback consists of two processes. Der erste Prozess ist die Haupt-App, die die App-UI und Clientlogik enthält und im Vordergrund ausgeführt wird.The first process is the main app, which contains the app UI and client logic, running in the foreground. Der zweite Prozess ist die Wiedergabeaufgabe im Hintergrund, die IBackgroundTask wie alle Hintergrundaufgaben von UWP-Apps implementiert.The second process is the background playback task, which implements IBackgroundTask like all UWP app background tasks. Die Hintergrundaufgabe enthält die Logik für die Audiowiedergabe und die Hintergrunddienste.The background task contains the audio playback logic and background services. Die Hintergrundaufgabe kommuniziert mit dem System über die Steuerelemente für den Systemmedientransport.The background task communicates with the system through the System Media Transport Controls.

Das folgende Diagramm ist eine Übersicht des Systemdesigns.The following diagram is an overview of how the system is designed.

Architektur der Windows 10-Hintergrundaudio

MediaPlayerMediaPlayer

Der Windows.Media.Playback-Namespace enthält APIs, die zum Wiedergeben von Audio im Hintergrund verwendet werden.The Windows.Media.Playback namespace contains APIs used to play audio in the background. Es gibt eine einzige Instanz von MediaPlayer pro App, über die die Wiedergabe erfolgt.There is a single instance of MediaPlayer per app through which playback occurs. Ihre Hintergrundaudio-App ruft Methoden auf und legt Eigenschaften für die MediaPlayer-Klasse zum Festlegen des aktuellen Titels, zum Starten der Wiedergabe, zum Anhalten, zum schnellen Vor- und Zurückspulen usw. fest.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. Der Zugriff auf die Media Player-Objektinstanz erfolgt immer über die BackgroundMediaPlayer.Current-Eigenschaft.The media player object instance is always accessed through the BackgroundMediaPlayer.Current property.

MediaPlayer-Proxy und -StubMediaPlayer Proxy and Stub

Wenn auf BackgroundMediaPlayer.Current über den Hintergrundprozess der App zugegriffen wird, wird die MediaPlayer-Instanz im Hintergrundaufgabenhost aktiviert und kann direkt bearbeitet werden.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.

Wenn auf BackgroundMediaPlayer.Current über die Vordergrund-App zugegriffen wird, ist die zurückgegebene MediaPlayer-Instanz tatsächlich ein Proxy, der mit einem Stub im Hintergrundprozess kommuniziert.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. Dieser Stub kommuniziert mit der tatsächlichen MediaPlayer-Instanz, die auch im Hintergrundprozess gehostet wird.This stub communicates with the actual MediaPlayer instance, which is also hosted in the background process.

Sowohl der Vordergrund- als auch der Hintergrundprozess können auf den Großteil der Eigenschaften der MediaPlayer-Instanz zugreifen, mit Ausnahme von MediaPlayer.Source und MediaPlayer.SystemMediaTransportControls, auf die nur über den Hintergrundprozess zugegriffen werden kann.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. Die Vordergrund-App und der Hintergrundprozess können beide Benachrichtigungen über medienspezifische Ereignisse wie MediaOpened, MediaEnded und MediaFailed empfangen.The foreground app and the background process can both receive notifications of media-specific events like MediaOpened, MediaEnded, and MediaFailed.

WiedergabelistenPlayback Lists

Ein häufiges Szenario für Hintergrundaudioanwendungen besteht darin, mehrere Elemente in einer Zeile wiederzugeben.A common scenario for background audio applications is to play multiple items in a row. Dies kann am einfachsten im Hintergrundprozess mithilfe eines MediaPlaybackList-Objekts erreicht werden, das als Quelle für den MediaPlayer festgelegt werden kann, indem es der MediaPlayer.Source-Eigenschaft zugewiesen wird.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.

Es ist nicht möglich, über den Vordergrundprozess, der im Hintergrundprozess festgelegt wurde, auf eine MediaPlaybackList zuzugreifen.It is not possible to access a MediaPlaybackList from the foreground process that was set in the background process.

Steuerelemente für den SystemmedientransportSystem Media Transport Controls

Ein Benutzer kann beispielsweise mithilfe von Bluetooth-Geräten, SmartGlass und die Steuerelemente für den Systemmedientransport die Audiowiedergabe ohne direkte Verwendung der Benutzeroberfläche der App steuern.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. Die Hintergrundaufgabe verwendet die SystemMediaTransportControls-Klasse, um diese vom Benutzer initiierten Systemereignisse zu abonnieren.Your background task uses the SystemMediaTransportControls class to subscribe to these user-initiated system events.

Zum Abrufen einer SystemMediaTransportControls-Instanz aus dem Hintergrundprozess verwenden Sie die MediaPlayer.SystemMediaTransportControls-Eigenschaft.To get a SystemMediaTransportControls instance from within the background process, use the MediaPlayer.SystemMediaTransportControls property. Vordergrund-Apps rufen eine Instanz der Klasse mithilfe von SystemMediaTransportControls.GetForCurrentView auf. Die zurückgegebene Instanz ist jedoch eine Vordergrundinstanz, die nicht mit der Hintergrundaufgabe im Zusammenhang steht.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.

Senden von Nachrichten zwischen AufgabenSending Messages Between Tasks

Unter Umständen möchten Sie, dass die beiden Prozesse einer Hintergrund-App miteinander kommunizieren.There are times when you will want to communicate between the two processes of a background audio app. Beispielsweise kann es sein, dass die Hintergrundaufgabe die Vordergrundaufgabe benachrichtigen soll, wenn die Wiedergabe eines neuen Titels gestartet wird. Außerdem soll dann der Songtitel an die Vordergrundaufgabe gesendet werden, damit er auf dem Bildschirm angezeigt wird.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.

Über einen einfachen Kommunikationsmechanismus werden Ereignisse sowohl im Vordergrundprozess als auch im Hintergrundprozess ausgelöst.A simple communication mechanism raises events in both the foreground and background processes. Die Methoden SendMessageToForeground und SendMessageToBackground rufen jeweils Ereignisse in dem entsprechenden Prozess auf.The SendMessageToForeground and SendMessageToBackground methods each invoke events in the corresponding process. Nachrichten können durch Abonnieren der Ereignisse MessageReceivedFromBackground und MessageReceivedFromForeground empfangen werden.Messages can be received by subscribing to the MessageReceivedFromBackground and MessageReceivedFromForeground events.

Daten können als Argument an die Methoden zum Senden einer Nachricht übergeben werden, die dann an die „MessageReceived“-Ereignishandler übergeben werden.Data can be passed as an argument to the send message methods that are then passed into the message received event handlers. Übergeben Sie Daten mit der ValueSet-Klasse.Pass data using the ValueSet class. Bei dieser Klasse handelt es sich um ein Wörterbuch, das eine Zeichenfolge als Schlüssel und andere Werttypen als Werte enthält.This class is a dictionary that contains a string as a key and other value types as values. Sie können einfache Werttypen übergeben, z. B. ganze Zahlen, Zeichenfolgen und booleschen Werte.You can pass simple value types such as integers, strings, and booleans.

Lebenszyklus von HintergrundaufgabenBackground Task Life Cycle

Die Lebensdauer einer Hintergrundaufgabe ist eng mit dem aktuellen Wiedergabestatus Ihrer App verknüpft.The lifetime of a background task is closely tied to your app's current playback status. Wenn der Benutzer die Audiowiedergabe beispielsweise anhält, kann das System die App je nach den Umständen beenden oder abbrechen.For example, when the user pauses audio playback, the system may terminate or cancel your app depending on the circumstances. Das System kann die Hintergrundaufgabe nach einer gewissen Zeit ohne Audiowiedergabe automatisch beenden.After a period of time without audio playback, the system may automatically shut down the background task.

Die IBackgroundTask.Run-Methode wird gestartet, wenn die App das erste Mal auf BackgroundMediaPlayer.Current im Code zugreift, der in der Vordergrund-App ausgeführt wird, oder wenn Sie einen Handler für das MessageReceivedFromBackground-Ereignis registrieren, je nachdem, welcher Fall zuerst eintritt.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. Es wird empfohlen, dass Sie sich für den „MessageReceived“-Ereignishandler registrieren, bevor Sie BackgroundMediaPlayer.Current das erste Mal aufrufen, damit die Vordergrund-App keine Nachrichten versäumt, die vom Hintergrundprozess gesendet werden.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.

Damit die Hintergrundaufgabe aktiv bleibt, muss die App eine BackgroundTaskDeferral aus der Run-Methode anfordern und BackgroundTaskDeferral.Complete aufrufen, wenn die Aufgabeninstanz das Ereignis Canceled oder Completed empfängt.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. Verwenden Sie in der Run-Methode keine Schleife oder Warten, da dabei Ressourcen verwendet werden. Dies könnte dazu führen, dass die Hintergrundaufgabe der App vom System beendet wird.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.

Die Hintergrundaufgabe ruft das Completed-Ereignis ab, wenn die Run-Methode abgeschlossen ist und keine Verzögerung angefordert wurde.Your background task gets the Completed event when the Run method is completed and deferral is not requested. In manchen Fällen kann, nachdem die App das Canceled-Ereignis abgerufen hat, das Completed-Ereignis folgen.In some cases, when your app gets the Canceled event, it can be also followed by the Completed event. Die Aufgabe kann möglicherweise ein Canceled-Ereignis empfangen, während Run ausgeführt wird, Sie sollten daher sicherstellen, dass diese potenzielle Übereinstimmung verwaltet wird.Your task may receive a Canceled event while Run is executing, so be sure to manage this potential concurrence.

Eine Hintergrundaufgabe kann in den folgenden Situationen abgebrochen werden:Situations in which the background task can be cancelled include:

  • Eine neue App mit Audiowiedergabefunktionen wird in Systemen gestartet, die die Unterrichtlinie für Exklusivität erzwingen.A new app with audio playback capabilities starts on systems that enforce the exclusivity sub-policy. Weitere Informationen finden Sie im Abschnitt Systemrichtlinien für die Lebensdauer einer Audiohintergrundaufgabe weiter unten.See the System policies for background audio task lifetime section below.

  • Eine Hintergrundaufgabe wurde gestartet, aber es wird noch keine Musik wiedergegeben. Anschließend wird die Vordergrund-App angehalten.A background task has been launched but music is not yet playing, and then the foreground app is suspended.

  • Andere Medienunterbrechungen, z. B. eingehende Telefonanrufe oder VoIP-Anrufe.Other media interruptions, such as incoming phone calls or VoIP calls.

Situationen, in denen die Hintergrundaufgabe ohne vorherige Ankündigung beendet werden kann:Situations in which the background task can be terminated without notice include:

  • Ein VoIP-Anruf geht ein, und es ist nicht genügend Speicherplatz auf dem System vorhanden, um die Hintergrundaufgabe aktiv zu halten.A VoIP call comes in and there is not enough available memory on the system to keep the background task alive.

  • Es wird gegen eine Ressourcenrichtlinie verstoßen.A resource policy is violated.

  • Eine Aufgabe wird nicht korrekt abgebrochen oder abgeschlossen.Task cancellation or completion does not end gracefully.

Systemrichtlinien für die Lebensdauer einer AudiohintergrundaufgabeSystem policies for background audio task lifetime

Anhand der folgenden Richtlinien können Sie feststellen, wie das System die Lebensdauer von Audiohintergrundaufgaben verwaltet.The following policies help determine how the system manages the lifetime of background audio tasks.

ExklusivitätExclusivity

Wenn diese Unterrichtlinie aktiviert ist, wird die Anzahl von Audiohintergrundaufgaben zu einem bestimmten Zeitpunkt auf maximal 1 beschränkt.If enabled, this sub-policy limits the number of background audio tasks to be at most 1 at any given time. Sie ist für Mobile- und andere Nicht-Desktop-SKUs aktiviert.It is enabled on Mobile and other non-Desktop SKUs.

Zeitüberschreitung nach InaktivitätInactivity Timeout

Aufgrund von Ressourcenbeschränkungen kann das System die Hintergrundaufgabe nach einer gewissen Zeit der Inaktivität beenden.Due to resource constraints, the system may terminate your background task after a period of inactivity.

Eine Hintergrundaufgabe gilt als „inaktiv“, wenn beide der folgenden Bedingungen erfüllt sind:A background task is considered “inactive” if both of the following conditions are met:

  • Die Vordergrund-App ist nicht sichtbar (sie ist angehalten oder beendet).The foreground app is not visible (it is suspended or terminated).

  • Der Hintergrund-Media Player befindet sich nicht im Wiedergabezustand.The background media player is not in the playing state.

Wenn beide der folgenden Bedingungen erfüllt sind, startet die Richtlinie für das Hintergrundmediensystem einen Zeitgeber.If both of these conditions are satisfied, the background media system policy will start a timer. Wenn sich keine der beiden Bedingungen geändert hat, wenn der Zeitgeber abläuft, beendet die Richtlinie für das Hintergrundmediensystem die Hintergrundaufgabe.If neither condition has changed when the timer expires, the background media system policy will terminate the background task.

Freigegebene LebensdauerShared Lifetime

Wenn diese Unterrichtlinie aktiviert ist, wird erzwungen, dass die Hintergrundaufgabe von der Lebensdauer der Vordergrundaufgabe abhängig ist.If enabled, this sub-policy forces the background task to be dependent on the lifetime of the foreground task. Wenn die Vordergrundaufgabe entweder durch den Benutzer oder vom System beendet wird, wird auch die Hintergrundaufgabe beendet.If the foreground task is shut down, either by the user or the system, the background task will also shut down.

Beachten Sie jedoch, dass dies nicht bedeutet, dass der Vordergrund vom Hintergrund abhängig ist.However, note that this does not mean that the foreground is dependent on the background. Wenn die Hintergrundaufgabe beendet wird, wird dadurch nicht erzwungen, dass auch die Vordergrundaufgabe beendet wird.If the background task is shut down, this does not force the foreground task to shut down.

In der folgenden Tabelle ist aufgeführt, welche Richtlinie auf welchen Gerätetypen erzwungen werden.The following table lists the which policies are enforced on which device types.

UnterrichtlinieSub-policy DesktopDesktop MobileMobile SonstigesOther
ExklusivitätExclusivity DisabledDisabled AktiviertEnabled AktiviertEnabled
Inaktivitäts TimeoutInactivity Timeout DisabledDisabled AktiviertEnabled DisabledDisabled
Freigegebene LebensdauerShared Lifetime AktiviertEnabled DisabledDisabled DisabledDisabled