내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 배경 오디오 재생 방법

2014-06-18

적용 대상: Windows Phone 8

 

이 항목에서는 앱이 더 이상 포그라운드에 없을 때도 오디오를 계속 재생하는 Windows Phone 앱을 만드는 방법을 설명합니다. 배경 오디오 앱의 유형에는 로컬 미디어를 재생하는 앱과 스트리밍 미디어를 재생하는 앱의 두 가지가 있습니다. 이 항목에서는 오디오 재생 에이전트를 사용하여 로컬 미디어를 재생하는 Windows Phone 앱 구현 방법을 설명합니다.

팁팁:

배경 오디오 앱 아키텍처에 대한 설명을 보려면 Windows Phone 8의 배경 오디오 개요를 참조하세요. 이 개요에는 앱에서 배경 오디오를 구현할 때 따라야 하는 모범 사례도 포함되어 있습니다.

Windows Phone 앱에서 배경 오디오를 구현하는 방법에 대한 예를 보려면 배경 오디오 플레이어 샘플배경 오디오 스트리머 샘플을 다운로드하세요.

이 항목에는 다음 단원이 포함되어 있습니다.

 

배경 오디오를 재생하려면 Visual Studio 의 Windows Phone 오디오 재생 에이전트 프로젝트 템플릿을 사용하는 프로젝트를 만듭니다. 그런 다음 앱의 기본 프로젝트에서 백그라운드 에이전트 프로젝트를 참조합니다.

배경 오디오 앱을 만들려면

  1. Visual Studio 에서 Windows Phone 앱  템플릿을 사용하여 새 C# 프로젝트를 만듭니다.

  2. 이름 상자에 프로젝트 이름을 입력한 다음 확인을 클릭합니다. 이 항목에서는 프로젝트 이름으로 BackgroundAudioPlayerSample을 사용합니다.

  3. 대상 Windows Phone OS 버전에서 Windows Phone OS 8.0을 클릭한 다음 확인을 클릭합니다.

오디오 파일을 추가하려면

  1. 솔루션 탐색기에서 앱 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 추가를 클릭한 다음 새 폴더를 클릭합니다. 폴더 이름을 Audio로 지정합니다.

  2. Audio 폴더를 마우스 오른쪽 버튼으로 클릭하고 추가를 클릭한 다음 기존 항목을 클릭합니다.

  3. 기존 항목 추가 대화 상자에서 음악 라이브러리의 MP3 음악 파일과 같은 오디오 파일 몇 개를 찾아 선택한 다음 추가를 클릭합니다. 배경 오디오 플레이어에서 사용할 수 있는 파일 형식에 대한 자세한 내용은 Windows Phone 8에 지원되는 미디어 코덱을 참조하세요.

  4. 솔루션 탐색기를 사용하여 Audio 폴더에서 방금 추가한 오디오 파일을 모두 선택합니다. 속성 창의 출력 디렉터리로 복사 상자에서 드롭다운 화살표를 클릭한 다음 변경된 내용만 복사를 클릭합니다.

    BackgroundAudioAddMedia

UI를 만들려면

  1. 솔루션 탐색기에서 MainPage.xaml을 두 번 클릭하여 디자이너에서 이 파일을 엽니다.

  2. 이름이 TitlePanelStackPanel 요소를 다음 XAML 코드로 바꿉니다.

    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="ApplicationTitle" Text="BACKGROUND AUDIO PLAYER" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="play a song" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>
    
  3. 이름이 ContentPanelGrid 요소를 다음 XAML 코드로 바꿉니다.

    <!--ContentPanel - place additional content here-->
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel Orientation="Horizontal" Width="420" Margin="18,40,18,0" VerticalAlignment="Top">
            <Button Content="prev" x:Name="prevButton" Height="140" Width="140" Click="prevButton_Click"/>
            <Button Content="play" x:Name="playButton" Height="140" Width="140" Click="playButton_Click"/>
            <Button Content="next" x:Name="nextButton" Height="140" Width="140" Click="nextButton_Click"/>
        </StackPanel>
        <TextBlock x:Name="txtCurrentTrack" Height="75" HorizontalAlignment="Left" Margin="12,193,0,0" VerticalAlignment="Top" Width="438" TextWrapping="Wrap" />
    </Grid>
    

    StackPanel은 버튼을 배열하는 데 편리한 요소입니다. 이 경우 Orientation 사용하여 가로 방향으로 정렬합니다.

  4. 이제 디자이너 뷰의 모습은 다음과 같습니다.

    BackgroundAudioUI

