백그라운드에서 미디어 재생

이 문서에서는 앱이 포그라운드에서 백그라운드로 이동할 때 미디어가 계속 재생되도록 앱을 구성하는 방법을 보여 줍니다. 즉, 사용자가 앱을 최소화하거나, 홈 화면으로 돌아가거나, 다른 방법으로 앱에서 멀리 이동한 후에도 앱에서 오디오를 계속 재생할 수 있습니다.

백그라운드 오디오 재생 시나리오는 다음과 같습니다.

  • 장기 실행 재생 목록: 사용자는 잠시 포그라운드 앱을 표시하여 재생 목록을 선택하고 시작하며, 그 후에는 재생 목록이 백그라운드에서 계속 재생되기를 기대합니다.

  • 작업 전환기 사용: 사용자가 포그라운드 앱을 잠시 표시하여 오디오 재생을 시작한 다음, 작업 전환기를 사용하여 다른 열린 앱으로 전환합니다. 사용자는 오디오가 백그라운드에서 계속 재생되도록 기대합니다.

이 문서에 설명된 백그라운드 오디오 구현을 통해 모바일, 데스크톱 및 Xbox를 비롯한 모든 Windows 장치에서 앱을 범용으로 실행할 수 있습니다.

참고 항목

이 문서의 코드는 UWP 백그라운드 오디오 샘플에서 조정되었습니다.

한 프로세스 모델에 대한 설명

Windows 10 버전 1607에서는 백그라운드 오디오를 사용하도록 설정하는 프로세스를 크게 간소화하는 새로운 단일 프로세스 모델이 도입되었습니다. 이전에는 앱이 포그라운드 앱 외에도 백그라운드 프로세스를 관리한 다음 두 프로세스 간에 상태 변경 내용을 수동으로 전달해야 했습니다. 새 모델에서는 단순히 백그라운드 오디오 기능을 앱 매니페스트에 추가하면 앱이 백그라운드로 이동할 때 자동으로 오디오 재생을 계속합니다. 두 개의 새 애플리케이션 수명 주기 이벤트인 EnteredBackgroundLeavingBackground는 백그라운드에서 들어오고 나가는 경우 앱에 알릴 수 있습니다. 앱이 백그라운드에서 전환으로 이동하면 시스템에서 적용하는 메모리 제약 조건이 변경될 수 있으므로 이러한 이벤트를 사용하여 현재 메모리 사용량을 검사 리소스를 확보하여 제한 이하로 유지할 수 있습니다.

복잡한 프로세스 간 통신 및 상태 관리를 제거함으로써 새 모델을 사용하면 코드가 크게 감소하여 백그라운드 오디오를 훨씬 더 빠르게 구현할 수 있습니다. 그러나 2 프로세스 모델은 이전 버전과의 호환성을 위해 현재 릴리스에서 계속 지원됩니다. 자세한 내용은 레거시 배경 오디오 모델을 참조하세요.

백그라운드 오디오에 대한 요구 사항

앱이 백그라운드에 있는 동안 오디오 재생에 대한 다음 요구 사항을 충족해야 합니다.

  • 이 문서의 뒷부분에서 설명한 대로 백그라운드 미디어 재생 기능을 앱 매니페스트에 추가합니다.
  • CommandManager.IsEnabled 속성을 false로 설정하는 것과 같이 앱이 MediaPlayer와 SMTC(시스템 미디어 전송 컨트롤)의 자동 통합을 사용하지 않도록 설정하는 경우 백그라운드 미디어 재생을 사용하도록 설정하려면 SMTC와의 수동 통합을 구현해야 합니다. 또한 앱이 백그라운드로 이동할 때 오디오가 계속 재생되도록 하려면 AudioGraph와 같은 MediaPlayer 이외의 API를 사용하는 경우 SMTC와 수동으로 통합해야 합니다. 최소 SMTC 통합 요구 사항은 시스템 미디어 전송 컨트롤 수동 제어의 "백그라운드 오디오에 시스템 미디어 전송 컨트롤 사용" 섹션에 설명되어 있습니다.
  • 앱이 백그라운드에 있는 동안 백그라운드 앱에 대해 시스템에서 설정한 메모리 사용량 제한을 유지해야 합니다. 백그라운드에서 메모리를 관리하기 위한 지침은 이 문서의 뒷부분에 나와 있습니다.

백그라운드 미디어 재생 매니페스트 기능

