言語: HTML | XAML

バックグラウンドでオーディオを再生する方法 (XAML)

バックグラウンドでオーディオを再生するには、Audio バックグラウンド タスクを宣言し、SystemMediaTransportControls のボタンを処理します。

重要  Windows 8.1 では、MediaControl クラスの代わりに SystemMediaTransportControls クラスが導入されています。 アプリでは SystemMediaTransportControls を使う必要があります。
  ビデオ ストリームのバックグラウンドでの再生が有効である場合、アプリをバックグラウンドに切り替えると、オーディオは再生されますが、ビデオは再生されません。これは仕様です。 これにより、ビデオをバックグラウンドで再生している間のデバイスの電源要件を低減します。

完全なメディア再生のサンプルで実際にこの機能を確認するには、「メディア再生の概要」を参照してください。

必要条件

このトピックは、C++、C#、または Visual Basic を使った基本的な Windows ストア アプリを作る方法を理解していることを前提としています。初めてのアプリ作成の説明については、「C# または Visual Basic を使った初めての Windows ストア アプリの作成」をご覧ください。

このトピックでは MediaElement クラスに習熟していることを前提としています。 MediaElement クラスの使用の概要については、「クイック スタート: ビデオとオーディオ」をご覧ください。

手順

ステップ 1: バックグラウンド オーディオ タスクの宣言

アプリがバックグラウンド タスクを実行することを明示的に宣言する必要があります。

  1. Microsoft Visual Studio でアプリのプロジェクト ファイルを開きます。
  2. ソリューション エクスプローラーで、Package.appmanifest ファイルをダブルクリックして [Package.appmanifest] ダイアログ ボックスを開きます。
  3. [宣言] タブをクリックし、[使用可能な宣言] ドロップダウン ボックスで [バックグラウンド タスク] を選択します。
  4. [追加] をクリックし、[オーディオ] チェック ボックスをオンにします。

    前の手順でオーディオ用に作ったものと同じマニフェスト ファイルを使って、ビデオ ストリームのバックグラウンド宣言を行うこともできます。そのためには、"Task Type" 属性を audio に設定します。

  5. エントリ ポイントを指定します。ほとんどの場合、プロジェクトの名前が Foo であれば、Foo.App を指定します。

ステップ 2: AudioCategory の設定

MediaElementAudioCategory プロパティを CommunicationsBackgroundCapableMedia に設定します。このプロパティはコードでも指定できます。

次の XAML で、MediaElement を作成し、AudioCategoryBackgroundCapableMedia に設定します。


<MediaElement Name="media" 
              AudioCategory="BackgroundCapableMedia" 
              Source="Somesong.mp3" />


ステップ 3: SystemMediaTransportControls のサポート

Windows 8.1 では、MediaControl クラスの代わりに SystemMediaTransportControls クラスが導入されています。 アプリでは SystemMediaTransportControls を使う必要があります。完全な手順を示すために、MediaControl でバックグラウンド オーディオのサポートを実装する手順については、以降で説明しますが、SystemMediaTransportControls のみを使う必要があります。SystemMediaTransportControls の使い方について詳しくは、「システム メディア トランスポート コントロールの使用方法」をご覧ください。

アプリがオーディオをバックグラウンドで再生するように宣言されている場合でも、アプリでは、IsPlayEnabledIsPauseEnabledtrue に設定して SystemMediaTransportControls の再生ボタンと一時停止ボタンを有効にする必要があります。アプリでは、ButtonPressed イベントを処理する必要があります。このイベントは、システム メディア トランスポート コントロールのボタンが押されたときにアプリに通知します。このような最小限のイベント処理サポートを提供することで、ユーザーは、アプリをフォアグラウンドで表示しなくても、オーディオの再生や一時停止を行うことができます。

ButtonPressed イベント ハンドラーから UI スレッド上のオブジェクトを更新するには、MediaElement オブジェクトと同じように、CoreDispatcher を介して呼び出しをマーシャリングする必要があります。 これは ButtonPressed イベント ハンドラーは、UI スレッドから呼び出されないためです。 UI スレッドでのみ、UI スレッド上のオブジェクトを変更することができます。 UI スレッド以外から UI オブジェクトを変更しようとすると、例外がスローされます。 以下のコード例で、この方法を示しています。

