8.1 メディアファイルの再生
8.1.1 動画の再生
WPF では、.NET Framework 2.0 まではサポートが不十分だったマルチメディア関連の機能も充実しています。動画ファイルや音声ファイルは、System.Windows.Controls.MediaElement クラスを用いることで簡単に再生することができます。
System.Object System.Windows.Threading.DispatcherObject System.Windows.DependencyObject System.Windows.Media.Visual System.Windows.UIElement System.Windows.FrameworkElement System.Windows.Controls.MediaElement
[LocalizabilityAttribute(LocalizationCategory.NeverLocalize)] public class MediaElement : FrameworkElement, IUriContext
MediaElement クラスは UIElement を継承する描画要素なので、Shape や Control クラスのように、自由に他の描画要素と組み合わせることができます。従来のメディア再生用コントロールとは異なり、WPF の要素として自由にレンダリングすることができるため、他のコントロールの内部に表示させたり、回転や伸縮を容易に行うことができます。
MediaElement クラスのコンストラクタは、パラメータを受け取りません。
public MediaElement ()
MediaElement で再生するメディアファイルを設定するには Source プロパティにファイルの URI を設定します。
public Uri Source { get; set; }
再生するだけであれば、必要な設定はこれだけです。この MediaElement オブジェクトを表示すれば、自動的にメディアファイルが再生されます。Source に指定して再生できるメディア形式は Windows Media Player 10 に依存します。そのため、一般的な動画や音声ファイルのほとんどを再生することができます。
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Media; class Test { [STAThread] public static void Main() { RotateTransform transform = new RotateTransform(20, 200, 150); Uri uri = new Uri("test.wmv", UriKind.RelativeOrAbsolute); MediaElement media = new MediaElement(); media.RenderTransform = transform; media.Source = uri; Window wnd = new Window(); wnd.Content = media; Application app = new Application(); app.Run(wnd); } }
コード1は、実行ファイルと同じフォルダに配置されている test.wmv というファイルを MediaElement オブジェクトで再生するプログラムです。加えて、RotateTransform オブジェクトを使って MediaElement を回転させているため、動画が斜めに傾いたまま再生されます。WPF によるメディアファイルの再生の自由度を感じることができます。
8.1.2 再生や停止の制御
MediaElement の再生や停止をプログラムで制御したい場合は、MediaElement クラスのいくつかのメソッドを使います。メディアを再生するときは Play() メソッド、一時停止するときは Pause() メソッド、停止するときは Stop() メソッドを呼び出します。
public void Play ()
public void Pause ()
public void Stop ()
Play() メソッドはメディアの現在の位置から再生を開始し、Pause() メソッドはメディアの再生位置を維持したまま停止します。Pause() メソッドを呼び出した後、Play() メソッドを呼び出すことで再開することができます。Stop() メソッドを呼び出した場合は、再生を停止して再生位置をメディアの先頭に戻します。
ただし、これらのメソッドを使うには LoadedBehavior プロパティを設定しなければなりません。LoadedBehavior プロパティは、メディアを読み込んだときの規定の挙動を設定するプロパティです。
public MediaState LoadedBehavior { get; set; }
このプロパティには、メディアの状態を表す System.Windows.Controls.MediaState 列挙体のメンバのいずれかを設定します。
public enum MediaState
メディアの状態は、閉じられた状態を表す Close、再生を表す Play、一時停止を表す Pause、停止を表す Stop、そして、手動でメディアが操作されている状態を表す Manual があります。既定では Play が設定されているため、Source にメディアを設定するだけで自動的に再生が開始されましたが、Manual を設定することで、Play() や Stop() などのメソッドを使って再生や停止を制御することができるようになります。
using System; using System.Net; using System.Windows; using System.Windows.Media; using System.Windows.Controls; class Test : Window { [STAThread] public static void Main() { Window wnd = new Test(); Application app = new Application(); app.Run(wnd); } private MediaElement media; private Button play, pause, stop; public Test() { media = new MediaElement(); media.LoadedBehavior = MediaState.Manual; media.Source = new Uri("test.wmv", UriKind.RelativeOrAbsolute); play = new Button(); play.Content = "再生"; play.Click += playClick; pause = new Button(); pause.Content = "一時停止"; pause.Click += pauseClick; stop = new Button(); stop.Content = "停止"; stop.Click += stopClick; StackPanel stackPanel = new StackPanel(); stackPanel.Orientation = Orientation.Horizontal; stackPanel.Children.Add(play); stackPanel.Children.Add(pause); stackPanel.Children.Add(stop); DockPanel dockPanel = new DockPanel(); dockPanel.Children.Add(stackPanel); dockPanel.Children.Add(media); DockPanel.SetDock(stackPanel, Dock.Top); Content = dockPanel; } private void playClick(Object sender, RoutedEventArgs e) { media.Play(); } private void pauseClick(Object sender, RoutedEventArgs e) { media.Pause(); } private void stopClick(Object sender, RoutedEventArgs e) { media.Stop(); } }
コード2は、ウィンドウの上部にメディアを再生する「再生」ボタン、一時停止する「一時停止」ボタン、停止する「停止」ボタンを表示しています。「再生」ボタンを押すと Play() メソッドが呼び出されメディアが再生され、「一時停止」ボタンを押すと Pause() メソッドが呼び出され一時停止し、「停止」ボタンが押されると Stop() メソッドを呼び出してメディアを停止させる仕掛けになっています。