音声ファイル再生方法について、まとめてみました。
コードビハインド(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 件のコメント:
コメントを投稿