백그라운드 오디오를 사용하도록 설정하려면 앱 매니페스트 파일 Package.appxmanifest에 백그라운드 미디어 재생 기능을 추가해야 합니다.

매니페스트 디자이너를 사용하여 앱 매니페스트에 접근 권한 값을 추가하려면

  1. Microsoft Visual Studio의 솔루션 탐색기에서 package.appxmanifest 항목을 두 번 클릭하여 응용 프로그램 매니페스트 디자이너를 엽니다.
  2. 기능 탭을 선택합니다.
  3. 백그라운드 미디어 재생 검사 상자를 선택합니다.

앱 매니페스트 xml을 수동으로 편집하여 기능을 설정하려면 먼저 Package 요소에 uap3 네임스페이스 접두사를 정의해야 합니다. 그렇지 않은 경우 아래 그림과 같이 추가합니다.

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  IgnorableNamespaces="uap uap3 mp">

다음으로, Capabilities 요소에 backgroundMediaPlayback 기능을 추가합니다.

<Capabilities>
    <uap3:Capability Name="backgroundMediaPlayback"/>
</Capabilities>

전경과 배경 간 전환 처리

앱이 포그라운드에서 백그라운드 로 이동하면 EnteredBackground 이벤트가 발생합니다. 앱이 포그라운드로 돌아오면 LeavingBackground 이벤트가 발생합니다. 앱 수명 주기 이벤트이므로 앱을 만들 때 이러한 이벤트에 대한 처리기를 등록해야 합니다. 기본 프로젝트 템플릿에서 이는 App.xaml.cs App 클래스 생성자에 추가하는 것을 의미합니다.

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;

    this.EnteredBackground += App_EnteredBackground;
    this.LeavingBackground += App_LeavingBackground;
}

현재 백그라운드에서 실행 중인지 여부를 추적하는 변수를 만듭니다.

bool _isInBackgroundMode = false;

EnteredBackground 이벤트가 발생하면 추적 변수를 설정하여 현재 백그라운드에서 실행 중임을 나타냅니다. EnteredBackground 이벤트에서 장기 실행 작업을 수행하면 백그라운드로의 전환이 사용자에게 느리게 표시될 수 있으므로 수행해서는 안 됩니다.

private void App_EnteredBackground(object sender, EnteredBackgroundEventArgs e)
{
    _isInBackgroundMode = true;
}

LeavingBackground 이벤트 처리기에서 추적 변수를 설정하여 앱이 더 이상 백그라운드에서 실행되고 있지 않음을 나타내야 합니다.

private void App_LeavingBackground(object sender, LeavingBackgroundEventArgs e)
{
    _isInBackgroundMode = false;
}

메모리 관리 요구 사항

포그라운드와 백그라운드 간 전환을 처리하는 가장 중요한 부분은 앱에서 사용하는 메모리를 관리하는 것입니다. 백그라운드에서 실행하면 시스템에서 앱이 유지할 수 있는 메모리 리소스가 줄어들기 때문에 AppMemoryUsageIncreasedAppMemoryUsageLimitChanging 이벤트에도 등록해야 합니다. 이러한 이벤트가 발생하면 앱의 현재 메모리 사용량과 현재 제한을 검사 필요한 경우 메모리 사용량을 줄여야 합니다. 백그라운드에서 실행하는 동안 메모리 사용량을 줄이는 방법에 대한 자세한 내용은 앱이 백그라운드로 이동할 때 사용 가능한 메모리를 참조하세요.

백그라운드 미디어 앱의 네트워크 가용성

스트림 또는 파일에서 생성되지 않은 모든 네트워크 인식 미디어 원본은 원격 콘텐츠를 검색하는 동안 네트워크 연결을 활성 상태로 유지하고 그렇지 않은 경우 해제합니다. MediaStreamSource의 경우 특히 애플리케이션이 SetBufferedRange를 사용하여 올바른 버퍼 범위를 플랫폼에 정확하게 보고해야 합니다. 전체 콘텐츠가 완전히 버퍼링된 후 네트워크는 더 이상 앱을 대신하여 예약되지 않습니다.

미디어에서 다운로드하지 않을 때 백그라운드에서 발생하는 네트워크 호출을 만들려면 MaintenanceTrigger 또는 TimeTrigger와 같은 적절한 작업에 포함되어야 합니다. 자세한 내용은 백그라운드 작업을 이용한 앱 지원을 참조하세요.