WPF中的视频——(2)

          由于MediaPlayer是为程序代码设计的,为了让MediaPlayer加载的媒体能够显示出来,必须使用VideoDrawingDrawingContext

          VideoDrawing类是用来将播放的媒体绘制到指定的矩形中。通过MediaPlayer打开和播放媒体文件,而将创建的MediaPlayer对象赋给VideoDrawingPlayer属性就可以实现视频绘制。

前台代码如下:

    <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对象进行低级别的绘制操作。

          VideoDrawingMediaPlayer一起播放视频文件,第一种方式就是上面提到的。另一种方式是创建MediaTimeline,并将其与MediaPlayerVideoDrawing一起使用。两者区别是:第一种方式MediaPlayer工作在独立模式,可以使用自己的交互式方法(PlayPauseStop等);第二种方式MediaPlayer工作在时钟模式,需要使用MediaTimeline创建的MediaClockController属性返回的交互式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.RenderOpenDrawingGroup.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;

    }

posted on 2009-03-12 23:21  xirihanlin  阅读(3417)  评论(0编辑  收藏  举报