다음을 통해 공유


시스템 미디어 전송 컨트롤과 통합

이 문서에서는 SMTC(시스템 미디어 전송 제어)와 상호 작용하는 방법을 설명합니다. SMTC는 모든 Windows 10 디바이스에 공통적이고 사용자가 재생에 MediaPlayer를 사용하는 모든 실행 중인 앱에 대한 미디어 재생을 제어하는 일관된 방법을 제공하는 컨트롤 집합입니다.

시스템 미디어 전송 컨트롤을 사용하면 미디어 애플리케이션 개발자가 기본 제공 시스템 UI와 통합되어 아티스트, 앨범 제목 또는 챕터 제목과 같은 미디어 메타데이터를 표시할 수 있습니다. 또한 시스템 전송 컨트롤을 사용하면 재생 일시 중지 및 재생 목록에서 앞뒤로 건너뛰는 등의 기본 제공 시스템 UI를 사용하여 미디어 앱의 재생을 제어할 수 있습니다.

시스템 미디어 트랜스포트 컨트롤

SMTC와의 통합을 보여 주는 전체 샘플은 github의 System Media Tranport Controls 샘플을 참조하세요.

SMTC와 자동 통합

Windows 10 버전 1607부터 MediaPlayer 클래스를 사용하여 미디어를 재생하는 UWP 앱은 기본적으로 SMTC(시스템 미디어 전송 컨트롤)와 자동으로 통합됩니다. MediaPlayer의 새 인스턴스를 인스턴스화하고 MediaSource, MediaPlaybackItem, 또는 MediaPlaybackList를 플레이어의 소스 속성에 할당하면 사용자는 SMTC에서 앱 이름을 볼 수 있으며 SMTC 컨트롤을 사용하여 재생 목록을 재생, 일시 중지 및 이동할 수 있습니다.

앱은 한 번에 여러 MediaPlayer개체를 만들고 사용할 수 있습니다. 앱의 각 활성 MediaPlayer 인스턴스에 대해 사용자가 활성 미디어 플레이어와 실행 중인 다른 앱 간에 전환할 수 있도록 SMTC에 별도의 탭이 만들어집니다. SMTC에서 현재 선택된 미디어 플레이어 중 컨트롤이 영향을 주는 미디어 플레이어입니다.

XAML 페이지의 MediaPlayerElement에 바인딩하는 등 앱에서 MediaPlayer를 사용하는 방법에 대한 자세한 내용은 MediaPlayer를 사용하여 오디오 및 비디오 재생을 참조하세요.

MediaSource, MediaPlaybackItem, 및 MediaPlaybackList 작업에 대한 자세한 내용은 미디어 항목, 재생 목록 및 트랙을 참조하세요 .

SMTC에서 표시할 메타데이터 추가

비디오 또는 노래 제목과 같이 SMTC의 미디어 항목에 대해 표시되는 메타데이터를 추가하거나 수정하려면 미디어 항목을 나타내는 MediaPlaybackItem의 표시 속성을 업데이트해야 합니다. 먼저 GetDisplayProperties를 호출하여 MediaItemDisplayProperties 개체에 대한 참조를 가져옵니다. 다음으로 Type 속성이 있는 항목에 대한 미디어, 음악 또는 비디오의 형식을 설정합니다. 그런 다음 지정한 미디어 유형에 따라 MusicProperties 또는 VideoProperties의 필드를 채울 수 있습니다. 마지막으로 ApplyDisplayProperties를 호출하여 미디어 항목의 메타데이터를 업데이트합니다.

MediaItemDisplayProperties props = mediaPlaybackItem.GetDisplayProperties();
props.Type = Windows.Media.MediaPlaybackType.Video;
props.VideoProperties.Title = "Video title";
props.VideoProperties.Subtitle = "Video subtitle";
props.VideoProperties.Genres.Add("Documentary");
mediaPlaybackItem.ApplyDisplayProperties(props);
props = mediaPlaybackItem.GetDisplayProperties();
props.Type = Windows.Media.MediaPlaybackType.Music;
props.MusicProperties.Title = "Song title";
props.MusicProperties.Artist = "Song artist";
props.MusicProperties.Genres.Add("Polka");
mediaPlaybackItem.ApplyDisplayProperties(props);

참고 항목

앱은 시스템 미디어 전송 컨트롤에서 표시할 다른 미디어 메타데이터를 제공하지 않더라도 Type 속성에 대한 값을 설정해야 합니다. 이 값을 사용하면 재생하는 동안 화면 보호기를 활성화하는 것을 방지하는 등 시스템에서 미디어 콘텐츠를 올바르게 처리할 수 있습니다.

CommandManager를 사용하여 기본 SMTC 명령을 수정하거나 재정의합니다.

앱은 MediaPlaybackCommandManager 클래스를 사용하여 SMTC 컨트롤의 동작을 수정하거나 완전히 재정의할 수 있습니다. CommandManager 속성에 액세스하여 MediaPlayer 클래스의 각 인스턴스에 대해 명령 관리자 인스턴스를 가져올 수 있습니다.

기본적으로 MediaPlaybackList의 다음 항목으로 건너뛰는 Next 명령과 같은 모든 명령에 대해 명령 관리자는 NextReceived와 같은 수신된 이벤트와 NextBehavior와 같은 명령의 동작을 관리하는 개체를 노출합니다.

다음 예제에서는 NextReceived 이벤트 및 NextBehaviorIsEnabledChanged 이벤트에 대한 처리기를 등록합니다.

