2014年8月6日水曜日

Silverlightでの音楽ファイルの再生

音声ファイル再生方法について、まとめてみました。
コードビハインド(C#)側で定義の仕方です。

(1) mp3ファイルの再生
動画や音声といったメディアを扱うための MediaElement というコントロールを使用します。
xaml側でMainPageにMediaElementを配置するか、C#側で、Children.AddでMediaElementを追加します。

MediaElement me = new MediaElement();
me.MediaEnded += new RoutedEventHandler(me_MediaEnded);
this.LayoutRoot.Children.Add(me);
me.Source = new Uri("C:/work/alert.mp3", UriKind.Absolute);
me.Volume = 1.0;
me.Play();


外部ファイルとして、音再生するため、mp3ファイルを選んで、
・プロパティ ウィンドウで「ビルド アクション」を「なし」
 ⇒mp3ファイルの場合、標準では「なし」になっています
・「出力ディレクトリにコピー」を「新しい場合はコピーする」
に設定します。
尚、Silverlight をホストする Web アプリケーションを作成している場合は、メディア ファイルを Web アプリケーション プロジェクトの ClientBin (Silverlight アプリケーションを保持するフォルダー) にコピーしておく必要があります


<埋め込まれたリソースにする場合>
プロジェクトに効果音として使いたいmp3(またはwma)を登録します。
登録したファイルは、ソリューションエクスプローラで「ビルドアクション」を「埋め込まれたリソース」にします。
(XAMLに直接MediaElementを書く場合は「埋め込まれたリソース」では駄目のようです)
リソースとして埋め込んだmp3は、GetManifestResourceStreamで読み込みます。

System.Reflection.Assembly asm = this.GetType().Assembly; 
Sound = asm.GetManifestResourceStream("SoundTest.Resources.sound.mp3");

MediaElement me = new MediaElement(); 
me.SetSource(Sound); me.MediaEnded += new RoutedEventHandler(me_MediaEnded); SoundCanvas.Children.Add(me); 
me.Play();

void me_MediaEnded(object sender, RoutedEventArgs e) 
 { MediaElement me = sender as MediaElement; 
  SoundCanvas.Children.Remove(me); 
 } 

MediaElementはビジュアルツリーに登録しなくても、オブジェクトの参照を保持してさえいれば、音声は再生されます。
しかし、ビジュアルツリーに登録しないと、再生が終わってもMediaEndedイベントが発生しないようです。
その為、MediaEndedでリソース解除しないと、SoundCanvas.Children.Countが120を超えたあたりでエラーが発生するようです。

(2) wavファイルの再生
MediaElementでは、wavファイルの再生はできません。
参考URL:
http://social.msdn.microsoft.com/Forums/ja-JP/6f8f832a-e111-4f63-8c45-7ebddae32fcf/silverlight-wav?forum=silvelightdotnetja

したがって、 別箇対応いたします。
以下のURLが参考になります。

http://techblog.hilife-jp.info/2011/09/silverlight-5-4-realtime-sound/

http://10rem.net/blog/2011/04/13/silverlight-5-using-the-soundeffect-class-for-low-latency-sound-and-play-wav-files-in-silverlight

0 件のコメント:

コメントを投稿