首页 > Windows > 使用libVLC实现的播放器:支持双击全屏
2015
11-23

使用libVLC实现的播放器:支持双击全屏

背景

最近在学习duilib这个库,看了网上Alberl的教程,他那个仿迅雷播放器做的不错,我就直接拿来学习duilib了。不过这个播放器有个缺点,就是无法双击全屏,也就是鼠标放到libVLC播放窗口时无法响应消息,消息都被libVLC内部处理了。这对我们而言不是很方便。因为有时我们需要双击全屏,或者弹出鼠标右键菜单做一些操作。后来上网查了下,好多人遇到这个问题。下面是一些查到的解决方法。

解决libVLC无法响应鼠标消息

如下是查到的一些方法:
1)使用全局钩子;
2)修改libVLC鼠标消息处理代码,重新编译;
3)禁用子窗口消息。
第一种方法不安全,容易被杀毒软件干掉,而且效率不高,第二种方法麻烦,编译就得花你好多时间,而且很麻烦,第三种方法比较简单,解决方法如下:

具体实现见下面。

基于duilib实现

duilib学起来还是很容易上手的,这里我的代码是基于Alberl的仿迅雷播放器。最后实现的界面如下:
使用libVLC实现的播放器:支持双击全屏 - 第1张  | Jianchihu

按照上面的解决方法,在这个程序中我是这么解决无法响应消息的:
1)当开始播放某个文件后,创建一个一秒的定时器;

2)在定时器的回调函数中枚举得到VLC创建的窗口的句柄,通过spy++可以了解到libVLC创建的播放窗口名为:VLC video output,获取到VLC窗口的句柄后使用EnableWindow函数禁用掉键鼠输入,EnableWindow函数的作用是允许/禁止指定的窗口或控件接受鼠标和键盘的输入,代码如下:

通过如上方法,在VLC播放窗口上的鼠标键盘消息我们都可以获得,这样就可以去实现自己想要的功能。比如我在全屏时响应WM_MOUSEMOVE消息,实现底部播放面板自动隐藏。双击全屏也很简单,当响应双击消息时,只显示作为libvlc父窗口那个控件,其他控件都隐藏即可。整个播放器的代码我已经上传到Github,
地址:https://github.com/yjfxfjch/JCHPlayer
我是用的是VS2015编译,低版本VS可能无法直接打开编译。下面一节是使用MFC做界面实现的版本。

基于MFC实现

1)在MFC对话框程序中,首先添加一个控件,这里我添加了一个Picture Contron:IDC_PLAYWND;
2)获得IDC_PLAYWND控件句柄;

3)让libVLC播放对象设置gPlayHwnd 为播放窗口句柄,这样libVLC播放窗口就成为IDC_PLAYWND控件的子窗口;

4)开始播放后创建一个定时器;

5)定时器回调函数以及处理过程如下:

在上述代码中,我们通过之前得到的IDC_PLAYWND控件句柄枚举得到子窗口VLC播放窗口句柄,接着通过EnableWindow函数禁止VLC播放窗口接受鼠标键盘输入。这时我们的程序就可以响应鼠标点击libVLC播放窗口的消息了;
6)设置全屏,主要是设置IDC_PLAYWND控件全屏时占满整个屏幕,然后隐藏其他控件以及标题栏,这样VLC子窗口就可以全屏播放了。不需要使用libvlc_set_fullscreen这个内置api,使用这个api无法达到效果。
最后实现的简单版本如下:
使用libVLC实现的播放器:支持双击全屏 - 第2张  | Jianchihu

MFC版本支持双击全屏的libvlc播放器代码我也上传到Github,具体的可以去看下。
Github地址:https://github.com/yjfxfjch/SimpleVlcPlayer

最后编辑:
作者:Jianchihu
管理员——低调做事,低调做人

使用libVLC实现的播放器:支持双击全屏》有 8 条评论

  1. zhao 说:

    博主好厉害啊。。我最近也在研究VLC,可以加个好友吗,我的QQ770552117

  2. liwei 说:

    博主你好。我这使用vlc的webplugin做网页版的播放器,其中就需要js去获取鼠标点击事件。请问博主这个方法是否可以使用于html上。或者博主是否知道什么更好的方法。谢谢指教

    • Jianchihu 说:

      我这个是通过系统api实现的,js肯定没那么大权限,只能通过修改你vlc插件源代码了。现在web都不提倡用这种NPAPI插件或activex控件了,浏览器也都默认禁用。最好的方法是用js写一个,现在html5功能也够强大。你可以参考下flv.js,修改下,基本上各种协议都能实现播放。

  3. Jerry 说:

    hi,哥们,我从 https://github.com/yjfxfjch/JCHPlayer 这里下载,

    然后更新了下Duilib(https://github.com/qdtroy/DuiLib_Ultimate)库,

    发现播放时播放区域总是黑色,但是有进度在前进,请问下,这个可能是因为什么导致的? 

  4. Jerry 说:

    调试发现,class CWndUI: public CControlUI 中的setpos不会被调用,然后对比了您的duilib库,发现改动有点大,感觉应该是在消息回调这边可能您有做了些特殊处理,但是代码量有点,所以只能麻烦博主了

留下一个回复

你的email不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.