前言(蛋疼的背景故事)
前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护)。
听到这个需求,我首先想到的是 MediaPlayer 和 Flash,因为这两个组件几乎所有 Windows 平台的电脑都会安装。但客户说不能用 Flash,原因是以前使用过,太不稳定,所以我决定使用 MediaPlayer。
MediaPlayer 做为一个 COM 组件可以很方便的加载到 VS 工具箱中,使用的时候直接拖放到 Form 上,用起来超级简单。而且,网上随便搜一下都有大把的示例。所以,进展很顺利。。。
后来,上线几天以后,问题来了。客户反应有一次下午下班,系统运行以后忘关了,第二天早上就只显示系统桌面,不确定什么时候“闪退”了。所以他们第二天就专门测试了待机问题,然后发现待机的时候很频繁的会出现闪退问题。。我当时直觉就是:一堆SB啊,别 TM 网上下载 GHO 镜象安装带着一堆病毒和插件的系统,别 TM 装个杀毒软件把老子进程给杀掉(因为我测试的时候程序里的某段操作代码被360当成病毒杀了,我以为也是杀毒软件的问题)。
我抱着对 Microsoft 无比信任的情怀,一边默默骂着SB,一边让他们用官方的 ISO 重装系统。并且要求不要安装杀毒软件或者在杀毒软件里把我的程序设为信任。同时,我重新检查了一下系统里的所有方法,确保所有的操作都都异常处理,并且,增加了 Application 级的异常处理。。然而,没什么卵用。
无奈,去现场调查。。他们果然没有忽悠我,正当我舒服的靠在椅子上欣赏我喜欢的那首MV的时候,程序没了,就那样直接没了,连一个错误消息都没有。做 .NET 这么久,一直信赖的异常处理机制竟然没起作用。。那感觉,就好像冬天的大早上突然被人掀了被子那样的渴求温暖,就好像脱光了正和妹子缠绵的时候妹子突然消失了的那种空洞。。。
后来,和他们仔细的确认了一下问题出现的频率。他们说这个问题出现的时间不定,有时候三四个小时,有时候六七个小时。有时候报错“***.exe 已停止运行”,有时候啥都没有,直接程序界面就消失了,仿佛从来没有启动过似的。。他们曾经换了一台电脑测试,问题更甚,有时候半个小时就会崩溃一次。
程序直接消失,异常捕获的代码肯定是没有执行,事实上也是,Log 都是突然中断,没有任何异常和关闭逻辑的日志。深入调查时,发现更奇葩的情况是这个错误连系统日志都不一定记录。。听他们反应这两天系统闪退过七八次,但是系统里关于这个应用的日志只有三条,而且没有刚才我看到的那次闪退的任何日志记录。。只是在其中一个错误记录里,查到的错误代码说是“组件异常”。。组件,那只有 MediaPlayer 了。。。
百度、Google、Bing、360搜索,然而并没有什么卵用。。网上大多是对 MediaPlayer 组件的介绍和易用性、便捷性的赞美,就是那种能教会小白们写一个简单的播放窗体的那种满满的成就感,一点深入的线索都没找到。。
无奈,决定放弃 MediaPlayer。
后来,找到了一个博客中介绍的 VLC Player(不过我忘了具体是哪位前辈的文章了)。
按博客里的介绍,下载了组件,写了一个简单的Demo,然后加入系统,运行起来貌似好多了。只是后来他们反应有一个 MV 播放到某个时间点的时候,会报错,又查资料,终于在一个EN文网站上查到原因说是版本问题,下载最新的 VLC Player ,拿到最新的库使用就行了。
然后,下载了 VLC Player ,安装,在安装目录里找到最新的 DLL 和插件包,覆盖到项目里,果然再没出现闪退的问题。
又可以懒洋洋的靠在椅背上喝着客户公司漂亮妹子做好的咖啡装逼了,顺便欣赏着咖啡上心形的拉花,YY着妹子丰满的身材。。。
正文开始
VLC Player 是一个功能非常非常强大的播放器,界面低调简洁,完全不像其它播放器那样有一个风骚又混乱的外观。
再看它支持播放的媒体文件格式,完甩 MediaPlayer 几十条街:
在 GitHub 上有一个关于 VLC Player 的开源项目,叫 Vlc.DotNet,貌似也是基于播放器里的 DLL 封装的类库,地址是:https://github.com/ZeBobo5/Vlc.DotNet 。这个类库功能很强大,但是功能强大也意味着比较复杂。我没有使用这个程序包,而是网上找了一个简单的直接映射 DLL 库函数的方式实现的播放功能。
第一步:获取 VLC 类库。
获取 VLC 类库有两种方式:
1,从上面那个开源项目 Vlc.DotNet 里,可以下载到整个项目的源码和所用到的 VLC 库文件,我们这里只使用 VLC 的库文件,如图:
(为了以防客户32位和64位系统一起使用,所以这里使用了32位的库x86)
2,下载一个 VLC 播放器,安装,然后在安装目录里能找到需要的类库,如图:
我们只需要 libvlc.dll、libvlccore.dll 和 plugins 目录,所以可以忽略其它文件。
libvlc.dll、libvlccore.dll 文件中是 VLC 的库函数,plugins 目录里是 VLC 对各种不同媒体文件提供支持的插件。
第二步:映射、封装 dll 库函数。
libvlc.dll、libvlccore.dll 这两个不是.NET 类库,所以没办法直接引用到我们的项目里,这里我参考其他前辈们的示例,对其进行封装,方便使用。
因为代码较长,所以这里不直接贴出来了,需要的朋友可以在这里下载 https://files.cnblogs.com/files/zhhh/VlcPlayerBase.zip
代码里封装了 播放、暂停、停止、音量控制、进度控制等一些常用功能,以便后面使用。
第三步:使用
封装完以后就可以直接调用了,设计一个简单的界面。如图:
添加相应的功能,就OK了。
项目代码可以从下面链接下载:https://files.cnblogs.com/files/zhhh/VlcPlayer.zip
第四步:装逼
最后,项目运行之前,一定要将前面我们准备好的库文件(libvlc.dll、libvlccore.dll 和 plugins 目录) Copy 到程序运行根目录,比如 Debug 目录,如图:
Copy 完,就可以装逼了。
运行 -> 打开 -> 播放,非常完美,Pen Pineapple Apple Pen:
最后
DLL 实际上是使用 VLC 的参数对播放器进行的配置和操作,对于这些参数的介绍,可以参考 VLC Player 安装目录下的 帮助文件 vlc-help.txt,如图: