この記事は機械翻訳されたものです。

快適な動作

Windows Phone でオーディオ ファイルを再生する (機械翻訳)

Charles Petzold

コード サンプルをダウンロードします。

Charles Petzold最初と思ったがバック グラウンドでのサウンドと音楽ファイルを再生するアプリケーションの Windows Phone OS 7.1 での機能強化含まれて読んだとき」我々 はすでにないの?

それは正しい、しかし唯一なります少し。 実際には非常に特殊なケースのみが、バック グラウンドで音楽ファイルを再生する Windows Phone OS 7.0 アプリケーションには。 アプリケーションがバック グラウンドに移動すると、他のすべてのケースで Windows Phone OS 7.0 アプリケーションを再生する任意の音楽ファイルを停止します。 もちろん、ほとんどのアプリケーションでは、この動作はまったく適切ですと、おそらく正確に何をしたい。

しかし、あなたの電話、携帯電話の音楽ライブラリから別に音楽を配信するアプリケーションを検討してください。 このようなアプリケーションは、非常に、前景色または、画面のタイムアウトし、ロックされた状態になる他のアプリケーションを占める一方、プレーを続行することが望ましいです。 でもこれらの私たちはこのようなアプリケーションを記述する必要はありませんは、楽しいこの施設を提供「Windows Phone OS 7.1 で導入されたバック グラウンド エージェント」の新しい世界探索にエントリ ポイント。

次の問題では、バック グラウンドで音楽ファイルを再生する Windows Phone プログラムを記述する方法場合が表示されます。 しかし、Windows Phone のオーディオ設備の広範な画像を提供するには、この列に Windows Phone OS 7.0 と 7.1 サポートされているオーディオ ファイルを再生するより標準的な方法で開始します。

MediaElement およびそのソース

音楽またはサウンド ファイルを再生するには、Silverlight プログラムを最も一般的な方法は、MediaElement です。 何も簡単です。XAML ファイルのビジュアル ツリーに置くことができ、ソース プロパティへの URL を設定するだけ MediaElement FrameworkElement から派生します。

<MediaElement Source="http://www.SomeWebSite.com/CoolSong.mp3" />

XAML ファイルが読み込まれると、音楽ファイルは、自動的に再生を開始します。 MediaElement は、MP3、WMA を WAV ファイルをサポートします。 詳細に記載されてmsdn.microsoft.com/library/ff462087(VS.92)

インターネット上のファイルを参照する別の方法として、サウンドまたは音楽ファイルをアプリケーションの実行可能ファイルに埋め込むことができます。 ファイルを Visual Studio でプログラムを追加し、ビルド アクションのコンテンツ、またはリソースとしてフラグします。 (コンテンツ優先、XAP の実行可能ファイルで、ファイルを埋め込む リソースには、ファイル、プログラムの DLL に埋め込まれます。)該当する場合、フォルダ名とファイル名を参照する URL には、ソース プロパティを設定します。

<MediaElement Source="Music/LocalSong.wma" />

MediaElement は非常に単純なことができますが、あるがより複雑にする方法は多数。私はこの記事のダウンロード可能なコードの一部では、MediaElementDemo プログラムでは、1 つ方法オーディオ ファイルを実行時に指定するが。

このプログラムでは、MediaElement は、ビジュアル ツリーが Source プロパティが設定されていない、あり自動再生を False に設定されます。メディア­ElementDemo ブラームスのヴァイオリン協奏曲の 3 つの動きを再生することができます。(ファイルからインターネットのアーカイブでは archive.org/­詳細・ BrahmsViolinConcerto-ハイフェッツ。それは 1939年パフォーマンス ヴァイオリニスト ヤッシャ ・ ハイフェッツ、セルゲイ ・ クーセヴィツキーを実施、もともとビクター 78 rpm ディスクで利用可能です。)3 つの RadioButton 要素 3 つの音楽ファイルのソースに、タグ プロパティが設定します。最初のラジオボタンは、インターネットのアーカイブの Web サイト上の音楽ファイルの完全な URL です。2 番目の動きでは、私は私の PC は、Visual Studio でプロジェクトに音楽をという名前のフォルダーを作成する (02Ii.Adagio.mp3) という名前の音楽ファイルをダウンロード ・ フォルダーにファイルを追加しました。その名前のファイルが、「Music/02Ii.Adagio.mp3」の 2 番目の RadioButton の参照します。これら 2 つのボタンのいずれかのチェックがイベント ハンドラー Tag プロパティを取得し、Uri オブジェクトを (UriKind.Absolute、Web 参照と UriKind.Relative のコンテンツを指定) を作成し、MediaElement のソース プロパティを設定します。