기본 페이지의 코드를 추가하려면

  1. 솔루션 탐색기에서 MainPage.xaml을 마우스 오른쪽 버튼으로 클릭한 다음 코드 보기를 클릭합니다.

  2. MainPage.xaml.cs 파일의 맨 위에 다음 using 문을 추가합니다.

    
    
    using Microsoft.Phone.BackgroundAudio;
    
  3. MainPage.xaml.cs의 MainPage 클래스에 다음 버튼 클릭 이벤트 처리기 코드를 추가합니다.

    #region Button Click Event Handlers
    
    private void prevButton_Click(object sender, RoutedEventArgs e)
    {
        BackgroundAudioPlayer.Instance.SkipPrevious();
    }
    
    private void playButton_Click(object sender, RoutedEventArgs e)
    {
        if (PlayState.Playing == BackgroundAudioPlayer.Instance.PlayerState)
        {
            BackgroundAudioPlayer.Instance.Pause();
        }
        else
        {
            BackgroundAudioPlayer.Instance.Play();
        }
    }
    
    private void nextButton_Click(object sender, RoutedEventArgs e)
    {
        BackgroundAudioPlayer.Instance.SkipNext();
    }
    
    #endregion Button Click Event Handlers
    

    playButton_Click 처리기는 현재의 재생 상태에 따라 재생일시 중지 사이를 실제로 전환합니다.

  4. MainPage 클래스의 생성자에서 PlayStateChanged 이벤트에 대한 이벤트 처리기를 추가합니다.

    BackgroundAudioPlayer.Instance.PlayStateChanged += new EventHandler(Instance_PlayStateChanged);
    
  5. Instance_PlayStateChanged 메서드를 다음과 같이 구현합니다.

    void Instance_PlayStateChanged(object sender, EventArgs e)
    {
        switch (BackgroundAudioPlayer.Instance.PlayerState)
        {
          case PlayState.Playing:
            playButton.Content = "pause";
            break;
    
          case PlayState.Paused:
          case PlayState.Stopped:
            playButton.Content = "play";
            break;
        }
    
        if (null != BackgroundAudioPlayer.Instance.Track)
        {
          txtCurrentTrack.Text = BackgroundAudioPlayer.Instance.Track.Title +
                                 " by " +
                                 BackgroundAudioPlayer.Instance.Track.Artist;
        }
    }
    
  6. 이 앱은 배경에서 오디오를 재생하므로 앱을 계속할 때 이미 오디오가 재생되고 있을 가능성이 큽니다. 앱 UI에서는 현재 재생 상태와 현재 재생 중인 트랙을 표시하여 이 상태를 나타냅니다.

    앱이 열릴 때 UI를 업데이트하려면 MainPage.xaml.cs의 MainPage 클래스에 다음 코드를 추가하여 OnNavigatedTo 가상 메서드를 재정의합니다.

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        if (PlayState.Playing == BackgroundAudioPlayer.Instance.PlayerState)
        {
            playButton.Content = "pause";
            txtCurrentTrack.Text = BackgroundAudioPlayer.Instance.Track.Title +
                             " by " +
                             BackgroundAudioPlayer.Instance.Track.Artist;
    
        }
        else
        {
            playButton.Content = "play";
            txtCurrentTrack.Text = "";
        }
    }
    

