레거시 백그라운드 미디어 재생

이 문서에서는 UWP 앱에 백그라운드 오디오 지원을 추가하기 위한 레거시 2프로세스 모델에 대해 설명합니다. Windows 10 버전 1607부터 훨씬 간단하게 구현할 수 있는 백그라운드 오디오용 단일 프로세스 모델입니다. 백그라운드 오디오에 대한 현재 권장 사항에 대한 자세한 내용은 백그라운드에서 미디어 재생을 참조하세요. 이 문서는 레거시 2 프로세스 모델을 사용하여 이미 개발된 앱에 대한 지원을 제공하기 위한 것입니다.

참고 항목

Windows 버전 1703부터 BackgroundMediaPlayer는 더 이상 사용되지 않으며 Windows의 이후 버전에서 사용하지 못할 수도 있습니다.

배경 오디오 아키텍처

백그라운드 재생을 수행하는 앱은 두 개의 프로세스로 구성됩니다. 첫 번째 프로세스는 포그라운드에서 실행되는 앱 UI 및 클라이언트 논리를 포함하는 기본 앱입니다. 두 번째 프로세스는 모든 UWP 앱 백그라운드 작업처럼 IBackgroundTask를 구현하는 백그라운드 재생 작업입니다. 백그라운드 작업에는 오디오 재생 논리와 백그라운드 서비스가 포함됩니다. 백그라운드 작업은 시스템 미디어 전송 컨트롤을 통해 시스템과 통신합니다.

다음 다이어그램은 시스템을 설계하는 방법에 대한 개요입니다.

windows 10 background audio architecture

MediaPlayer

Windows.Media.Playback 네임스페이스에는 백그라운드에서 오디오를 재생하는 데 사용되는 API가 포함되어 있습니다. 재생이 발생하는 앱당 MediaPlayer의 단일 인스턴스가 있습니다. 백그라운드 오디오 앱은 MediaPlayer 클래스에서 메서드를 호출하고 속성을 설정하여 현재 트랙을 설정하고, 재생을 시작하고, 일시 중지하고, 빨리 감기, 되감기 등을 설정합니다. 미디어 플레이어 개체 인스턴스는 항상 BackgroundMediaPlayer.Current 속성을 통해 액세스됩니다.

MediaPlayer 프록시 및 스텁

앱의 백그라운드 프로세스에서 BackgroundMediaPlayer.Current에 액세스하면 MediaPlayer 인스턴스가 백그라운드 작업 호스트에서 활성화되고 직접 조작할 수 있습니다.

BackgroundMediaPlayer.Current가 포그라운드 애플리케이션에서 액세스되면 반환되는 MediaPlayer인스턴스는 실제로 백그라운드 프로세스의 스텁과 통신하는 프록시입니다. 이 스텁은 백그라운드 프로세스에서도 호스트되는 실제 MediaPlayer 인스턴스와 통신합니다.

백그라운드 프로세스에서만 액세스할 수 있는 MediaPlayer.SourceMediaPlayer.SystemMediaTransportControls를 제외하고 포그라운드 및 백그라운드 프로세스 모두 MediaPlayer 인스턴스의 대부분의 속성에 액세스할 수 있습니다. 포그라운드 앱과 백그라운드 프로세스는 모두 MediaOpened, MediaEnded, 및 MediaFailed와 같은 미디어 관련 이벤트에 대한 알림을 받을 수 있습니다.

재생 목록

백그라운드 오디오 애플리케이션의 일반적인 시나리오는 여러 항목을 연속으로 재생하는 것입니다. MediaPlaybackList 개체를 사용하여 백그라운드 프로세스에서 가장 쉽게 수행할 수 있습니다. MediaPlayer.Source 속성에 할당하여 MediaPlayer에서 원본으로 설정할 수 있습니다.

백그라운드 프로세스에서 설정된 포그라운드 프로세스에서 MediaPlaybackList에 액세스할 수 없습니다.

시스템 미디어 전송 컨트롤

사용자는 Bluetooth 디바이스, SmartGlass 및 시스템 미디어 전송 컨트롤과 같은 수단을 통해 앱의 UI를 직접 사용하지 않고 오디오 재생을 제어할 수 있습니다. 백그라운드 작업은 SystemMediaTransportControls 클래스를 사용하여 사용자가 시작한 시스템 이벤트를 구독합니다.

백그라운드 프로세스 내에서 SystemMediaTransportControls 인스턴스를 얻으려면 MediaPlayer.SystemMediaTransportControls 속성을 사용합니다. 포그라운드 앱은 SystemMediaTransportControls.GetForCurrentView를 호출하여 클래스의 인스턴스를 얻지만 반환되는 인스턴스는 백그라운드 작업과 관련이 없는 포그라운드 전용 인스턴스입니다.

작업 간에 메시지 보내기

백그라운드 오디오 앱의 두 프로세스 간에 통신하려는 경우가 있습니다. 예를 들어 새 트랙이 재생되기 시작할 때 백그라운드 작업이 포그라운드 작업에 알리고 새 노래 제목을 포그라운드 작업으로 보내 화면에 표시하도록 할 수 있습니다.

간단한 통신 메커니즘은 포그라운드 및 백그라운드 프로세스 모두에서 이벤트를 발생합니다. SendMessageToForegroundSendMessageToBackground 메서드는 각각 해당 프로세스에서 이벤트를 호출합니다. MessageReceivedFromBackgroundMessageReceivedFromForeground 이벤트를 구독하여 메시지를 받을 수 있습니다.