第二楽章 4.5 MB のファイルであり、明らかにそれをかなりの部分で、実行可能ファイルのサイズを増加します。このサイズのファイルを実行可能ファイルに追加いない推奨されここではデモのみを行う !

アプリケーション ファイルのサイズが必要な場合は、妥協の可能性があります。アプリケーション ファイルが一度、インターネット経由でダウンロードでき、分離ストレージに保存します。何のヴァイオリン協奏曲第 3 楽章をやった。3 番目の RadioButton (の名前が割り当てられている「isoStoreRadio­ボタン」) IsEnabled プロパティ初期設定されている false にします。図 1 、ダウンロード プロセスを示しています。分離ストレージでは、ファイルではない場合、ページのコンス トラクターでは、WebClient バック グラウンド転送開始します。転送が完了したら、ファイルを分離ストレージに保存し、ラジオボタンを有効に。

図 1 Web ファイルを分離ストレージにダウンロード

public MainPage()
{
  InitializeComponent();
  // ...
// Check if file is in Isolated Storage; otherwise start downloading it
  using (IsolatedStorageFile isoStore =
    IsolatedStorageFile.GetUserStoreForApplication())
  {
    if (isoStore.FileExists(isoStoreRadioButton.Tag as string))
    {
      isoStoreRadioButton.IsEnabled = true;
    }
    else
    {
      WebClient webClient = new WebClient();
      webClient.OpenReadCompleted += OnWebClientOpenReadCompleted;
      webClient.OpenReadAsync(new Uri("http://www.archive.org/....mp3"));
    }
  }
  // ...
}
// When the music file is downloaded, save it to Isolated Storage
void OnWebClientOpenReadCompleted(object sender, 
  OpenReadCompletedEventArgs args)
{
  if (!args.Cancelled && args.Error == null)
  {
    Stream inpStream = args.Result;
    byte[] buffer = new byte[inpStream.Length];
    inpStream.Read(buffer, 0, buffer.Length);
    using (IsolatedStorageFile isoStore =
      IsolatedStorageFile.GetUserStoreForApplication())
    {
      string isoPathName = isoStoreRadioButton.Tag as string;
      string isoDirName = Path.GetDirectoryName(isoPathName);
      if (!isoStore.DirectoryExists(isoDirName))
      {
        isoStore.CreateDirectory(isoDirName);
      }
      using (IsolatedStorageFileStream isoStream =
        isoStore.CreateFile(isoPathName))
      {
        isoStream.Write(buffer, 0, buffer.Length);
        isoStoreRadioButton.IsEnabled = true;
      }
    }
  }
}

いくつかのコンテキスト Windows Phone OS 7.1 では、分離ストレージ内のファイルを参照するには、URI「isostore」のプレフィックスを定義することができますが、MediaElement には機能しません。 幸いにも、メディア­要素がストリーム オブジェクトを受け取る、SetSource プロパティ。 図 2チェックのハンドラー RadioButton 要素はこれらの違いを処理する方法を示しています。

図 2 MediaElement 上のソースの設定

void OnRadioButtonChecked(object sender, RoutedEventArgs args)
{
  RadioButton radioButton = sender as RadioButton;
  string uriString = radioButton.Tag as string;
  // Save index for tombstoning
  radioButtonIndex = radioButtonPanel.Children.IndexOf(radioButton);
  if (radioButton == isoStoreRadioButton)
  {
    // Call SetSource on MediaElement using Isolated Storage stream.
using (IsolatedStorageFile storage =
      IsolatedStorageFile.GetUserStoreForApplication())
    {
      using (Stream isoStream = storage.OpenFile(uriString, FileMode.Open))
      {
        mediaElement.SetSource(isoStream);
      }
    }
  }
  else
  {
    // Set Source property on MediaElement using URI
    Uri uri = new Uri(uriString, uriString.Contains(':')
      ?
UriKind.Absolute : UriKind.Relative);
    mediaElement.Source = uri;
  }
}

トランスポートと墓石

MediaElement 難しく自分のことができます別の方法は、一時停止して、先頭またはファイルの末尾に移動するコントロールを追加することによってです。さらに多くの楽しみで示すように、ファイル内の特定の位置に移動するスライダー コントロールとは図 3

The MediaElementDemo Program図 3 MediaElementDemo プログラム

4 つの ApplicationBar ボタンは非常に単純に実装されています。それぞれ、彼らはゼロ、MediaElement の Play メソッドを呼び出す、Pause メソッドを呼び出す、NaturalDuration プロパティに位置プロパティを設定して MediaElement の位置プロパティを設定します。

