このページは役に立ちましたか。
このページのコンテンツについての ご意見をお待ちしております
その他にご意見はありますか。
残り 1500 文字
MSDN ライブラリ
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 でバックグラウンド オーディオを再生する方法

2014/06/18

対象: Windows Phone 8

 

このトピックでは、フォアグラウンドで実行されなくなってもオーディオの再生を続ける Windows Phone アプリケーションを作成する方法を示します。バックグラウンド オーディオ アプリケーションには、ローカル メディアを再生するものと、ストリーミング メディアを再生するものの 2 種類があります。このトピックでは、オーディオ再生エージェントを使用してローカル メディアを再生する Windows Phone アプリケーションを実装する方法について説明します。

ヒントヒント:

バックグラウンド オーディオ アプリケーションのアーキテクチャについては、「Windows Phone 8 のバックグラウンド オーディオの概要」を参照してください。この概要には、アプリケーションのバックグラウンド オーディオ実装時に従う必要があるベスト プラクティスが記載されています。

Windows Phone アプリ内でバックグラウンド オーディオを実装する方法、バックグラウンド オーディオ プレーヤーのサンプル、およびバックグラウンド オーディオ ストリーマーのサンプルなどです。

このトピックは、次のセクションで構成されています。

 

バックグラウンド オーディオを再生するには、Visual Studio の [Windows Phone オーディオ再生エージェント] プロジェクト テンプレートを使用するプロジェクトを作成します。次に、アプリケーションのメイン プロジェクトからバックグラウンド エージェント プロジェクトを参照します。

バックグラウンド オーディオ アプリケーションを作成するには

  1. Visual Studio で Windows Phone アプリ  テンプレートを使って、新しい C# プロジェクトを作成します。

  2. [名前] ボックスにプロジェクト名を入力し、[OK] をクリックします。このトピックでは、BackgroundAudioPlayerSample というプロジェクト名を使用します。

  3. 対象の Windows Phone OS のバージョンについては、[Windows Phone OS 8.0] を選択し、[OK] をクリックします。

オーディオ ファイルを追加するには

  1. ソリューション エクスプローラーで、アプリケーション プロジェクトを右クリックし、[追加]、[新しいフォルダー] の順にクリックします。フォルダーに Audio という名前を付けます。

  2. Audio フォルダーを右クリックし、[追加]、[既存の項目] の順にクリックします。

  3. 複数のオーディオ ファイル (音楽ライブラリの MP3 音楽ファイルなど) を [既存項目の追加] ダイアログ ボックスで検索して選択し、[追加] をクリックします。バックグラウンド オーディオ プレイヤーで使用可能なファイル形式については、「Windows Phone 8 でサポートされるメディア コーデック」を参照してください。

  4. ソリューション エクスプローラーの Audio フォルダーで、追加したオーディオ ファイルをすべて選択します。[プロパティ] ペインの [出力ディレクトリにコピー] フィールドでドロップダウン矢印をクリックし、[新しい場合はコピーする] をクリックします。

    BackgroundAudioAddMedia

UI を作成するには

  1. ソリューション エクスプローラーで、MainPage.xaml をダブルクリックしてデザイナーで開きます。

  2. TitlePanel という名前の StackPanel 要素を次の 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. ContentPanel という名前の Grid 要素を次の 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. [名前] ボックスにプロジェクト名を入力し、[OK] をクリックします。このトピックでは、MyAudioPlaybackAgent というプロジェクト名を使用します。

  4. 対象の Windows Phone OS のバージョンについては、[Windows Phone OS 8.0] を選択し、[OK] をクリックします。

  5. これで、アプリケーション プロジェクトとバックグラウンド エージェント プロジェクトの 2 つのプロジェクトがソリューションに含まれるようになります。

    BackgroundAudioSolution
  6. ソリューション エクスプローラーのアプリケーション プロジェクトで、[参照設定] を右クリックし、[参照の追加] をクリックします。

  7. [参照マネージャー] ダイアログ ボックスで、[ソリューション] をクリックし、[プロジェクト] をクリックします。先ほど作成したバックグラウンド エージェント プロジェクトを選択し、[OK] をクリックします。

オーディオ プレイヤー エージェントを実装するには

  1. ソリューション エクスプローラーで、Agent プロジェクトの AudioPlayer.cs をダブルクリックして、ファイルをコード エディターで開きます。

  2. 次の using ステートメントを AudioPlayer.cs の先頭に追加します。

    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. [play]、[next]、[previous] ボタンをクリックするなどのユーザー操作を処理するには、AudioPlayer.cs の AudioPlayer クラスに次の 3 つのメソッドを追加します。

    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;
    }
    

オーディオをバックグラウンドで再生する基本的なアプリケーションの実装に必要なコードはこれですべてです。このアプリはロック画面の下で実行され、Universal Volume Control (UVC) が再生をコントロールします。リッチな UI、オーディオ ファイルへの Web URI を使用したリモート ソースからのオーディオ再生のサポートなど、さらに多くの機能を追加できます。また、停止、早送り、巻き戻し、検索などのユーザー操作のサポートも実装することができます。

サンプル アプリをテストするには

  1. エミュレーターでアプリを実行します。

  2. アプリのメイン ページで、[再生] をタップして、最初の曲を再生します。

  3. F12 キーを 2 回押して、ロック画面を有効にします。Universal Volume Control が一時的に表示されます。

    Lock screen with universal volume control

    詳細については、「Windows Phone 8 エミュレーターでのコンピューター キーボードの使用方法」を参照してください。

  4. UVC を再度一時的に表示して音量を調節するには、F9 または F10 を押します。

  5. 再生を停止するには、UVC を表示して、[一時停止] ボタンを押すか、エミュレーターを閉じます。

表示:
© 2015 Microsoft