앱 초기화 코드를 추가하려면

  1. 솔루션 탐색기에서 App.xaml을 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭합니다.

  2. App.xaml.cs에 다음 using 문을 추가합니다.

    using System.IO.IsolatedStorage;
    using System.Windows.Resources;
    
  3. BackgroundAudioPlayer는 격리된 저장소 또는 원격 URI의 파일만 재생할 수 있습니다. App 클래스에 다음 메서드를 추가하여 앱의 설치 폴더에서 격리된 저장소로 오디오 파일을 복사합니다. 프로젝트에 추가한 오디오 파일의 실제 이름이 files 배열에 포함되어 있는지 확인합니다.

    private void CopyToIsolatedStorage()
    {
        using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            string[] files = new string[] { "Kalimba.mp3", "Maid with the Flaxen Hair.mp3", "Sleep Away.mp3" };
    
            foreach (var _fileName in files)
            {
                if (!storage.FileExists(_fileName))
                {
                    string _filePath = "Audio/" + _fileName;
                    StreamResourceInfo resource = Application.GetResourceStream(new Uri(_filePath, UriKind.Relative));
    
                    using (IsolatedStorageFileStream file = storage.CreateFile(_fileName))
                    {
                        int chunkSize = 4096;
                        byte[] bytes = new byte[chunkSize];
                        int byteCount;
    
                        while ((byteCount = resource.Stream.Read(bytes, 0, chunkSize)) > 0)
                        {
                            file.Write(bytes, 0, byteCount);
                        }
                    }
                }
            }
        }
    }
    
  4. App 클래스의 생성자에서 CopyToIsolatedStorage 메서드를 호출합니다.

    // Copy media to isolated storage.
    CopyToIsolatedStorage();
    

AudioPlayerAgent는 사용자가 다른 포그라운드 앱으로 전환할 때 백그라운드에서 계속 실행되는 앱의 일부입니다.

솔루션에 오디오 재생 에이전트 프로젝트를 추가하려면

  1. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 추가, 새 프로젝트를 차례로 클릭합니다.

  2. 새 프로젝트 추가 대화 상자에서 Windows Phone 오디오 재생 에이전트를 클릭합니다.

  3. 이름 상자에 프로젝트 이름을 입력한 다음 확인을 클릭합니다. 이 항목에서는 프로젝트 이름으로 MyAudioPlaybackAgent를 사용합니다.

  4. 대상 Windows Phone OS 버전에서 Windows Phone OS 8.0을 클릭한 다음 확인을 클릭합니다.

  5. 이제 솔루션에는 앱 프로젝트와 백그라운드 에이전트 프로젝트의 두 가지 프로젝트가 포함되어 있습니다.

    BackgroundAudioSolution
  6. 솔루션 탐색기의 앱 프로젝트에서 참조를 마우스 오른쪽 단추로 클릭한 다음 참조 추가를 클릭합니다.

  7. 참조 관리자 대화 상자에서 솔루션을 클릭한 다음 프로젝트를 클릭합니다. 앞에서 만든 배경 에이전트 프로젝트를 선택한 다음 열기를 클릭합니다.

