정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

시스템 미디어 전송 컨트롤을 사용하는 방법(XAML)

Applies to Windows and Windows Phone

SystemMediaTransportControls 클래스를 사용하면 앱이 Windows에서 제공하는 시스템 미디어 전송 컨트롤을 사용하고 표시되는 미디어 정보를 업데이트할 수 있습니다.

전체 미디어 재생 샘플의 일부로 이 기능의 작동을 확인하려면 미디어 재생 전체 프로세스를 참조하세요.

소개

Windows 8.1에서 도입된 SystemMediaTransportControls 클래스는 이전 MediaControl 클래스를 대체합니다. MediaControl 대신 새 SystemMediaTransportControls를 사용해야 합니다.

시스템 전송 컨트롤은 MediaElement 개체의 전송 컨트롤과 다릅니다. 시스템 전송 컨트롤은 헤드폰 볼륨 컨트롤, 키보드의 미디어 단추 등 하드웨어 미디어 키를 누를 때 팝업되는 컨트롤입니다. 사용자가 키보드에서 Pause 키를 누를 경우 앱이 SystemMediaTransportControls를 지원하면 앱이 알림을 받고 적절한 조치를 취할 수 있습니다.

앱은 또한 SystemMediaTransportControls가 표시하는 곡 제목 및 미리 보기 이미지 등의 미디어 정보를 업데이트할 수 있습니다.

전송 컨트롤 설정

SystemMediaTransportControls의 인스턴스를 가져오려면 GetForCurrentView를 호출합니다.

앱에서 처리할 단추를 사용하도록 설정하려면 SystemMediaTransportControls 개체에서 해당 "is enabled" 속성(예: IsPlayEnabled, IsPauseEnabled, IsNextEnabled, IsPreviousEnabled)을 설정합니다. 전체 목록을 보려면 SystemMediaTransportControls 참조 설명서를 참조하세요.

다음은 MediaElement 개체를 만들고 SystemMediaTransportControls를 설정하는 일부 코드입니다. 이 코드는 재생 및 일시 중지 단추를 사용하도록 설정하고 ButtonPressed 이벤트의 이벤트 처리기를 추가합니다. 이 예제의 뒷부분에는 MediaOpenedCurrentStateChanged의 이벤트 처리기가 표시됩니다.


<MediaElement x:Name="musicPlayer" 
              Source="Music/music1.mp3"
              CurrentStateChanged="MusicPlayer_CurrentStateChanged"
              MediaOpened="MusicPlayer_MediaOpened"/>



SystemMediaTransportControls systemControls;

public MainPage()
{
    this.InitializeComponent();

    // Hook up app to system transport controls.
    systemControls = SystemMediaTransportControls.GetForCurrentView();
    systemControls.ButtonPressed += SystemControls_ButtonPressed;

    // Register to handle the following system transpot control buttons.
    systemControls.IsPlayEnabled = true;
    systemControls.IsPauseEnabled = true;
}


전송 컨트롤과 통신

전송 컨트롤을 사용할 때 통신은 다음 세 단계로 이루어집니다.

설정된 단추 중 하나를 누르면 SystemMediaTransportControlsButtonPressed 이벤트를 통해 앱에 알립니다. 그러면 앱은 어떤 단추를 눌렀는지에 따라 일시 중지 또는 재생 등과 같이 미디어를 제어할 수 있습니다.

미디어 상태가 변경되면 앱은 PlaybackStatus 속성을 통해 SystemMediaTransportControls에 알립니다. 그러면 전송 컨트롤은 미디어 원본의 상태와 동일하게 단추 상태를 업데이트할 수 있습니다.

SystemMediaTransportControlsDisplayUpdater를 사용하여 전송 컨트롤이 표시하는 미디어 정보(예: 곡 제목 또는 앨범 아트)를 업데이트할 수 있습니다.

단추 누름 처리

설정된 단추 중 하나를 누르면 시스템 전송 컨트롤에 의해 ButtonPressed 이벤트가 발생합니다. SystemMediaTransportControlsButtonPressedEventArgsButton 속성은 어떤 단추를 눌렀는지 지정합니다.

