前言(蛋疼的背景故事)

  前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 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. HTML URL地址解析

    通过JavaScript的location对象,可获取URL中的协议.主机名.端口.锚点.查询参数等信息. 示例 URL:http://www.akmsg.com/WebDemo/URLParsing ...

  2. 结合Jexus + Kestrel 部署 asp.net core 生产环境

    ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依赖. 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: ...

  3. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  4. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  5. 【Web动画】SVG 实现复杂线条动画

    在上一篇文章中,我们初步实现了一些利用基本图形就能完成的线条动画: [Web动画]SVG 线条动画入门 当然,事物都是朝着熵增焓减的方向发展的,复杂线条也肯定比有序线条要多. 很多时候,我们无法人工去 ...

  6. 如何将VCSA添加到微软域控环境,并且实现微软域账号登陆vCenter

    v:* { } o:* { } w:* { } .shape { } p.msonormal,li.msonormal,div.msonormal { margin: 0cm; margin-bott ...

  7. Spark踩坑记——初试

    [TOC] Spark简介 整体认识 Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apach ...

  8. 自己来实现一个简易的OCR

    来做个简易的字符识别 ,既然是简易的 那么我们就不能用任何的第三方库 .啥谷歌的 tesseract-ocr, opencv 之类的 那些玩意是叼 至少图像处理 机器视觉这类课题对我这种高中没毕业的人 ...

  9. Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题

    现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...

  10. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...