WPF中的视频——(2)
由于MediaPlayer是为程序代码设计的,为了让MediaPlayer加载的媒体能够显示出来,必须使用VideoDrawing或DrawingContext。
VideoDrawing类是用来将播放的媒体绘制到指定的矩形中。通过MediaPlayer打开和播放媒体文件,而将创建的MediaPlayer对象赋给VideoDrawing的Player属性就可以实现视频绘制。
前台代码如下:
<Grid>
<Grid.Background>
<DrawingBrush>
<DrawingBrush.Drawing>
<VideoDrawing x:Name="video" Rect="0 0 1920 1080"/>
</DrawingBrush.Drawing>
</DrawingBrush>
</Grid.Background>
</Grid>
后台代码如下:
void Window1_Loaded(object sender, RoutedEventArgs e)
{
MediaPlayer player = new MediaPlayer();
player.Open(new Uri(@"C:"Users"Public"Videos"Sample Videos"bear.wmv"));
video.Player = player;
player.Play();
}
性能说明:VideoDrawing提供的功能比MediaElement少:VideoDrawing不支持布局、输入或焦点。但是,因为VideoDrawing不支持这些功能,所以它具备一些性能优点,并使这些优点特别适合于描绘背景和剪贴画以及采用Visual对象进行低级别的绘制操作。
VideoDrawing和MediaPlayer一起播放视频文件,第一种方式就是上面提到的。另一种方式是创建MediaTimeline,并将其与MediaPlayer和VideoDrawing一起使用。两者区别是:第一种方式MediaPlayer工作在独立模式,可以使用自己的交互式方法(Play、Pause、Stop等);第二种方式MediaPlayer工作在时钟模式,需要使用MediaTimeline创建的MediaClock的Controller属性返回的交互式ClockController控制媒体播放,且可以对媒体进行更多的计时控制,包括指定是否重复播放视频,播放的时间和开始时间等。
使用第二种方式播放视频,前台代码相同,后台代码如下:
void Window1_Loaded(object sender, RoutedEventArgs e)
{
MediaTimeline timeline = new MediaTimeline(new Uri(@"C:"Users"Public"Videos"Sample Videos"bear.wmv"));
timeline.RepeatBehavior = RepeatBehavior.Forever;
MediaClock clock = timeline.CreateClock();
MediaPlayer player = new MediaPlayer();
player.Clock = clock;
video.Player = player;
player.Clock.Controller.Begin();
}
DrawingContext用于保留模式图形系统,使用DrawingContext对象的绘图命令进行进行绘制。绘制的一系列呈现指令供图形系统以后使用,而不是实时的绘制到屏幕上。永远不能直接实例化DrawingContext对象,需要使用DrawingVisual.RenderOpen或DrawingGroup.Open等某些方法获取绘图上下文。
使用DrawingVisual.RenderOpen时:
前台代码:
<Grid>
<Grid.Background>
<VisualBrush x:Name="brush"/>
</Grid.Background>
</Grid>
后台代码:
void Window1_Loaded(object sender, RoutedEventArgs e)
{
DrawingVisual visual = new DrawingVisual();
MediaPlayer play = new MediaPlayer();
play.Open(new Uri(@"C:"Users"Public"Videos"Sample Videos"bear.wmv"));
DrawingContext dc = visual.RenderOpen();
dc.DrawVideo(play, new Rect(0, 0, 1920, 1080));
play.Play();
dc.Close();
brush.Visual = visual;
}
使用DrawingGroup.Open时:
前台代码:
<Grid>
<Grid.Background>
<DrawingBrush x:Name="brush"/>
</Grid.Background>
</Grid>
后台代码:
void Window1_Loaded(object sender, RoutedEventArgs e)
{
DrawingGroup group = new DrawingGroup();
DrawingContext dc = group.Open();
MediaPlayer play = new MediaPlayer();
play.Open(new Uri(@"C:"Users"Public"Videos"Sample Videos"bear.wmv"));
dc.DrawVideo(play, new Rect(0, 0, 1920, 1080));
play.Play();
dc.Close();
brush.Drawing = group;
}