在Winform中播放视频等【DotNet,C#】

      在项目中遇到过这样的问题,就是如何在Winform中播放视频。当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单;第二种是利用DirectX直接在窗体或者控件上绘图,这种比较复杂。于是采用的是第一种方法。

      先从VS的工具箱里添加Windows Media Player组件,方式是打开工具箱,在最下面的空白处点击右键,选择项,然后在弹出的对话框里切换到Com组件标签项,找到“Windows Media Player”项并选中,确定后将在工具箱中看到多出一个图标,然后就可以将这个图标拖到窗体上进行设置了。

      在这里主要讲下,设置Windows Media Player组件时,有个属性是“无窗口播放”,如果不启用的话,在视频播放时点击鼠标的话,视频会切换到全屏状态,启用就不会发生。但启用的话,视频的清晰度会下降很多(颗粒感变得很明显),不启用鼠标点击又会放大。最初我采用定时将全屏属性改为False来实现,时钟设置成100毫秒或者更小,表现出来的就是用户双击视频后,屏蔽忽地一下变大然后又恢复原样,更危险的是此操作有一定机率(而且不低)会将XP的任务栏暴露出来(因为我们的终端是要全屏显示,不能让用户看到桌面及其它操作项的),于是我反复测试,最终采用的另外一种方式,即过滤窗体事件来直接屏蔽掉视频区域的鼠标消息。具体实现如下:

    先定义一个消息过滤类,用来屏蔽指定区域的鼠标双击或者单击消息。然后在应用程序中加载此过滤器即可实现屏蔽消息功能。

public class MessageFilterMgr : IMessageFilter
{
    Rectangle Rect;
    public MessageFilterMgr(Rectangle rect)
    {
        Rect = rect;
    }

    public void Start()
    {
        Application.AddMessageFilter(this);
    }

    public void Stop()
    {
        Application.RemoveMessageFilter(this);
    }

    public bool PreFilterMessage(ref System.Windows.Forms.Message SystemMessage)
    {
        if (SystemMessage.Msg >= 513 && SystemMessage.Msg <= 515) //513|515是对应目标消息的值
        {
            if (Control.MousePosition.Y > Rect.Y && Control.MousePosition.Y < Rect.Y + Rect.Height
                && Control.MousePosition.X > Rect.X && Control.MousePosition.X < Rect.X + Rect.Width)
            {
                return true;
            }
        }
        return false; //响应则为false
    }
}

      鼠标点击问题已经解决,现在剩下最后一个问题了,就是如何实现视频连续播放功能。开始我使用Window Media Player的状态改变事件来控制,即当播放器的状态改变时,发现它是停止状态,马上发送播放下一个视频的指令,此种方法控制比较繁琐,视频之间停顿时间有点长(大约0.4秒的样子)。后来改为使用播放列表,直接定义播放列表让其自动循环播放。实现如下:

this.Player.settings.setMode("loop", true);  // 将播放列表设置为循环播放
foreach (string item in this.Videos)
{
      this.Player.currentPlaylist.appendItem(this.Player.newMedia(item));  // 将视频逐个添加至播放列表
}

      最后,我们的终端又要实现视频与图片混合播放功能,即视频播放完毕后再播放图片,我也将实现方式归纳如下:

      在启动时取消将播放列表的循环播放;

      继续利用播放组件的状态改变事件,当播放器的状态为wmppsReady(当播放列表中视频数量大于1时)或者wmppsStopped(当播放列表中只有一个视频时)时,表示播放已经完毕,然后将播放组件隐藏,再启用图片自动切换程序,等图片切换完后,再将播放组件显示,启用播放。

      另,默认状态下,Windows Media Player支持的视频格式很有限(最佳之选是WMV),想要支持更多的视频格式,只能通过安装视频解码器来实现。

4条评论

  1. baye说道:

    public bool PreFilterMessage(ref System.Windows.Forms.Message SystemMessage)
    {
    if (SystemMessage.Msg >= 513 && SystemMessage.Msg Rect.Y && Control.MousePosition.Y Rect.X && Control.MousePosition.X < Rect.X + Rect.Width)
    {
    return true;
    }
    }
    return false; //响应则为false
    }
    主要是通过实现这个方法实现拦击点击事件的么?

    • Crazy说道:

      是的,是在Application里加了一个过滤器,来过滤当前应用程序接受到的所有消息,然后通过这个方法识别出应该响应的消息。

      • baye说道:

        正好用得上。
        下面的电子邮件能不能不用填啊?每次都要输入,很麻烦~~~~

        • Crazy说道:

          这是你正好昨天在家里回复,今天在公司回复的原因。
          回复时写的信息会保存在Cookie里的,所以你换电脑了就需要再输入一次。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注