Visual Studio 2010 自習書 ~ Do-It-Yourself シリーズ ~
XAML による Windows アプリケーション開発の基礎
第 10 回 メディア
更新日: 2011 年 1 月 27 日
ダウンロード (XPS、775 KB | PDF、719 KB)
目次
- <MediaElement> 要素を使用する
- MediaElement でのメディアのコントロール
- MediaTimeline を使ったメディアの再生
- まとめ
XAML Do-It-Yourself 第 10 回は、メディアの操作について学習します。ここでは、音声や動画などのメディア ファイルの再生をアプリケーションでコントロールする方法を紹介します。
今回は、以下の内容について学習します。
- メディア再生の基本
- MediaTimeline によるメディア再生の制御
次に示す画面は、動画ファイルである WMV ファイルを再生するアプリケーションです。
1. <MediaElement> 要素を使用する
メディアの再生を行うアプリケーションを XAML で記述するにはいくつか方法がありますが、まず <MediaElement> 要素を利用してメディアの再生を行ってみます。
<MediaElement> 要素は、ウィンドウに音声や動画を配置するためのコントロールです。使用方法は非常に簡単で、パネルに <MediaElement> 要素を配置し、Source 属性でメディア ファイルの ファイル名や URI を指定するだけです。メディアとしては、WMV (Windows Media Video) ファイルのほかに、WMA (Windows Media Audio) ファイル、AVI ファイルなども指定できます。
以下のリストでは、Streatch 属性を Uniform (メディアの本来の縦横比を維持しながら、対象の領域に収まるようにサイズを変更) に設定しています。プロジェクトには media フォルダーを作成し、サンプル用のビデオ ファイルを追加してください。このファイルのプロパティは、ビルド アクションを「なし」にし、出力ディレクトリにコピーは「新しい場合はコピーする」を設定します。MediaElement の Source プロパティのファイル名は、追加したビデオ ファイル名に合わせてください。
<Window x:Class="WpfApplication10.MainWindow"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid Background="Black">
<MediaElement
Source="media\bear.wmv"
Width="400"
Height="300"
Stretch="Uniform"/>
</Grid>
</Window>
これを実行すると、アプリケーションのウィンドウが開くと自動的に、動画の再生が開始します。
ページのトップへ
2. MediaElement でのメディアのコントロール
<MediaElement> 要素を用いたメディアのコントロールは、コード ビハインド ロジックを用意することで簡単に行えます。続いては、"Play"、"Pause"、"Stop" といったボタンを配置して、メディアの再生をコントロールしてみましょう。
以下の XAML コードに示すように、StackPanel 上に <MediaElement> 要素と、メディアのコントロールを行うための <Button> 要素を配置します。<Button> 要素にはそれぞれ、ボタンがクリックされた際に呼び出されるイベント ハンドラーを設定します。
また <MediaElement> 要素には、新たに LoadedBehavior 属性を追加し、値を "Manual" に設定します。この属性は、アプリケーションが起動して <MediaElement> 要素で指定したメディアがロードされた際の動作を指定するものです。"Manual" を指定すると、メディアがロードされても再生は開始されません。さらに Name 属性を使って <MediaElement> 要素に名前を付けて、コード ビハインド ロジックから <MediaElement> 要素を参照できるようにします。
<Window x:Class="WpfApplication10.MainWindow"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="400" Width="525">
<StackPanel Background="Black">
<MediaElement
Source="media\Wildlife.wmv"
Name="myMedia"
Width="400"
Height="300"
LoadedBehavior="Manual"
Stretch="Uniform" />
<StackPanel HorizontalAlignment="Center" Width="400"
Orientation="Horizontal">
<!-- Play button. -->
<Button Click="OnClickPlay" Margin="5" >Play</Button>
<!-- Pause button. -->
<Button Click="OnClickPause" Margin="5" >Pause</Button>
<!-- Stop button. -->
<Button Click="OnClickStop" Margin="5" >Stop</Button>
</StackPanel>
</StackPanel>
</Window>
コード ビハインド ロジックの記述
コード ビハインド ロジックでは、3 つのボタンのイベント ハンドラーを実装します。メディアのコントロールは非常に簡単で、<MediaElement> 要素を示す myMedia オブジェクトに対して、それぞれ Play、Pause、Stop メソッドを呼び出すだけです。
using System.Windows;
namespace WpfApplication10
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
// Play
void OnClickPlay(object sender, RoutedEventArgs args)
{
myMedia.Play();
}
// Pause
void OnClickPause(object sender, RoutedEventArgs args)
{
myMedia.Pause();
}
// Stop
void OnClickStop(object sender, RoutedEventArgs args)
{
myMedia.Stop();
}
}
}
これを実行すると、次のようなウィンドウが表示されます。"Play" ボタンをクリックするとメディアの再生が開始されます。"Pause" ボタンを押すと再生が中断し、中断中に "Play" ボタンを再度クリックすると、中断した位置から再生が再開します。
ページのトップへ
3. MediaTimeline を使ったメディアの再生
これまで説明した方法とは別に、コード ビハインド ロジックを用いずに、メディアの再生をコントロールする方法もあります。これは、アニメーションの回で紹介した Storyboard を利用する方法です。
この場合には、<MediaElement> 要素の Source 属性にはメディア ファイルの指定を行いません。その代わりに、"Play" ボタンがクリックされた際のイベントで Storyboard を使い、そこで <MediaTimeline> 要素を使ってメディアの再生を行います。
MediaTimeline は、メディア再生のタイミングをコントロールするための要素です。開始時間 (BeginTime) や再生時間 (Duration) などを指定できますが、ここではそれらは指定せず、Source 属性に再生を行うメディア ファイルのファイル名を指定します。さらに MediaTimeline で管理するメディアを表示するオブジェクトを Storyboard.TargetName 属性で指定します。これには <MediaElement> 要素の名前 (ここでは "myMedia") を指定します。
ほかの Button についても、クリックされた場合のイベントを設定します。"Pause" ボタンがクリックされた場合のイベント (Button.Click) には、<PauseStoryboard> 要素を記述します。このとき、BeginStoryboardName 属性には、<BeginStoryboard> 要素で設定した名前を指定します。同様に "Resume" ボタンのイベントには <ResumeStoryboard> 要素を、"Stop" ボタンのイベントには <StopStoryboard> 要素を記述します。
<Window x:Class="WpfApplication10.Window1"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="420" Width="450">
<StackPanel Background="Black">
<MediaElement
Name="myMedia"
Width="400"
Height="300"
Stretch="Uniform" />
<StackPanel HorizontalAlignment="Center" Width="400" Orientation="Horizontal">
<Button Name="btnPlay" Margin="10" >Play</Button>
<Button Name="btnPause" Margin="10" >Pause</Button>
<Button Name="btnResume" Margin="10" >Resume</Button>
<Button Name="btnStop" Margin="10" >Stop</Button>
</StackPanel>
<StackPanel.Triggers>
<!-- Play Button -->
<EventTrigger RoutedEvent="Button.Click" SourceName="btnPlay">
<EventTrigger.Actions>
<BeginStoryboard Name= "myBegin">
<Storyboard>
<MediaTimeline
Source="media\Wildlife.wmv"
Storyboard.TargetName="myMedia" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<!-- Pause Button -->
<EventTrigger RoutedEvent="Button.Click" SourceName="btnPause">
<EventTrigger.Actions>
<PauseStoryboard BeginStoryboardName="myBegin" />
</EventTrigger.Actions>
</EventTrigger>
<!-- Resume Button -->
<EventTrigger RoutedEvent="Button.Click" SourceName="btnResume">
<EventTrigger.Actions>
<ResumeStoryboard BeginStoryboardName="myBegin" />
</EventTrigger.Actions>
</EventTrigger>
<!-- Stop Button -->
<EventTrigger RoutedEvent="Button.Click" SourceName="btnStop">
<EventTrigger.Actions>
<StopStoryboard BeginStoryboardName="myBegin" />
</EventTrigger.Actions>
</EventTrigger>
</StackPanel.Triggers>
</StackPanel>
</Window>
アプリケーションを実行して、"Play" ボタンでメディアが再生されます。ただし、先のコード ビハインド ロジックで実装した処理と異なり、"Pause" ボタンで再生を一時停止した場合、"Resume" ボタンをクリックしないと再生は再開されません。
ページのトップへ
4. まとめ
今回は メディアの操作について紹介しました。ここでは触れていませんが、音声ファイル (WMA ファイル) についても、今回紹介した方法で再生可能です。
次回は 2D グラフィックスについて学習します。