ButtonPressed 이벤트 처리기에서 UI 스레드의 개체(예: MediaElement 개체)를 업데이트하려면 CoreDispatcher를 통해 호출을 마샬링해야 합니다. 이는 ButtonPressed 이벤트 처리기가 UI 스레드에서 호출되지 않기 때문입니다. 또한 UI 스레드만 UI 스레드의 개체를 수정할 수 있습니다. UI가 아닌 스레드에서 UI 개체를 수정하려고 하면 예외가 발생합니다. 아래 코드 예제는 이 작업을 수행하는 방법을 보여 줍니다.

다음은 ButtonPressed 이벤트 처리기 및 MediaElement를 재생하고 일시 중지하는 도우미 메서드를 만드는 일부 코드입니다. PlayPause 호출이 Dispatcher.RunAsync를 사용하여 CoreDispatcher를 통해 UI 스레드로 마샬링되는 것을 알 수 있습니다.


void SystemControls_ButtonPressed(SystemMediaTransportControls sender, 
    SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            PlayMedia();
            break;
        case SystemMediaTransportControlsButton.Pause:
            PauseMedia();
            break;
        default:
            break;
    }
}

async void PlayMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Play();
    });
}

async void PauseMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Pause();
    });
}


미디어 상태 업데이트

SystemMediaTransportControls에 미디어의 상태가 변경된 것을 알리려면 PlaybackStatus를 적절한 MediaPlaybackStatus 값으로 설정합니다.

업데이트 알림을 처리할 수 있는 좋은 위치는 미디어 상태가 변경될 때 발생하는 MediaElementCurrentStateChanged 이벤트입니다.

다음은 CurrentStateChanged 이벤트 처리기를 처리하고 SystemMediaTransportControlsPlaybackStatus 속성을 업데이트하는 코드입니다.


void MusicPlayer_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (musicPlayer.CurrentState)
    {
        case MediaElementState.Playing:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}


미디어 정보 및 미리 보기 업데이트

SystemMediaTransportControlsDisplayUpdater 클래스를 사용하여 전송 컨트롤이 표시하는 미디어 정보(예: 곡 제목 또는 앨범 아트)를 업데이트할 수 있습니다.

DisplayUpdater 속성은 SystemMediaTransportControls와 연결된 SystemMediaTransportControlsDisplayUpdater입니다.

MusicProperties, ImageProperties 또는 VideoProperties의 미디어 속성을 설정하여 메타데이터를 수동으로 업데이트할 수 있습니다. 그러나 파일에서 메타데이터 및 미리 보기 이미지를 자동으로 추출하는 CopyFromFileAsync 메서드에 미디어 파일을 전달하는 것이 훨씬 쉽고 바람직합니다.

표시할 모든 미디어 정보를 설정했으면 Update를 호출합니다. Update를 호출하기 전에는 UI가 업데이트되지 않습니다.

Windows.Storage.StorageFileWindows.Storage.Streams.RandomAccessStreamReference는 미디어 정보로 작업할 때 유용한 정적 메서드를 제공합니다.

StorageFile

RandomAccessStreamReference

다음은 음악 파일의 곡 메타데이터를 업데이트하고 미리 보기 이미지를 업데이트하는 일부 코드입니다. MediaOpened 이벤트 처리기는 업데이트를 시작하는 도우미 메서드를 호출하는 데 사용됩니다. 이 예제는 앱에 포함된 미디어 파일로 하드 코드되었습니다. 실제 앱에서는 네트워크 또는 로컬 파일 시스템에서 미디어 파일을 가져올 수 있으며, 이 경우 파일과 스트림 개체를 가져오는 데 GetFileFromPathAsync, CreateFromStreamCreateFromFile이 더 유용할 수 있습니다.


async private void UpdateSongInfo()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Get the music file and pass it to CopyFromFileAsync to extract the metadata
    // and thumbnail. StorageFile is defined in Windows.Storage
    StorageFile musicFile =
        await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Music/music1.mp3"));
    
    await updater.CopyFromFileAsync(MediaPlaybackType.Music, musicFile);

    // Update the system media transport controls
    updater.Update();
}

void MusicPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
    UpdateSongInfo();
}


다음은 메타데이터와 미리 보기를 수동으로 업데이트하는 방법을 보여 주는 코드입니다.


/// <summary>
/// Shows how to update the media metadata and thumbnail manually.
/// Normally you would probably retreive this info from a source such as a database
/// but for this simple sample we'll just set the metadata with strings.
/// </summary>
void UpdateSongInfoManually()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Music metadata.
    updater.MusicProperties.AlbumArtist = "artist";
    updater.MusicProperties.AlbumArtist = "album artist";
    updater.MusicProperties.Title = "song title";

    // Set the album art thumbnail.
    // RandomAccessStreamReference is defined in Windows.Storage.Streams
    updater.Thumbnail =
       RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Music/music1_AlbumArt.jpg"));

    // Update the system media transport controls.
    updater.Update();
}


백그라운드 오디오

오디오를 백그라운드에서 재생하려면 앱은 IsPlayEnabledIsPauseEnabledtrue로 설정하여 재생 및 일시 중지 단추를 사용하도록 설정해야 합니다. 앱은 또한 ButtonPressed 이벤트를 처리해야 합니다. 오디오를 백그라운드에서 재생하기 위한 모든 요구 사항을 보려면 백그라운드에서 오디오를 재생하는 방법을 참조하세요.

전체 코드 목록

다음은 이 항목에 표시된 모든 코드 조각에 대한 전체 코드 목록입니다.


<MediaElement x:Name="musicPlayer" 
              Source="Music/music1.mp3"
              CurrentStateChanged="MusicPlayer_CurrentStateChanged"
              MediaOpened="MusicPlayer_MediaOpened"/>



SystemMediaTransportControls systemControls;

public MainPage()
{
    this.InitializeComponent();

    // Hook up app to system transport controls.
    systemControls = SystemMediaTransportControls.GetForCurrentView();
    systemControls.ButtonPressed += SystemControls_ButtonPressed;

    // Register to handle the following system transpot control buttons.
    systemControls.IsPlayEnabled = true;
    systemControls.IsPauseEnabled = true;
}

void MusicPlayer_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (musicPlayer.CurrentState)
    {
        case MediaElementState.Playing:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}

void SystemControls_ButtonPressed(SystemMediaTransportControls sender, 
    SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            PlayMedia();
            break;
        case SystemMediaTransportControlsButton.Pause:
            PauseMedia();
            break;
        default:
            break;
    }
}

async void PlayMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Play();
    });
}

async void PauseMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Pause();
    });
}

async private void UpdateSongInfo()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Get the music file and pass it to CopyFromFileAsync to extract the metadata
    // and thumbnail. StorageFile is defined in Windows.Storage
    StorageFile musicFile =
        await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Music/music1.mp3"));
    
    await updater.CopyFromFileAsync(MediaPlaybackType.Music, musicFile);

    // Update the system media transport controls
    updater.Update();
}

void MusicPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
    UpdateSongInfo();
}
/// <summary>
/// Shows how to update the media metadata and thumbnail manually.
/// Normally you would probably retreive this info from a source such as a database
/// but for this simple sample we'll just set the metadata with strings.
/// </summary>
void UpdateSongInfoManually()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Music metadata.
    updater.MusicProperties.AlbumArtist = "artist";
    updater.MusicProperties.AlbumArtist = "album artist";
    updater.MusicProperties.Title = "song title";

    // Set the album art thumbnail.
    // RandomAccessStreamReference is defined in Windows.Storage.Streams
    updater.Thumbnail =
       RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Music/music1_AlbumArt.jpg"));

    // Update the system media transport controls.
    updater.Update();
}


관련 항목

SystemMediaTransportControls 샘플
백그라운드에서 오디오를 재생하는 방법
빠른 시작: 동영상 및 오디오
미디어 재생 전체 프로세스

 

 

표시:
© 2014 Microsoft