マルチメディアの概要

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

メディア API

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

MediaElementは、UIElementでサポートされるであり、多くのコントロールのコンテンツとして使用できます。 また、拡張アプリケーション マークアップ言語 (XAML) とコードでも使用できます。 MediaPlayer一方、 Drawing オブジェクト用に設計されており、レイアウトのサポートがありません。 MediaPlayerを使用して読み込まれたメディアは、VideoDrawingを使用するか、DrawingContextと直接対話することによってのみ表示できます。 MediaPlayer XAML では使用できません。

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

注

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

メディア再生モード

注

MediaElementとMediaPlayerの両方に同様のメンバーがあります。 このセクションのリンクは、 MediaElement クラス メンバーを参照します。 特に明記されていない限り、 MediaElement クラスにリンクされているメンバーは、 MediaPlayer クラスでも見つけることができます。

Windows Presentation Foundation (WPF) でのメディア再生を理解するには、メディアを再生できるさまざまなモードを理解する必要があります。 MediaElementとMediaPlayerの両方を、独立モードとクロック モードの 2 つの異なるメディア モードで使用できます。 メディア モードは、 Clock プロパティによって決まります。 Clockがnullされると、メディア オブジェクトは独立モードになります。 Clockが null 以外の場合、メディア オブジェクトはクロック モードになります。 既定では、メディア オブジェクトは独立モードです。

独立モード

独立モードでは、メディア コンテンツによってメディアの再生が促進されます。 独立モードでは、次のオプションが有効になります。

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

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

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

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

メディアの再生を独立モードで制御するには、メディア オブジェクトの制御メソッドを使用できます。 使用できる制御メソッドは、 Play、 Pause、 Close、および Stopです。 MediaElementの場合、これらのメソッドを使用した対話型コントロールは、LoadedBehaviorがManualに設定されている場合にのみ使用できます。 メディア オブジェクトがクロック モードの場合、これらのメソッドは使用できません。

独立モードの例については、「 MediaElement の制御 (再生、一時停止、停止、音量、速度)」 を参照してください。

クロック モード

クロック モードでは、 MediaTimeline がメディアの再生を駆動します。 クロック モードには、次の特性があります。

  • メディアの Uri は、 MediaTimelineによって間接的に設定されます。

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

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

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

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

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

MediaElement クラス

アプリケーションへのメディアの追加は、アプリケーションのユーザー インターフェイス (UI) に MediaElement コントロールを追加し、含めるメディアに Uri を提供するのと同じくらい簡単です。 Microsoft Windows Media Player 10 でサポートされているすべてのメディアの種類は、Windows Presentation Foundation (WPF) でサポートされています。 次の例は、拡張アプリケーション マークアップ言語 (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 プロパティは、MediaElementがIsLoadedまたはtrueされたときのfalseの動作をそれぞれ制御します。 メディアの再生動作に影響するようにプロパティが設定されている MediaState 。 たとえば、既定の LoadedBehavior は Play で、既定の UnloadedBehavior は Close。 つまり、 MediaElement が読み込まれ、プリロールが完了すると、メディアの再生が開始されます。 再生が完了すると、メディアは閉じられ、すべてのメディア リソースが解放されます。

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

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

  2. MediaClock。 メディアにClockがある場合の場所。 メディアがアンロードされると、MediaClockがUnloadedBehaviorされている限り、Manualが有効になります。 クロック モードは常に、 MediaElementの読み込まれた動作をオーバーライドします。

  3. LoadedBehavior。 メディアが読み込まれるときに設定されます。

  4. 対話型の制御メソッド。 LoadedBehaviorがManualされている場合はインプレース。 使用できる制御メソッドは、 Play、 Pause、 Close、および Stopです。

MediaElement の表示

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

WidthプロパティとHeightプロパティの両方を設定すると、メディアがストレッチされ、MediaElementに指定された領域が塗りつぶされます。 メディアの元の縦横比を維持するには、 Width または Height プロパティを設定する必要がありますが、両方を設定する必要はありません。 WidthプロパティとHeightプロパティの両方を設定すると、メディアは固定の要素サイズで表示され、望ましくない可能性があります。

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

MediaPlayer クラス

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

MediaPlayer の制御

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

  1. 対話型の制御メソッド。 独立モード (nullClock プロパティ) の場合は適用されます。

  2. MediaClock。 メディアにClockがある場合の場所。

MediaPlayer の表示

技術的には、物理的な表現がないため、 MediaPlayer を表示できません。 ただし、Drawing クラスを使用して、VideoDrawingでメディアを表示するために使用できます。 次の例では、 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」を参照してください。

こちらも参照ください