トリッキーな部分は有効にし、ボタンを無効にします。その仕事には、MediaElement の CurrentStateChanged イベントが処理されます。MediaElement のロジックを使用する場合、音楽ファイルが読み込まれるとは、どのように CurrentState プロパティ バッファー、変更の感触をハンドラー再生、一時停止および終了イベントで最初 Debug.WriteLine を使用すると便利です。

電話では、すべての音楽とサウンド ファイルが 1 つのソフトウェアと、Zune メディア キューと呼ばれるハードウェアが再生されます。電話で標準の音楽 + ビデオ アプリケーションを使用してあなたの音楽コレクションから曲またはアルバムを再生する場合は、その音楽はままにそのアプリケーションを他のアプリケーションを起動すると、バック グラウンドで再生していきます — と MediaElementDemo プログラムを起動したときにも。ただし、ブラームスのヴァイオリン協奏曲を演奏の動きのいずれかを起動すると、バック グラウンド ミュージックを停止します。コントロールに MediaElementDemo ようになりました。

フォア グラウンドの MediaElementDemo の葉が — ユーザーが [スタート] ボタンを押してまたは、画面のタイムアウトさせるかどうか — プログラムが廃棄されていない場合でも、ブラームス、停止します。

このような状況では、何をユーザー、プログラムに返されるときに発生しますか。答えが「無」の場合、幸運にしている !しかし、もう一度離れたところから始めるために、音楽をする場合は、MediaElementDemo これを行う方法を示します。その OnNavigatedFrom のオーバーライドでは、プログラムの現在の再生、(おそらく再生または一時停止) の状態と位置、運動のインデックスを保存します。OnNavigatedTo、プログラム、RadioButton を確認の状態、MediaOpened ハンドラー内の位置を設定します。

Medialibrary が、MediaPlayer

前述 Windows Phone OS 7.1 の前に、施設すでに背景の電話上の音楽ファイルを再生するには存在すること。キャッチは、これらの音楽ファイル、携帯電話の音楽ライブラリの一部ことが必要です。あなたのプログラムがこれらの曲の 1 つを遊ぶことができます。 または、すべての曲をアルバムですべての曲のアーティスト、ジャンル、またはすべての曲をで再生することができます。

これを行うには、クラスは、Microsoft.Xna.Framework.Media 名前空間のメンバーです。これら XNA クラスを Silverlight プロジェクトで、電話に使用するには、まず、Microsoft.Xna.Framework ライブラリへの参照を追加する必要があります。Windows Phone OS 7.0 では、Visual Studio これについて警告を与えた。警告 Windows Phone OS 7.1 を行ったこと。

XNA のクラスを使用して音楽を再生する任意の Silverlight プログラムは IApplicationService を実装し、すべての 30 秒の FrameworkDispatcher.Update を呼び出す特別なクラスを含める必要があります。場合、任意の名前は、クラスを与えることができますが、App.xaml ファイルの ApplicationLifetimeObjects セクションで参照します。

<local:XnaFrameworkDispatcherService />

ユーザーの音楽ライブラリから曲を再生するには、MusicLibrary クラスのインスタンス化を開始します。 コレクションのオブジェクトの種類のアーティスト、アルバム、ジャンル、プレイリスト、アーティスト、アルバム、ジャンル、プレイリストをという名前のプロパティを提供し、曲型のプロパティ Song オブジェクトのコレクションです SongCollection にはこれらのすべてのクラスが含まれます。 (これらのコレクションは読み取り専用です。 アプリケーションを何もユーザーの音楽ライブラリに追加またはできません任意の方法で変更。)

何かの再生を開始するには、静的の MediaPlayer クラスのメンバーを使用します。 MediaPlayer.Play メソッドを開始するには、SongCollection または、SongCollection インデックス歌を示すために、歌オブジェクトを受け入れます。

PlayRandomSong プログラム「ランダムな曲、再生」ボタン含むし、、タップすると、次のコードを実行。

void OnButtonClick(object sender, RoutedEventArgs args)
{
    MediaLibrary mediaLib = new MediaLibrary();
    AlbumCollection albums = mediaLib.Albums;
    Album album = albums[random.Next(albums.Count)];
    SongCollection songs = mediaLib.Songs;
    Song song = songs[random.Next(songs.Count)];
    MediaPlayer.Play(song);
}

