JCHub

  • Home
  • Category
    • A/V
    • WebRTC
    • Beauty of Programming
    • Linux
    • Windows
    • Moments of Life
    • Campus Life
  • Reference
    • API Reference
    • Utilities
    • AV Test
    • Doc
  • Message Board
  • About
音视频
A/V

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

背景 最近在学习duilib这个库,看了网上Alberl的教程,他那个仿迅雷播放器做的不错,我就直接拿来学习duilib了。不过这个播放器有个缺点,就是无法双击全屏,也就是鼠标放到libVLC播放窗口时无法响应消息,消息都被libVLC内部处理了。这对我们而言不是很方便。因为有时我们需要双击全屏,或者弹出鼠标右键菜单做一些操作。后来上网查了下,好多人遇到这个问题。下面是一些查到的解决方法。 解决libVLC无法响应鼠标消息 如下是查到的一些方法: 1)使用全局钩子; 2)修改libVLC鼠标消息处理代码,重新编译; 3)禁用子窗口消息。 第一种方法不安全,容易被杀毒软件干掉,而且效率不高,第二种方法麻烦,编译就得花你好多时间,而且很麻烦,第三种方法比较简单,解决方法如下: [crayon-69c7376c8c680654629703/] 具体实现见下面。 基于duilib实现 duilib学起来还是很容易上手的,这里我的代码是基于Alberl的仿迅雷播放器。最后实现的界面如下: 按照上面的解决方法,在这个程序中我是这么解决无法响应消息的: 1)当开始播放某个文件后,创建一个一秒的定时器(也可以不创建,直接跳到直接第二步,创建定时器是为了确保我们处理时VLC窗口已经生成); [crayon-69c7376c8c68f602869753/] 2)在定时器的回调函数中枚举得到VLC创建的窗口的句柄,通过spy++可以了解到libVLC创建的播放窗口名为:VLC video output,获取到VLC窗口的句柄后使用EnableWindow函数禁用掉键鼠输入,EnableWindow函数的作用是允许/禁止指定的窗口或控件接受鼠标和键盘的输入,代码如下: [crayon-69c7376c8c696125690952/] 通过如上方法,在VLC播放窗口上的鼠标键盘消息我们都可以获得,这样就可以去实现自己想要的功能。比如我在全屏时响应WM_MOUSEMOVE消息,实现底部播放面板自动隐藏。双击全屏也很简单,当响应双击消息时,只显示作为libvlc父窗口那个控件,其他控件都隐藏即可。整个播放器的代码我已经上传到Github。 地址:https://github.com/yjfxfjch/JCHPlayer 我是用的是VS2015编译,低版本VS可能无法直接打开编译。下面一节是使用MFC做界面实现的版本。 基于MFC实现 1)在MFC对话框程序中,首先添加一个控件,这里我添加了一个Picture Contron:IDC_PLAYWND; 2)获得IDC_PLAYWND控件句柄; [crayon-69c7376c8c69a535514619/] 3)让libVLC播放对象设置gPlayHwnd 为播放窗口句柄,这样libVLC播放窗口就成为IDC_PLAYWND控件的子窗口; [crayon-69c7376c8c69f658282762/] 4)开始播放后创建一个定时器(也可以不创建,直接EnableWindow相应窗口句柄); [crayon-69c7376c8c6a3863731263/] 5)定时器回调函数以及处理过程如下: [crayon-69c7376c8c6a7554372481/] 在上述代码中,我们通过之前得到的IDC_PLAYWND控件句柄枚举得到子窗口VLC播放窗口句柄,接着通过EnableWindow函数禁止VLC播放窗口接受鼠标键盘输入。这时我们的程序就可以响应鼠标点击libVLC播放窗口的消息了; 6)设置全屏,主要是设置IDC_PLAYWND控件全屏时占满整个屏幕,然后隐藏其他控件以及标题栏,这样VLC子窗口就可以全屏播放了。不需要使用libvlc_set_fullscreen这个内置api,使用这个api无法达到效果。 最后实现的简单版本如下: MFC版本支持双击全屏的libvlc播放器代码我也上传到Github,具体的可以去看下。 Github地址:https://github.com/yjfxfjch/SimpleVlcPlayer

2015年11月23日 15comments 11034hotness 12likes Jeff Read all
A/V

libvlc_new初始化失败

最近在做一个视频播放器,用到了libvlc,使用起来也是挺方便的,不过刚开始的时候遇到了一个问题: libvlc_new(0, NULL)这个函数总是返回NULL,后来发现是没把vlc的Plugins文件夹也放到程序执行目录,我只放了libvlc.dll与libvlccore.dll那两个dll文件,vlc初始化过程也需要初始化相应插件。放了之后,一切正常。 --------------------------------------------------------------------------------------------------- /*2015-12-25*/ 今天在linux下做libvlc开发,也遇到了libvlc_new执行失败的问题,我用的是QT框架。程序执行这一函数时候,报如下错误提示: [crayon-69c7376c9feee384693037/] 卸载重装vlc与libvlc-dev也没解决问题,后来查了些资料,发现问题是出在vlc的插件缓存,该缓存需要刷新。 [crayon-69c7376c9fef9534106621/] 通过上述命令即可解决。 --------------------------------------------------------------------------------------------------

2015年11月13日 7comments 6487hotness 5likes Jeff Read all
A/V

PortAudio枚举音频设备

前面我们说到了如何用Visual Studio编译portAudio,下面我们开始讲下如何使用PortAudio,先从最简单的开始,这篇文章我们主要讲如何枚举音频相关设备。代码如下: [crayon-69c7376ca12c4839030966/] 如下是deviceinfo对应结构体声明: [crayon-69c7376ca12cd804344240/] 编译运行得到如下结果: 在最后几行打印的结果中出现的一些设备名汉字乱码是因为有些设备名以UTF-8编码,我没做转换,转化后即可正常显示。

2015年6月23日 0comments 2237hotness 1likes Jeff Read all
12345
Copyright Statement

Unauthorized reproduction or plagiarism in any form is strictly prohibited. For reprint requests, please contact via email.

Recent Comments
snail Published at 17 hours ago(03 03202633105 27 27pm26) 多谢,大佬。醍醐灌顶!
Bramsnawl Published at 24 hours ago(03 03202633110 27 27am26) Proper blood collection playing cards are measure ...
NasibDepdrotte Published at 1 days ago(03 03202633110 26 26pm26) Inf ect isC linNo rth A m viiiix, Sm ets o urgo is...
Pereplanirovka kvartir_cvsr Published at 3 days ago(03 03202633105 25 25pm26) перепланировка услуги [url=https://pereplanirovka-...
Mirzoemele Published at 3 months ago(01 01202613104 06 06pm26) Double blind randomised controlled trial of two to...
Ad

COPYRIGHT © 2026 jianchihu.net. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang