先从VS的工具箱里添加Windows Media Player组件

时间:2022-04-26 08:55:39

在项目中遇到过这样的问题,就是如安在Winform中播放视频。其时考察了几种方法,第一种是直接使用Windows Media Player组件,这种最简单;第二种是操作DirectX直接在窗体或者控件上绘图,这种对照庞大。于是给与的是第一种要领。

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

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

先界说一个动静过滤类,用来屏蔽指定区域的鼠标双击或者单击动静。然后在应用措施中加载此过滤器即可实现屏蔽动静成果。

1 public class MessageFilterMgr : IMessageFilter 2 { 3 Rectangle Rect; 4 public MessageFilterMgr(Rectangle rect) 5 { 6 Rect = rect; 7 } 8 9 public void Start() 10 { 11 Application.AddMessageFilter(this); 12 } 13 14 public void Stop() 15 { 16 Application.RemoveMessageFilter(this); 17 } 18 19 public bool PreFilterMessage(ref System.Windows.Forms.Message SystemMessage) 20 { 21 if (SystemMessage.Msg >= 513 && SystemMessage.Msg <= 515) //513|515是对应方针动静的值 22 { 23 if (Control.MousePosition.Y > Rect.Y && Control.MousePosition.Y < Rect.Y + Rect.Height 24 && Control.MousePosition.X > Rect.X && Control.MousePosition.X < Rect.X + Rect.Width) 25 { 26 return true; 27 } 28 } 29 return false; //响应则为false 30 } 31 }

鼠标点击问题已经解决,此刻剩下最后一个问题了,就是如何实现视频持续播放成果。开始我使用Window Media Player的状态转变事件来控制,即当播放器的状态转变时,发明它是遏制状态,顿时发送播放下一个视频的指令,,此种要领控制对照繁琐,视频之间停马上间有点长(约莫0.4秒的样子)。后来改为使用播放列表,直接界说播放列表让其自动循环播放。实现如下:

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

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

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

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

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