このコードは、あなたのコレクションは、ランダムな曲は、アルバムからのランダムなアルバムを抽出し、それを再生を開始します。 (このプログラムは罰金のエミュレーターで実行されるよう Windows Phone エミュレーター アルバムいくつかの小さな曲ファイルを格納します。

PlayRandomSong での演奏曲を開始、プログラムから離れて移動したりも、プログラムを終了して、曲再生が続行されます見つけることができます。 まさにその歌、携帯電話の定期的な音楽 + ビデオ アプリケーションからを再生する場合は- とは、アプリケーションを起動すると、アルバムのカバーや、曲のタイトルが表示されます。 また、電話で、ボリューム コントロール ボタンを押すと、画面の上部にある歌を参照してくださいし、一時停止または、先頭または、曲の最後に移動するボタンへのアクセスを取得します。

ちょうど携帯電話の音楽 + ビデオ アプリケーション MediaPlayer.Play で演奏した曲を知っているように、アプリケーション、携帯電話の音楽 + ビデオ アプリケーションが現在再生中は、曲を確認できます。 この情報は、MediaPlayer は、アルバムやプレイリストを再生している場合、現在再生中の曲と曲のコレクションを示す MediaQueue オブジェクトの提供のキュー プロパティから利用可能です。 PlayRandomSong プログラムは、タイマーを使用して、キューの ActiveSong プロパティをチェックしてその曲に関する情報が表示されます。 また、MediaPlayer の ActiveSongChanged イベントのハンドラーを設定できます。

歌オブジェクトを作成します。

PlayRandomSong プログラム Song オブジェクトのプロパティまたはコレクション medialibrary のいずれかから取得しますが、歌もあなたの音楽ライブラリではなくファイル ベース、歌プロパティを作成する FromUri という名前の静的プロパティ。 この URI は、インターネット上の音楽ファイルを参照できます。 またはプログラムの XAP ファイルの一部です。 (、分離ストレージ内のファイルを参照できません。)[MediaPlayer を使用して、この歌オブジェクトを再生できます。 (SongCollection オブジェクトを作成することはできません)。

MediaPlayerDemo プログラムは、その方法を示しています。 このブラームスの二重協奏曲 (別の 1939年記録 archive.org/details/BrahmsDoubleConcerto_339 から) をプレイ再びハイフェッツ、エマーヌエル ・ フォイアーマン チェロにユージン ・ オーマンディ実施とこと。 MediaPlayer 分離ストレージを使用できないため、最初と最後の両方の動きを Web 参照です。

別の違い、MediaPlayer の PlayPosition プロパティのみ gettable が MediaElement の位置プロパティ gettable と設定の両方です。 その結果、先頭と末尾のトラックに行く 2 つの ApplicationBar ボタンは適用されません。 また、方法がないどうやら歌オブジェクトをスライダーも関係ありませんのでこの方法では、作成の期間を取得します。 どこにあなたがやめたかをトラックを開始することはできませんので私はまたこのプログラムから廃棄のすべてのロジックを削除しました。

バック グラウンドでの携帯電話の音楽ライブラリから取得した歌オブジェクト MediaPlayer を果たすため、それも曲の任意のオブジェクトをバック グラウンドで再生するが期待するかもしれない。 それはないです。 この点では、MediaPlayer は MediaElement のようです。 アプリケーションから離れて移動するとすぐに音楽を停止します。 ただし、MediaPlayerDemo プログラムから離れて移動し、廃棄されないかどうか — これはしばしば起こる Windows Phone OS 7.1 と — 音楽だけ中断されます。 アプリケーションに戻るを移動すると、離れたところを選択します。

思うとき、プラスをチョークし、マイナス、Silverlight MediaElement は、XNA MediaPlayer が自動の少し先­matic の再開再生の MediaPlayer の非常に便利な機能です。

ストリーミングとを超えて

私は一般的なオーディオおよび音楽ファイル WMA の再生を議論してきたし、mp 3 形式します。 Windows Phone には、サウンド、アプリケーション内で動的に生成するためのプログラムもことができます。 Windows Phone プログラミングのコンテキストでは、この「ストリーミングとして「知られています。私は私 2011年 2 月 UI 最前線列で SpeakMemo プログラムの 1 つのアプローチを実証 (msdn.microsoft.com/magazine/gg598930) XNA DyanamicSoundEffectInstance クラスを使用して。 MediaStreamSource クラスで Silverlight を使用することによりのような何かをするのにこともできます。 これは、携帯電話の電子音楽の合成を実装する方法です。 また、ただし、これらのみフォア グラウンド アプリケーションで使用可能です。

Windows Phone OS 7.1 以降では、「バック グラウンド エージェント」概念が導入され、と、これを使用すると、いずれかの音楽ファイルを再生またはバック グラウンドでプログラムを中断している間にオーディオをストリーミングしますします。

次の問題では、これを行う方法を説明します。

Charles Petzold は長年の貢献エディターに MSDN マガジン。彼の Web サイト charlespetzold.com

この記事のレビュー、技術スタッフのおかげでに: Mark Hopkins