데이터는 메시지 보내기 메서드에 인수로 전달된 다음 메시지 수신 이벤트 처리기에 전달될 수 있습니다. ValueSet 클래스를 사용하여 데이터를 전달합니다. 이 클래스는 문자열을 키로 포함하고 다른 값 형식을 값으로 포함하는 사전입니다. 정수, 문자열 및 부울과 같은 단순 값 형식을 전달할 수 있습니다.

백그라운드 작업 수명 주기

백그라운드 작업의 수명은 앱의 현재 재생 상태 밀접하게 연결됩니다. 예를 들어 사용자가 오디오 재생을 일시 중지하면 상황에 따라 시스템이 앱을 종료하거나 취소할 수 있습니다. 오디오 재생 없이 일정 시간이 지나면 시스템에서 백그라운드 작업을 자동으로 종료할 수 있습니다.

IBackgroundTask.Run 메서드는 앱이 포그라운드 앱에서 실행되는 코드에서 BackgroundMediaPlayer.Current에 처음 액세스하거나 MessageReceivedFromBackground 이벤트에 대한 처리기를 등록할 때 호출됩니다. 백그라운드 프로세스에서 보낸 메시지를 포그라운드 앱이 놓치지 않도록 BackgroundMediaPlayer.Current를 처음으로 호출하기 전에 받은 메시지 처리기에 등록하는 것이 좋습니다.

백그라운드 작업을 활성 상태로 유지하려면 앱이 Run 메서드 내에서 BackgroundTaskDeferral을 요청하고 작업 인스턴스가 Canceled 또는 Completed 이벤트를 수신할 때 BackgroundTaskDeferral.Complete를 호출해야 합니다. 리소스를 사용하고 앱의 백그라운드 작업이 시스템에 의해 종료될 수 있으므로 Run 메서드에서 반복하거나 기다리지 마세요.

Run 메서드가 완료되고 지연이 요청되지 않은 경우 백그라운드 작업이 Completed 이벤트를 가져옵니다. 경우에 따라 앱이 Canceled 이벤트를 가져오면 Completed 이벤트가 뒤따를 수도 있습니다. Run이 실행되는 동안 작업이 Canceled 이벤트를 받을 수 있으므로 이 잠재적 동시성을 관리해야합니다.

백그라운드 작업을 취소할 수 있는 상황은 다음과 같습니다.

  • 오디오 재생 기능이 있는 새 앱은 독점 하위 정책을 적용하는 시스템에서 시작됩니다. 아래의 백그라운드 오디오 작업 수명에 대한 시스템 정책 섹션을 참조하세요.

  • 백그라운드 작업이 시작되었지만 음악이 아직 재생되지 않고 포그라운드 앱이 일시 중단됩니다.

  • 수신 전화 또는 VoIP 통화와 같은 기타 미디어 중단

백그라운드 작업을 예고 없이 종료할 수 있는 상황은 다음과 같습니다.

  • VoIP 호출이 들어왔는데 시스템에 백그라운드 작업을 유지할 수 있는 메모리가 충분하지 않습니다.

  • 리소스 정책을 위반했습니다.

  • 작업 취소 또는 완료가 정상적으로 종료되지 않습니다.

백그라운드 오디오 작업 수명에 대한 시스템 정책

다음 정책은 시스템에서 백그라운드 오디오 작업의 수명을 관리하는 방법을 결정하는 데 도움이 됩니다.

독점

이 하위 정책을 사용하도록 설정하면 백그라운드 오디오 작업의 수가 지정된 시간에 최대 1개로 제한됩니다. 모바일 및 기타 비 데스크톱 SKU에서 사용하도록 설정됩니다.

비활성 시간 제한

리소스 제약으로 인해 일정 기간 동안 활동이 없으면 시스템에서 백그라운드 작업을 종료할 수 있습니다

다음 조건이 모두 충족되면 백그라운드 작업은 "비활성"으로 간주됩니다.

  • 포그라운드 앱이 표시되지 않습니다(일시 중단 또는 종료됨).

  • 백그라운드 미디어 플레이어가 재생 상태가 아닙니다.

이러한 두 조건이 모두 충족되면 백그라운드 미디어 시스템 정책에서 타이머가 시작됩니다. 타이머가 만료될 때 두 조건이 모두 변경되지 않으면 백그라운드 미디어 시스템 정책이 백그라운드 작업을 종료합니다.

공유 수명

이 하위 정책을 사용하도록 설정하면 백그라운드 작업이 포그라운드 작업의 수명에 종속됩니다. 사용자 또는 시스템에 의해 포그라운드 작업이 종료되면 백그라운드 작업도 종료됩니다.

그러나 이것이 포그라운드가 백그라운드에 의존한다는 것을 의미하지는 않습니다. 백그라운드 작업이 종료된 경우 포그라운드 작업이 강제로 종료되지는 않습니다.

다음 표에서는 디바이스 유형에 적용되는 정책을 나열합니다.

하위 정책 데스크톱 모바일 기타
독점 사용 안 함 사용 사용
비활성 시간 제한 사용 안 함 사용 사용 안 함
공유 수명 사용 사용 안 함 사용 안 함