WisdomSoft - for your serial experiences.

8.1 メディアファイルの再生

WPF では動画も UIElement オブジェクトとしてユーザーインターフェイスに容易に組み込むことができます。

8.1.1 動画の再生

WPF では、.NET Framework 2.0 まではサポートが不十分だったマルチメディア関連の機能も充実しています。動画ファイルや音声ファイルは、System.Windows.Controls.MediaElement クラスを用いることで簡単に再生することができます。

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 クラスのコンストラクタは、パラメータを受け取りません。

MediaElement クラスのコンストラクタ
public MediaElement ()

MediaElement で再生するメディアファイルを設定するには Source プロパティにファイルの URI を設定します。

MediaElement クラスの Source プロパティ
public Uri Source { get; set; }

再生するだけであれば、必要な設定はこれだけです。この MediaElement オブジェクトを表示すれば、自動的にメディアファイルが再生されます。Source に指定して再生できるメディア形式は Windows Media Player 10 に依存します。そのため、一般的な動画や音声ファイルのほとんどを再生することができます。

コード1
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 実行結果

コード1は、実行ファイルと同じフォルダに配置されている test.wmv というファイルを MediaElement オブジェクトで再生するプログラムです。加えて、RotateTransform オブジェクトを使って MediaElement を回転させているため、動画が斜めに傾いたまま再生されます。WPF によるメディアファイルの再生の自由度を感じることができます。

8.1.2 再生や停止の制御

MediaElement の再生や停止をプログラムで制御したい場合は、MediaElement クラスのいくつかのメソッドを使います。メディアを再生するときは Play() メソッド、一時停止するときは Pause() メソッド、停止するときは Stop() メソッドを呼び出します。

MediaElement クラス Play() メソッド
public void Play ()
MediaElement クラス Paues() メソッド
public void Pause ()
MediaElement クラス Stop() メソッド
public void Stop ()

Play() メソッドはメディアの現在の位置から再生を開始し、Pause() メソッドはメディアの再生位置を維持したまま停止します。Pause() メソッドを呼び出した後、Play() メソッドを呼び出すことで再開することができます。Stop() メソッドを呼び出した場合は、再生を停止して再生位置をメディアの先頭に戻します。

ただし、これらのメソッドを使うには LoadedBehavior プロパティを設定しなければなりません。LoadedBehavior プロパティは、メディアを読み込んだときの規定の挙動を設定するプロパティです。

MediaElement クラス LoadedBehavior プロパティ
public MediaState LoadedBehavior { get; set; }

このプロパティには、メディアの状態を表す System.Windows.Controls.MediaState 列挙体のメンバのいずれかを設定します。

System.Windows.Controls.MediaState 列挙体
public enum MediaState

メディアの状態は、閉じられた状態を表す Close、再生を表す Play、一時停止を表す Pause、停止を表す Stop、そして、手動でメディアが操作されている状態を表す Manual があります。既定では Play が設定されているため、Source にメディアを設定するだけで自動的に再生が開始されましたが、Manual を設定することで、Play() や Stop() などのメソッドを使って再生や停止を制御することができるようになります。 

コード2
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 実行結果

コード2は、ウィンドウの上部にメディアを再生する「再生」ボタン、一時停止する「一時停止」ボタン、停止する「停止」ボタンを表示しています。「再生」ボタンを押すと Play() メソッドが呼び出されメディアが再生され、「一時停止」ボタンを押すと Pause() メソッドが呼び出され一時停止し、「停止」ボタンが押されると Stop() メソッドを呼び出してメディアを停止させる仕掛けになっています。