在项目中遇到过这样的问题,就是如何在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),想要支持更多的视频格式,只能通过安装视频解码器来实现。

在Winform中播放视频等【DotNet,C#】的更多相关文章

  1. WinForm中播放视频示例(含源码)

    1背景 这几天一老友要求我做个小软件,在WinForm播放视频.印象中微软有个WM控件直接可以使用,晚上研究下 2实现方式 2.1微软草根 最简单的方式,是直接使用微软的WM控件,也是通过COM方式集 ...

  2. unity中播放视频

    unity中播放视频步骤如下: 1.将要播放的视频拖入projec.(注意:unity一般支持的视频格式有mov, .mpg, .mpeg, .mp4,.avi, .asf格式  ) 2.在场景中添加 ...

  3. Unity3D中播放视频的方法

    播放视频其实和贴图非常相像,因为播放视频用到的 MovieTexture 属于贴图 Texture 的子类.Unity3D 支持的视频格式有很多,但是还是建议使用 ogv 格式的视频,使用其他格式依然 ...

  4. 用flvplayer.swf在网页中播放视频(网页中flash视频播放的实现)

    原:http://blog.csdn.net/ricciozhang/article/details/46868201 由于公司项目的需求,需要在展示一些信息的时候能够播放视频,拿到这个要求,我就从最 ...

  5. Opencv从文件中播放视频

    1.VideoCapture()括号中写视频文件的名字,在播放每一帧的时候,使用cv2.waitKey()设置适当的持续时间,太低会播放的很快,太高会很慢,通常情况下25毫秒就行了. 2.获取相机/视 ...

  6. android SurfaceView中播放视频 按视频的原始比例播放

    OnPreparedListener mediaPlayerOnPreparedListener = new OnPreparedListener() { @Override public void ...

  7. 1.QT中播放视频,录音程序的编写

     1  通过process的方式播放视频 T22VideoPlayer.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gu ...

  8. 使用 JS 嵌入的方式来加载 Flash 插件,在各浏览器中播放视频

    嵌入插件 使用 object 和 embed 标签 这种方法用到的是 Object 和 Embed 标签,可以看到 object 的很多参数和 embed 里面的很多属性是重复的.浏览器兼容性,有的浏 ...

  9. C#WinForm中播放背景音乐(亲测可用)

    using System.Runtime.InteropServices; public static uint SND_ASYNC = 0x0001; public static uint SND_ ...

随机推荐

  1. high三个晚上这样好么-JSON&PHP

    hi 昨晚上吃火锅去了,对,你没猜错,我就是在成都 今晚有师兄请客,明天有基友请吃火锅,本来该忙忙哒的这一周要连续high三个晚上么(单身研究生狗就是这么容易满足).所以只好不务正业写写写了(写不动了 ...

  2. 【原】js实现复制到剪贴板功能,兼容所有浏览器

    两天前听了一个H5的分享,会议上有一句话,非常有感触:不是你不能,而是你对自己的要求太低.很简单的一句话,相信很多事情不是大家做不到,真的是对自己的要求太低,如果对自己要求多一点,那么你取得的进步可能 ...

  3. c++ learning note

    1/  int 转换成 string 格式 #include<sstream> std::stringstream ss; str::string temp; int n; ss<& ...

  4. 第16章 调色板管理器_16.4 一个DIB位图库的实现(1)

    16.4.1自定义的 DIBSTRUCT结构体 字段 含义 PBYTE *ppRow ①指向位图视觉上最上面的一行像素.(不管是自下而上,还是自上而下) ②放在第一个字段,为的是后面定义宏时可方便访问 ...

  5. Java写的斗地主游戏源码

    源码下载在最后 我们的前年的课设要求做一个斗地主程序,当时正在愁如何做界面,当时刚好在学习C#,于是就用C#完成了这个程序.一方面,当时我C#功底还很差(其实现在也不怎么样),很多地方用了“笨办法”, ...

  6. Android使用Java Mail API发送邮件

    最近在考虑为已经有的一个应用程序增加一个用户反馈的功能,用户可以通过反馈功能将用户的意见和建议.程序出现的问题以一种更符合用户习惯的方式反馈回来.网上也有一些实现好的反馈程序的服务,包括bug的提交. ...

  7. sublime text2 配置代码对齐快捷键

    menu under Preferences → Key Bindings – User [{"keys": ["ctrl+shift+r"], "c ...

  8. offsetLeft与offsetTop详解

    offsetLeft与offsetTop使用方法一样,只是一个是找距离定位父级(position:relative)左边的距离,一个是找距离定位父级上边的距离 没有定位则找body,我们还是看看ie7 ...

  9. three.js 之旅 (三)

    复制自:http://www.cnblogs.com/ssrsblogs/p/5611332.html 创建模型: 1.长方体: THREE.CubeGeometry(width, height, d ...

  10. 为EXSi5.5上的Centos虚机增加硬盘容量

    宿主机调整 1. 关闭虚机, 2. 检查是否有存在的snapshot, 如果有, 需要删除, 否则不能调整磁盘容量 3. 虚机上编辑配置, 将磁盘容量调大后保存 虚机调整 参考这篇写得非常详细: 点击 ...