前言(蛋疼的背景故事)

  前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 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 类库,所以没办法直接引用到我们的项目里,这里我参考其他前辈们的示例,对其进行封装,方便使用。

  因为代码较长,所以这里不直接贴出来了,需要的朋友可以在这里下载 http://files.cnblogs.com/files/zhhh/VlcPlayerBase.zip

  代码里封装了 播放、暂停、停止、音量控制、进度控制等一些常用功能,以便后面使用。

  
第三步:使用

  封装完以后就可以直接调用了,设计一个简单的界面。如图:

  添加相应的功能,就OK了。

  项目代码可以从下面链接下载:http://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,如图:

自定义基于 VLC 的视频播放器的更多相关文章

  1. GJM :自定义基于 VLC 的视频播放器 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  2. 基于VLC的视频播放器

    原文:基于VLC的视频播放器 最近在研究视频播放的功能,之前是使用VideoView.在网上看了一下,感觉不是很好,支持的格式比较少,现在网络视频的格式各种各样,感觉用VideoView播放起来局限性 ...

  3. 基于VLC的视频播放器(转载)

    最近在研究视频播放的功能,之前是使用VideoView.在网上看了一下,感觉不是很好,支持的格式比较少,现在网络视频的格式各种各样,感觉用VideoView播放起来局限性很大. 找到了一个比较合适的播 ...

  4. 转:最简单的基于 DirectShow 的视频播放器

    50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectSho ...

  5. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  6. 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器(图形界面版)

    ===================================================== 最简单的基于libVLC的例子文章列表: 最简单的基于libVLC的例子:最简单的基于lib ...

  7. 基于libVLC的视频播放器

    本文来自于:http://blog.csdn.net/leixiaohua1020/article/details/42363079 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放 ...

  8. 50行代码实现的一个最简单的基于 DirectShow 的视频播放器

    本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectShow 播放视频所有必备的函数. 直接贴上代码,具体代码的含义都写在注释中 ...

  9. 基于VLC的播放器开发

    VLC的C++封装 因为工作需要,研究了一段时间的播放器开发,如果从头开始做,可以学习下FFmpeg(http://www.ffmpeg.org/),很多播放器都是基于FFmpeg开发的,但是这样工作 ...

随机推荐

  1. 前端框架 EasyUI (2)页面布局 Layout

    在 Web 程序中,页面布局对应用程序的用户体验至关重要. 在一般的信息管理类的 Web 应用程序中,页面结构通常有一个主工作区,然后在工作区上下左右靠近边界的区域设置一些边栏,用于显示信息或放置一些 ...

  2. 我为什么要写LeetCode的博客?

    # 增强学习成果 有一个研究成果,在学习中传授他人知识和讨论是最高效的做法,而看书则是最低效的做法(具体研究成果没找到地址).我写LeetCode博客主要目的是增强学习成果.当然,我也想出名,然而不知 ...

  3. git-2.10.2-64-bit介绍&&git下载&&git安装教程

    Git介绍 分布式:Git系统是一个分布式的系统,是用来保存工程源代码历史状态的命令行工具. 保存点:Git的保存点可以追踪源码中的文件, 并能得到某一个时间点上的整个工程项目的状态:可以在该保存点将 ...

  4. javascript运动系列第一篇——匀速运动

    × 目录 [1]简单运动 [2]定时器管理 [3]分享到效果[4]移入移出[5]运动函数[6]透明度[7]多值[8]多物体[9]回调[10]函数完善[11]最终函数 前面的话 除了拖拽以外,运动也是j ...

  5. Android 工具-adb

    Android 工具-adb 版权声明:本文为博主原创文章,未经博主允许不得转载. Android 开发中, adb 是开发者经常使用的工具,是 Android 开发者必须掌握的. Android D ...

  6. C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能

    随着微信开逐步开放更多JSSDK的接口,我们可以利用自定义网页的方式来调用更多微信的接口,实现我们更加丰富的界面功能和效果,例如我们可以在页面中调用各种手机的硬件来获取信息,如摄像头拍照,GPS信息. ...

  7. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  8. BPM配置故事之案例5-必填与水印文本

    物资申请表改好了,但是没过两天老李又找来了. 老李:这个表格每次都是各个部门发给我们,再由我们采购部来填,太影响效率了,以后要让他们自己填. 小明:那就让他们填呗,他们有权限啊. 老李:可是他们说不会 ...

  9. React Native环境配置之Windows版本搭建

    接近年底了,回想这一年都做了啥,学习了啥,然后突然发现,这一年买了不少书,看是看了,就没有完整看完的.悲催. 然后,最近项目也不是很紧了,所以抽空学习了H5.自学啃书还是很无趣的,虽然Head Fir ...

  10. WiFi QC 自动测试:ixChariot API初探

    Chariot虽然给我们提供了友好的界面,但是必须使用命令行或者使用它的API才能 实现自动测试.Chariot在安装的时候会让你选择命令行界面组件,在它的安装目录下面有一些工具, 暂时还不知道是干什 ...