오디오 플레이어 에이전트를 구현하려면

  1. 솔루션 탐색기에서 에이전트 프로젝트의 AudioPlayer.cs를 두 번 클릭하여 코드 편집기에서 이 파일을 엽니다.

  2. AudioPlayer.cs 맨 위에 다음 using 문을 추가합니다.

    using System.Collections.Generic;
    
  3. AudioPlayer.cs 파일에서 AudioPlayer 클래스의 클래스 범위 수준에서 정적 정수를 선언합니다. 이 변수는 현재의 트랙 번호를 유지합니다.

    // What's the current track?
    static int currentTrackNumber = 0;
    
  4. AudioPlayer.cs의 AudioPlayer 클래스에 다음 코드를 추가하여 트랙의 정적 목록을 만듭니다.

    // A playlist made up of AudioTrack items.
    private static List<AudioTrack> _playList = new List<AudioTrack>
    {
        new AudioTrack(new Uri("Kalimba.mp3", UriKind.Relative), 
                        "Kalimba", 
                        "Mr. Scruff", 
                        "Ninja Tuna", 
                        null),
    
        new AudioTrack(new Uri("Maid with the Flaxen Hair.mp3", UriKind.Relative), 
                        "Maid with the Flaxen Hair", 
                        "Richard Stoltzman", 
                        "Fine Music, Vol. 1", 
                        null),
    
        new AudioTrack(new Uri("Sleep Away.mp3", UriKind.Relative), 
                        "Sleep Away", 
                        "Bob Acri", 
                        "Bob Acri", 
                        null),
    
        // A remote URI
        new AudioTrack(new Uri("http://traffic.libsyn.com/wpradio/WPRadio_29.mp3", UriKind.Absolute), 
                        "Episode 29", 
                        "Windows Phone Radio", 
                        "Windows Phone Radio Podcast", 
                        null)
    };
    

    배경 에이전트를 호출할 때마다 재생 목록을 다시 만들지 않게 하려면 재생 목록을 static 클래스로 만드는 것이 중요합니다.

  5. 재생, 다음이전 버튼을 클릭하는 등의 사용자 동작을 처리하려면 AudioPlayer.cs의 AudioPlayer 클래스에 다음 세 개의 메서드를 추가합니다.

    private void PlayNextTrack(BackgroundAudioPlayer player)
    {
        if (++currentTrackNumber >= _playList.Count)
        {
            currentTrackNumber = 0;
        }
    
        PlayTrack(player);
    }
    
    private void PlayPreviousTrack(BackgroundAudioPlayer player)
    {
        if (--currentTrackNumber < 0)
        {
            currentTrackNumber = _playList.Count - 1;
        }
    
        PlayTrack(player);
    }
    
    private void PlayTrack(BackgroundAudioPlayer player)
    {
        if ((player.Track == null) || (player.Track.Title != _playList[currentTrackNumber].Title))
        {
            // If it's a new track, set the track
            player.Track = _playList[currentTrackNumber];
        }
    
        // Play it
        if ((player.Track != null) && (player.PlayerState != PlayState.Playing))
        {
            player.Play();
        }
    }
    
  6. 재생 상태 변경 사항을 처리하려면 다음 switch 문을 OnPlayStateChanged 메서드에 추가한 후 NotifyComplete를 호출합니다.

    switch (playState)
    {
        case PlayState.TrackEnded:
            PlayNextTrack(player);
            break;
    
        // Handle other PlayState changes here
    }
    
  7. 사용자 작업을 처리하려면 다음 switch 문을 OnUserAction 메서드에 추가한 후 NotifyComplete를 호출합니다.

    switch (action)
    {
      case UserAction.Play:
        PlayTrack(player);
        break;
    
      case UserAction.Pause:
        player.Pause();
        break;
    
      case UserAction.SkipPrevious:
        PlayPreviousTrack(player);
        break;
    
      case UserAction.SkipNext:
        PlayNextTrack(player);
        break;
    }
    

이 코드가 백그라운드에서 오디오를 재생하는 기본 앱을 구현하는 데 필요한 전부입니다. 이 앱은 잠금 화면 아래에서 실행되며 UVC(범용 볼륨 컨트롤)을 사용하여 재생을 제어합니다. 풍부한 UI 등의 더 많은 기능과 웹 URI를 사용한 원격 소스에서의 오디오 재생 지원을 오디오 파일에 추가할 수 있습니다. 또한 중지, 빨리 감기, 되감기 또는 검색 등의 사용자 작업에 대한 지원을 구현할 수 있습니다.

예시 앱을 테스트하려면

  1. 에뮬레이터에서 앱을 실행합니다.

  2. 앱의 기본 페이지에서 재생을 탭하여 첫 번째 노래를 재생합니다.

  3. F12 키를 두 번 눌러 잠금 화면에 들어갑니다. 범용 볼륨 컨트롤이 임시로 표시됩니다.

    Lock screen with universal volume control

    자세한 내용은 Windows Phone 8용 에뮬레이터에서 컴퓨터 키보드를 사용하는 방법을 참조하세요.

  4. 볼륨을 올리거나 내리고 UVC를 임시로 다시 표시하려면 F9 또는 F10을 누릅니다.

  5. 재생을 중지하려면 UVC를 표시하고 일시 중지 버튼을 누르거나 에뮬레이터를 닫습니다.

Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2014 Microsoft