マルチメディアの概要

Windows Presentation Foundation (WPF) のマルチメディア機能を使用してアプリケーションにオーディオとビデオを統合することで、ユーザー エクスペリエンスを向上させることできます。 このトピックでは、WPF のマルチメディア機能の概要を説明します。

メディア API

MediaElement および MediaPlayer クラスは、オーディオまたはビデオのコンテンツを表示するために使用されます。 これらのクラスは、対話式またはクロックで制御できます。 これらのクラスは、Microsoft Windows Media Player 10 コントロールでメディアの再生に使用できます。 どちらのクラスを使用するかは、シナリオによって決まります。

MediaElement は、レイアウトでサポートされている UIElement であり、多くのコントロールのコンテンツとして利用できます。 また、Extensible Application Markup Language (XAML) とコードでも使用できます。 それに対し、MediaPlayerDrawing オブジェクト向けに設計されていて、レイアウトではサポートされていません。 MediaPlayer を使用して読み込まれたメディアは、VideoDrawing を使用するか、DrawingContext を直接操作することでのみ表示できます。 MediaPlayer は XAML では使用できません。

描画オブジェクトと描画コンテキストの詳細については、「描画オブジェクトの概要」を参照してください。

注意

アプリケーションでメディアを配布するときに、プロジェクト リソースとしてメディア ファイルを使うことはできません。 プロジェクト ファイルで、メディアの種類を Content に設定し、CopyToOutputDirectoryPreserveNewest または Always に設定する必要があります。

メディア再生モード

注意

MediaElementMediaPlayer のどちらにも同様のメンバーが含まれています。 このセクションのリンクは、MediaElement クラスのメンバーを示しています。 特に明記されていない限り、MediaElement クラス内でリンクされているメンバーは、MediaPlayer クラスにも存在します。

Windows Presentation Foundation (WPF) でのメディアの再生を理解するには、メディアを再生できるさまざまなモードを理解しておく必要があります。 MediaElementMediaPlayer はどちらも、Independent モードと Clock モードの 2 つの異なるメディア モードで使用できます。 メディア モードは、Clock プロパティによって決まります。 Clocknull の場合、メディア オブジェクトは Independent モードになります。 Clock が null 以外の場合、メディア オブジェクトは Clock モードになります。 既定では、メディア オブジェクトは Independent モードになっています。

Independent モード

Independent モードでは、メディア コンテンツがメディアの再生を行います。 Independent モードには、次のオプションがあります。

  • メディアの Uri は直接指定できます。

  • メディアの再生を直接制御できます。

  • メディアの Position および SpeedRatio プロパティは変更できます。

メディアを読み込むには、MediaElement オブジェクトの Source プロパティを設定するか、MediaPlayer オブジェクトの Open メソッドを呼び出します。

Independent モードでメディアの再生を制御するには、メディア オブジェクトの制御メソッドを使用できます。 使用できる制御メソッドは、PlayPauseCloseStop です。 MediaElement の場合、これらのメソッドを使用した対話型コントロールは、LoadedBehaviorManual に設定されている場合にのみ使用できます。 メディア オブジェクトが Clock モードの場合、これらのメソッドは使用できません。

Independent モードの例については、「MediaElement (再生、一時停止、停止、ボリューム、および速度) を制御する」を参照してください。

Clock モード

Clock モードでは、MediaTimeline によってメディアが再生されます。 Clock モードには次の特徴があります。

  • メディアの Uri は、MediaTimeline を使用して間接的に設定されます。

  • メディアの再生は、クロックによって制御できます。 メディア オブジェクトの制御メソッドは使用できません。

  • メディアを読み込むには、MediaTimeline オブジェクトの Source プロパティを設定し、タイムラインからクロックを作成し、メディア オブジェクトにクロックを割り当てます。 Storyboard 内の MediaTimelineMediaElement を対象としている場合も、この方法でメディアが読み込まれます。

Clock モードでメディアの再生を制御するには、ClockController 制御メソッドを使用する必要があります。 ClockControllerMediaClockClockController プロパティから取得されます。 Clock モードで MediaElement または MediaPlayer のいずれかのオブジェクトの制御メソッドを使用しようとすると、InvalidOperationException がスローされます。

クロックとタイムラインの詳細については、「アニメーションの概要」を参照してください。

Clock モードの例については、「ストーリーボードを使用して MediaElement を制御する」を参照してください。

MediaElement クラス

アプリケーションへのメディアの追加は簡単であり、MediaElement コントロールをアプリケーションのユーザー インターフェイス (UI) に追加し、含めるメディアに Uri を指定するだけです。 Microsoft Windows Media Player 10 でサポートされているメディアの種類はすべて、Windows Presentation Foundation (WPF) でサポートされます。 次の例は、 Extensible Application Markup Language (XAML) での MediaElement の簡単な使用法を示しています。

<!-- This page shows a simple usage of MediaElement -->
<Page x:Class="MediaElementExample.SimpleUsage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="SimpleUsage"
    >
  <StackPanel Margin="20">
    <MediaElement Source="media/numbers-aud.wmv" />
  </StackPanel>
