MediaElement and MediaPlayer

WPFでビデオやオーディオなどのメディアを再生するには、多くの場合次のようにMediaElementを使います。MediaElementはStackPanelやCanvasレイアウト上に配置できるので、単独で使えて便利です。

<MediaElement Source = "..\..\intro.wmv" Width="300" Height="200" />

WPFには、もう一つのメディア再生用の要素として、MediaPlayerがあります。これはMediaElementと違って、レイアウト上に単独では使えず、DrawingBrushと組み合わせて使います。つまり、メディアで何らかの形状を塗りつぶすときに使います。また、MediaPlayer要素はXAML内で記述できません、次のようにC#などのコードビハインドで記述します。

<Rectangle Width="300" Height="200" Stroke="Black" MouseDown="OnClick1">
  <Rectangle.Fill>
    <DrawingBrush>
      <DrawingBrush.Drawing>
        <VideoDrawing x:Name="MyVideoDrawing"  Rect="0,0,300,200" />
      </DrawingBrush.Drawing>
    </DrawingBrush>
  </Rectangle.Fill>
</Rectangle>

void OnClick1(object sender, RoutedEventArgs e)
{
    MediaPlayer MyPlayer = new MediaPlayer();
    MyPlayer.Open(new Uri(@"..\..\intro.wmv", UriKind.Relative));
    MyVideoDrawing.Player = MyPlayer;
    MyPlayer.Play();
}   

MediaElementとVisualBrushを使えば、同じことがXAMLだけで実現できます。わざわざMediaPlayer要素を使うメリットはなんでしょうか?実は、MediaPlayer+DrawingBrushを使うと(あるいはMediaElement単独だと)、内部での(レンダラによってはGPUでの)コピー回数を、MediaElement+VisualBrushより1回減らすことができます。小さなビデオでは問題にならないかもしれませんが、HDビデオや多数のビデオを同時再生するような場合には、効果があるかもしれません。