_mediaPlayer.CommandManager.NextReceived += CommandManager_NextReceived;
_mediaPlayer.CommandManager.NextBehavior.IsEnabledChanged += NextBehavior_IsEnabledChanged;

다음 예제에서는 사용자가 재생 목록에서 5개 항목을 클릭한 후 앱이 Next 명령을 사용하지 않도록 설정하려는 시나리오를 보여 줍니다. 콘텐츠를 계속 재생하기 전에 일부 사용자 상호 작용이 필요한 경우 NextReceived 이벤트가 발생할 때마다 카운터가 증가합니다. 카운터가 대상 번호에 도달하면 Next 명령의 EnablingRuleNever로 설정되어 명령을 사용하지 않도록 설정합니다.

int _nextPressCount = 0;
private void CommandManager_NextReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerNextReceivedEventArgs args)
{
    _nextPressCount++;
    if (_nextPressCount > 5)
    {
        sender.NextBehavior.EnablingRule = MediaCommandEnablingRule.Never;
        // Perform app tasks while the Next button is disabled
    }
}

명령을 Always로 설정할 수도 있습니다. 즉, Next 명령 예제의 경우 재생 목록에 항목이 더 이상 없더라도 명령이 항상 사용하도록 설정됩니다. 또는 명령을 Auto로 설정할 수 있습니다. 여기서 시스템은 현재 재생 중인 콘텐츠에 따라 명령을 사용하도록 설정해야 하는지 여부를 결정합니다.

위에서 설명한 시나리오의 경우 어떤 시점에서 앱은 Next 명령을 다시 사용하도록 설정하고 EnablingRuleAuto로 설정하여 이 작업을 수행합니다.

_mediaPlayer.CommandManager.NextBehavior.EnablingRule = MediaCommandEnablingRule.Auto;
_nextPressCount = 0;

앱에는 포그라운드에 있는 동안 재생을 제어하기 위한 자체 UI가 있을 수 있으므로 IsEnabledChanged 이벤트를 사용하여 처리기에 전달된 MediaPlaybackCommandManagerCommandBehaviorIsEnabled에 액세스하여 명령이 사용되거나 비활성화될 때 SMTC와 일치하도록 사용자 고유의 UI를 업데이트할 수 있습니다.

private void NextBehavior_IsEnabledChanged(MediaPlaybackCommandManagerCommandBehavior sender, object args)
{
    MyNextButton.IsEnabled = sender.IsEnabled;
}

경우에 따라 SMTC 명령의 동작을 완전히 재정의하는 것이 좋습니다. 아래 예제에서는 앱이 현재 재생 목록의 트랙 사이를 건너뛰는 대신 다음이전 명령을 사용하여 인터넷 라디오 방송국 간에 전환하는 시나리오를 보여 줍니다. 이전 예제와 같이 명령이 수신될 때 처리기가 등록됩니다. 이 경우 PreviousReceived 이벤트입니다.

_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;

PreviousReceived 처리기에서 먼저 처리기에 전달된 MediaPlaybackCommandManagerPreviousReceivedEventArgsGetDeferral을 호출하여 Deferral을 가져옵니다. 이렇게 하면 명령을 실행하기 전에 지연이 완료될 때까지 대기하도록 시스템에 지시합니다. 처리기에서 비동기 호출을 수행하려는 경우 매우 중요합니다. 이 시점에서 예제에서는 이전 라디오 방송국을 나타내는 MediaPlaybackItem을 반환하는 사용자 지정 메서드를 호출합니다.

다음으로 Handled 속성은 다른 처리기에서 이벤트가 아직 처리되지 않았는지 확인하기 위해 검사. 그렇지 않은 경우, Handled 속성이 True로 설정된 경우. 이를 통해 SMTC 및 다른 구독된 처리기는 이미 처리되었으므로 이 명령 실행을 위한 조치를 취하지 않아도 된다는 것을 알 수 있습니다. 그런 다음 코드는 미디어 플레이어의 새 소스를 설정하고 플레이어를 시작합니다.

마지막으로, 지연 개체에서 Complete를 호출하여 명령 처리를 완료했음을 시스템에 알립니다.

private async void CommandManager_PreviousReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerPreviousReceivedEventArgs args)
{
    var deferral = args.GetDeferral();
    MediaPlaybackItem mediaPlaybackItem = await GetPreviousStation();

    if(args.Handled != true)
    {
        args.Handled = true;
        sender.MediaPlayer.Source = mediaPlaybackItem;
        sender.MediaPlayer.Play();
    }
    deferral.Complete();
}

SMTC 수동 제어

이 문서의 앞에서 멘션 SMTC는 앱이 만드는 MediaPlayer의 모든 인스턴스에 대한 정보를 자동으로 검색하고 표시합니다. MediaPlayer의 여러 인스턴스를 사용하지만 SMTC가 앱에 단일 항목을 제공하려는 경우 자동 통합에 의존하는 대신 SMTC의 동작을 수동으로 제어해야 합니다. 또한 MediaTimelineController를 사용하여 하나 이상의 미디어 플레이어를 제어하는 경우 수동 SMTC 통합을 사용해야 합니다. 또한 앱이 AudioGraph 클래스와 같은 MediaPlayer 이외의 API를 사용하여 미디어를 재생하는 경우 사용자가 SMTC를 사용하여 앱을 제어할 수 있도록 수동 SMTC 통합을 구현해야 합니다. SMTC를 수동으로 제어하는 방법에 대한 자세한 내용은 시스템 미디어 전송 컨트롤의 수동 제어를 참조하세요.