</Page>

このサンプルでは、メディアは、読み込まれるとすぐに自動的に再生されます。 メディアの再生が終了すると、メディアが閉じられ、すべてのメディア リソースが解放されます (ビデオ メモリを含みます)。 これは MediaElement オブジェクトの既定の動作であり、LoadedBehavior および UnloadedBehavior プロパティによって制御されます。

MediaElement の制御

LoadedBehavior および UnloadedBehavior プロパティでは、IsLoaded がそれぞれ true または false である場合の MediaElement の動作を制御します。 MediaState では、メディアの再生動作に影響を与えるようにプロパティが設定されます。 たとえば、既定の LoadedBehaviorPlay、既定の UnloadedBehaviorClose です。 つまり、MediaElement が読み込まれ、プリロールが完了するとすぐに、メディアの再生が開始されます。 再生が完了すると、メディアが閉じられ、すべてのメディア リソースが解放されます。

LoadedBehavior および UnloadedBehavior プロパティだけが、メディアの再生を制御する方法ではありません。 Clock モードでは、クロックが MediaElement を制御でき、また、LoadedBehaviorManual の場合は対話型制御メソッドが制御を行います。 この制御の競合は、MediaElement が次の優先順位を評価することによって処理されます。

  1. UnloadedBehavior. メディアがアンロードされているときに有効です。 これにより、MediaClockMediaElement に関連付けられている場合でも、既定ですべてのメディア リソースが解放されます。

  2. MediaClock. メディアにClockがあるときに有効です。 メディアがアンロードされると、UnloadedBehaviorManual である限り、MediaClock が有効になります。 Clock モードは常に、MediaElement の読み込み動作より優先されます。

  3. LoadedBehavior. メディアが読み込まれているときに有効です。

  4. 対話型の制御メソッド。 LoadedBehaviorManual の場合に有効です。 使用できる制御メソッドは、PlayPauseCloseStop です。

MediaElement の表示

MediaElement を表示するには、表示するコンテンツが必要です。また、コンテンツが読み込まれるまで、ActualWidth および ActualHeight プロパティは 0 に設定されます。 オーディオのみのコンテンツでは、これらのプロパティは常に 0 です。 ビデオ コンテンツの場合、MediaOpened イベントが発生すると、ActualWidthActualHeight が、読み込まれたメディアのサイズを報告します。 つまり、メディアが読み込まれるまでは、Width または Height プロパティが設定されていない限り、MediaElement によってユーザー インターフェイス (UI) 内の物理的な領域が占有されることはありません。

WidthHeight の両方のプロパティを設定すると、メディアが拡張され、MediaElement 用に用意された領域がいっぱいになります。 メディアの元の縦横比を維持するには、Width または Height のいずれか一方 (両方ではなく) のプロパティを設定します。 WidthHeight の両方のプロパティを設定すると、メディアが固定した要素サイズで表示されることになり、これは望ましくない場合があります。

要素のサイズが固定されることを避けるために、Windows Presentation Foundation (WPF) では、メディアをプリロールすることができます。 これを行うには、LoadedBehaviorPlay または Pause に設定します。 Pause 状態では、メディアがプリロールされ、最初のフレームが表示されます。 Play 状態では、メディアがプリロールされ、再生が開始されます。

MediaPlayer クラス

MediaElement クラスがフレームワーク要素の場合、MediaPlayer クラスは Drawing オブジェクトで使用されるように設計されています。 描画オブジェクトは、パフォーマンス上の利点を得るためにフレームワーク レベルの機能を犠牲にできる場合、または Freezable の機能が必要な場合に使用されます。 MediaPlayer を使用すると、アプリケーションにメディア コンテンツを提供すると同時に、これらの機能を利用できます。 MediaElement と同様に、MediaPlayer は Independent または Clock モードで使用できますが、MediaElement オブジェクトのアンロード状態と読み込み状態はありません。 これにより、MediaPlayer の再生制御の複雑さが軽減されます。

Media Player の制御

MediaPlayer はステートレスであるため、メディアの再生を制御する方法は 2 つのみです。

  1. 対話型の制御メソッド。 Independent モード (nullClock プロパティ) のときに有効です。

  2. MediaClock. メディアにClockがあるときに有効です。

MediaPlayer の表示

技術的には、MediaPlayer には物理表現がないため、表示することはできません。 ただし、これを使用すると、VideoDrawing クラスを使用して Drawing でメディアを表示できます。 次の例は、VideoDrawing を使用してメディアを表示する方法を示しています。

//
// Create a VideoDrawing.
//
MediaPlayer player = new MediaPlayer();

player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));

VideoDrawing aVideoDrawing = new VideoDrawing();

aVideoDrawing.Rect = new Rect(0, 0, 100, 100);

aVideoDrawing.Player = player;

// Play the video once.
player.Play();

Drawing オブジェクトの詳細については、「Drawing オブジェクトの概要」をご覧ください。

関連項目