• 感谢您的阅读。喜欢的、有用的就请大哥大嫂们高抬贵手“推荐一下”吧!你的精神支持是博主强大的写作动力以及转载收藏动力。欢迎转载!
  • 版权声明:本文原创发表于 【请点击连接前往】 ,未经作者同意必须保留此段声明!如有侵权请联系我删帖处理!
  • 我的博客:http://www.cnblogs.com/GJM6/  -  传送门:【点击前往

前言(蛋疼的背景故事) 【原贴转载】

  前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 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,如图:

GJM :自定义基于 VLC 的视频播放器 [转载]的更多相关文章

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

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

  2. 自定义基于 VLC 的视频播放器

    前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...

  3. 基于VLC的视频播放器

    原文:基于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. Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发

    hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为 ...

  2. viewpage listview gridview加载本地大图多图OOM处理办法

    很少上博客园写东西了. 最近在写公司项目,由于需要加载本地相册通过viewpager方式来加载, 最后发现直接进入界面就OOM了. 经过几天的整理最终搞定. 现在将加载本地和加载网络图片的缓存工具类贴 ...

  3. mac下网页中文字体优化

    最近某人吐槽某门户网站在mac下chrome字体超丑,然后发现虽然现在mac用户越来越多,但是大家依然无视mac下的字体差异,于是研究了下mac下网页中的中文字体,和大家分享. 看了一遍国内各大门户和 ...

  4. sys.dm_db_wait_stats

    sys.dm_db_wait_stats 返回在操作期间执行的线程所遇到的所有等待的相关信息. 可以使用此聚合视图来诊断 Azure SQL Database 以及特定查询和批处理的性能问题. 执行查 ...

  5. 深入理解CSS变形transform(3d)

    × 目录 [1]坐标轴 [2]透视 [3]变形函数 [4]透视函数 [5]变形原点 [6]背景可见 [7]变形风格 前面的话 本文将详细介绍关于transform变形3D的内容,但需以了解transf ...

  6. AngularJs ui-router 路由的简单介绍

    之前有写过一篇关于Angular自带的路由:ngRoute.今天来说说Angular的第三方路由:ui-router.那么有人就会问:为什么Angular有了自带的路由,我们还需要用ui-router ...

  7. ASP.NET将Session保存到数据库中

    因为ASP.NET中Session的存取机制与ASP相同,都是保存在进行中, 一旦进程崩溃,所有Session信息将会丢失,所以我采取了将Session信息保存到SQL Server中,尽管还有其它的 ...

  8. golang在Windows下Sublime Text开发调试环境的配置

    一.前言 近期本人有工作调动,进入了一个全新的领域[golang]服务端开发.在此写下本文,希望给那些没接触过golang开发调试环境及还在犹豫选择那家golang IDE而纠结的朋友们一点点帮助,如 ...

  9. Gradify - 提取图片颜色,创建响应式的 CSS渐变

    被请求的HTTP对象之间的延迟会有一个时间段,这个期间网页看起来不完整.Gradify 可以分析出图像中4个最常见的颜色,创建一个梯度(或纯色)作为图片占位符.Gradify 可以在在任何图像发现最突 ...

  10. 应用 CSS3 动画实现12种风格的通知提示

    今天我们想分享几个简单的款式的网站通知效果.有很多的方式来呈现消息给用户:从经典的咆哮般的通知到窗口顶部的通知栏.各个网站的通知样式和效果千篇一律,难得出现创意的通知效果.这里是实现一个应用 CSS3 ...