ButtonPressed イベントの処理に加えて、一時停止時、再生時など、メディアの状態が変化したときに SystemMediaTransportControls に通知する必要があります。 メディア状態の変更について SystemMediaTransportControl に通知するには、PlaybackStatus プロパティを MediaPlaybackStatus のいずれかの値に設定します。

バックグラウンドでオーディオを再生するアプリに SystemMediaTransportControls を設定するコードを示します。このコードは次の手順を実行します。

MediaElement を作成するコードを示します。


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


SystemMediaTransportControls を設定するコードを示します。


SystemMediaTransportControls systemControls;

void InitializeTransportControls()
{
    // 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;
}


MediaElementCurrentStateChanged イベントを処理し、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;
    }
}


MediaElement の再生と一時停止を行うヘルパー メソッドと ButtonPressed イベント ハンドラーのコードを次に示します。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();
    });
}


SystemMediaTransportControl について詳しくは、「システム メディア トランスポート コントロールの使用方法」と SystemMediaTransportControls のサンプルに関するページをご覧ください。

ステップ 4: MediaControl のハンドラーを登録する (Windows 8 のみ)

重要  

Windows 8.1 では、MediaControlSystemMediaTransportControl に置き換えられました。代わりに SystemMediaTransportControl を使ってください。

音楽またはビデオをバックグラウンドで再生するようにアプリを登録してある場合でも、アプリでは、MediaControl のイベントを処理する必要があります。それらのイベントは、PlayPressedPausePressedStopPressedPlayPauseTogglePressed です。このような最小限のイベント処理サポートを提供することにより、ユーザーは、アプリケーションをフォアグラウンドで表示しなくても、音楽やビデオ ストリームの再生や一時停止をバックグラウンドで行うことができます。

通常は、MediaElement を制御するために、トランスポート コントロール (再生、停止、一時停止のボタン) を作成するでしょう。ここではそれについて説明しませんが、その方法の例については、「クイック スタート: ビデオとオーディオ」と「クイック スタート: メディア プレーヤー アプリケーションの作成」をご覧ください。

MediaControl は静的なクラスなので、イベント ハンドラーはクラスのイベントに直接追加します。

  1. [ソリューション エクスプローラー] ウィンドウで、アプリの C# ファイルをクリックして開きます。 この例では、MainPage.xaml.cs ファイルを使います。
  2. 次のコードを使って、アプリに [再生]、[一時停止]、[停止] と、[再生/一時停止] トグル ボタンを登録します。
    
    MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
    MediaControl.PlayPressed += MediaControl_PlayPressed;
    MediaControl.PausePressed += MediaControl_PausePressed;
    MediaControl.StopPressed += MediaControl_StopPressed;
    
    
    
    
  3. 次のコードを使って、[再生]、[一時停止]、[停止] と、[再生/一時停止] イベントが発生したときに発生するイベントを処理します。
    
    void MediaControl_StopPressed(object sender, object e)
    {
        // media is a MediaElement defined in XAML
        media.Stop();
    }
    
    void MediaControl_PausePressed(object sender, object e)
    {
        // media is a MediaElement defined in XAML
        media.Pause();
    }
    
    void MediaControl_PlayPressed(object sender, object e)
    {
        // media is a MediaElement defined in XAML
        media.Play();
    }
    
    void MediaControl_PlayPauseTogglePressed(object sender, object e)
    {
        if (MediaControl.IsPlaying == true)
        {
            // media is a MediaElement defined in XAML
            media.Pause();
        }
        else
        {
            // media is a MediaElement defined in XAML
            media.Play();
        }
    }
    
    
    

注釈

  アプリで、オーディオやビデオのストリーミング以外のタスクも実行する場合、アプリからフォーカスが移動して作業中のウィンドウではなくなった時点で、メディア以外に関連するタスクは停止される必要があります。 オーディオのストリーミングは、アプリでそのまま続行できます。オーディオ ビデオ ストリームの場合、ビデオ ストリーミングは自動的に停止します。

完全な例

オーディオとビデオのストリーミング方法の詳しい例については、XAML メディア再生のサンプルに関するページをご覧ください。

関連トピック

システム メディア トランスポート コントロールの使用方法
SystemMediaTransportControls のサンプル
再生マネージャーのサンプル
クイック スタート: ビデオとオーディオ
クイック スタート: メディア プレーヤー アプリケーションの作成
メディア再生の概要

 

 

表示:
© 2015 Microsoft