利用QT和libvlc写RTSP播放器
2014-03-31 17:04
483 查看
这几天学习了下QT,QT核心的东西就是其信号与槽,其他的就是界面的设计,一个程序所有的逻辑部分都是利用信号和槽串起来的。一个widget发送信号,另外一个widget根据这个信号绑定的槽执行相应的函数,这样就实现了界面和程序逻辑的 交互操作。为了练习QT,结合前段时间对VLC播放器的分析,知道VLC播放器的界面也是QT写的,而且Videolan还提供了libvlc核心库给其他程序员做二次开发,再次佩服这样的开源组织,废话少说,下面是我用libvlc和QT写的RTSP播放器的效果,当然还支持本地视频的播放,你也可以输入RTSP地址来播放对应的流媒体,说明一下该播放器是跨平台的哦,支持Windows和Linux平台,我的开发平台是windows7.0和Ubuntu10.04
windows平台效果图:
![](http://blog.chinaunix.net/attachment/201307/5/26611383_1373032842f68f.png)
Linux平台效果图:
![](http://blog.chinaunix.net/attachment/201307/5/26611383_1373032928f77c.png)
下面我将从分别从两个平台(windows和Linux)来谈下利用QT和libvlc写该播放器的大概步骤,很多童鞋知道QT是跨平台的而libvlc是c写的,应该也是跨平台的,为什么还要从两个平台来讲。呵呵,因为libvlc虽然是c写的,但是他是基于模块结构的,这也是VLC的一大亮点,根据视频文件的编码格式不同动态的加载所需要的模块。而这些动态的模块都是一些动态库,在linux下是.so的东西,在windows下是.dll的东西,当然这些动态库不可能是跨平台的,所以需要区别对待这两个平台。
![](http://blog.chinaunix.net/attachment/201307/5/26611383_1373033098HQ99.png)
2. 新建一个工程,可以用QTCreater也可以用其他的IDE,比如codeblocks和visual studio等等,甚至可以直接用QT自带的命令行工具来创建一个工程。我用的是codeblocks, 不能不说这个IDE的功能非常强大,我觉得毫不逊色于微软的visual studio,不过codeblock要支持QT工程还需要一些配置,主要是配置QTsdk的路径和MinGw的路径这个工程主要是实现一些界面,再次向大家推荐下codeblocks,功能强大,而且开源,体积很小,不像eclipse和visual
studio动不动几百M甚至几G,似乎有点跑题了。
![](http://blog.chinaunix.net/attachment/201307/5/26611383_1373033160BYYt.png)
点击(此处)折叠或打开
INCLUDEPATH += D:\Programing\Practice\Qt\Player\player\vlc
LIBS += D:\Programing\Practice\Qt\Player\player\lib\libvlc.lib
LIBS += D:\Programing\Practice\Qt\Player\player\lib\libvlccore.lib
5.下面就是用QT编写界面调用libvlc的问题了,可以根据自己的需要编写界面,我这里贴出部分关键的调用libvlc的代码,界面部分很简单:
点击(此处)折叠或打开
void VLCMainwindow::openFile() {
/* Just the basic file-select box */
QString fileOpen = QFileDialog::getOpenFileName(this,tr("Load
a file"), "~");
fileOpen.replace("/", "\\"); //因为getOpenFileName得到的文件名是类//似于C:/Hello/test.avi,与windows下的路径名不匹配,所以需要这一步转换
/* Stop if something is playing */
if( vlcPlayer && libvlc_media_player_is_playing(vlcPlayer) )
stop();
/* New Media */
libvlc_media_t *vlcMedia = libvlc_media_new_path(vlcObject,qtu(fileOpen));
if( !vlcMedia )
return;
vlcPlayer = libvlc_media_player_new_from_media (vlcMedia);
libvlc_media_release(vlcMedia);
/* Integrate the video in the interface */
#if defined(Q_OS_MAC)
libvlc_media_player_set_nsobject(vlcPlayer, videoWidget->winId());
#elif defined(Q_OS_UNIX)
libvlc_media_player_set_xwindow(vlcPlayer, videoWidget->winId());
#elif defined(Q_OS_WIN)
libvlc_media_player_set_hwnd(vlcPlayer, videoWidget->winId());
#endif
//int windid = videoWidget->winId();
//libvlc_media_player_set_xwindow (vlcPlayer, windid );
/* And play */
libvlc_media_player_play (vlcPlayer);
//Set vars and text correctly
playBut->setText("Pause");
}
而下面这个函数时打开RTSP流媒体的函数,关键是调用了libvlc中的libvlc_meida_new_location()实现播放RTSP视频
点击(此处)折叠或打开
void VLCMainwindow::StartPlay()
{
URLDialog = new OpenURLDialog;
URLDialog->hide();
if( vlcPlayer && libvlc_media_player_is_playing(vlcPlayer) )
stop();
// New Media
// libvlc_media_t *vlcMedia = libvlc_media_new_path(vlcObject,qtu(fileOpen));
libvlc_media_t *vlcMedia = libvlc_media_new_location(vlcObject,qtu (URLDialog->urlLineEdit->text()));
if( !vlcMedia )
return;
vlcPlayer = libvlc_media_player_new_from_media (vlcMedia);
libvlc_media_release(vlcMedia);
//libvlc_media_player_set_xwindow(vlcPlayer, windid);
/* And play */
libvlc_media_player_play (vlcPlayer);
//Set vars and text
correctly
playBut->setText("Pause");
}
1. 编译vlc源码并安装
Linux平台下也可以直接命令行apt-get install vlc安装vlc,然后得到linux平台下libvlc的库,也可以去videolan官方网站下载vlc的源码,在本地编译并安装,编译安装部分很简单,可以参考videolan官方网站。
2. 建立一个QT工程
这一步类似于Windows平台下, 或者可以直接将Windows下的工程拷贝到Linux下来
3. 设置链接库libvlc的路径
编译安装好了之后vlc所有依赖的库都会被copy到/usr/local/lib目录,我们可以在qt的工程文件.pro中直接把库的链接路径设置好就ok了。具体的链接库路径设置类似下面这样:
INCLUDEPATH += . vlc
LIBS += -L/usr/local/lib -lvlc
# Input
HEADERS += mainwindow.h \
openurldialog.h \
painter.h \
player.h \
4. 将vlc源代码目录下的include目录下的vlc目录拷贝到工程所在目录,vlc目录下包括libvlc所有库函数的头文件
5.编写自己的QT界面代码实现对libvlc的调用,界面代码跟windows是兼容的
总结一下:
Libvlc库是vlc播放器的核心库,我们只要调用这个库并加以个性化就可以轻松实现自己的播放器,而QT又是跨平台的,双剑合璧,无敌于天下。下面我会把部分代码上传到网上,并不断完善该播放器的功能并share给大家
windows平台效果图:
![](http://blog.chinaunix.net/attachment/201307/5/26611383_1373032842f68f.png)
Linux平台效果图:
![](http://blog.chinaunix.net/attachment/201307/5/26611383_1373032928f77c.png)
下面我将从分别从两个平台(windows和Linux)来谈下利用QT和libvlc写该播放器的大概步骤,很多童鞋知道QT是跨平台的而libvlc是c写的,应该也是跨平台的,为什么还要从两个平台来讲。呵呵,因为libvlc虽然是c写的,但是他是基于模块结构的,这也是VLC的一大亮点,根据视频文件的编码格式不同动态的加载所需要的模块。而这些动态的模块都是一些动态库,在linux下是.so的东西,在windows下是.dll的东西,当然这些动态库不可能是跨平台的,所以需要区别对待这两个平台。
1. 首先去videolan的官方网站下载windows版本的vlc安装包安装,这个安装是傻瓜式的,很简单。这里之所以需要安装vlc主要是因为我们需要vlc所有的一些库文件,当然你也可以下载源代码编译windows平台所需要的库,不过这样比较麻烦,安装完了vlc就可以获得其所有需要的动态库,多简单啊。安装完后的安装目录是类似下面这样的目录结构:
![](http://blog.chinaunix.net/attachment/201307/5/26611383_1373033098HQ99.png)
2. 新建一个工程,可以用QTCreater也可以用其他的IDE,比如codeblocks和visual studio等等,甚至可以直接用QT自带的命令行工具来创建一个工程。我用的是codeblocks, 不能不说这个IDE的功能非常强大,我觉得毫不逊色于微软的visual studio,不过codeblock要支持QT工程还需要一些配置,主要是配置QTsdk的路径和MinGw的路径这个工程主要是实现一些界面,再次向大家推荐下codeblocks,功能强大,而且开源,体积很小,不像eclipse和visual
studio动不动几百M甚至几G,似乎有点跑题了。
3. 将第一步vlc安装目录下的libvlc.dll和libvlccore.dll拷贝到第二步所创建工程的目录,在工程所在目录创建一个lib目录,将sdk目录中的libvlc.lib和livblcore.lib两个静态库拷贝到刚创建的lib目录中,还要将sdk目录中的include目录中的vlc目录整体拷贝到工程所在目录,将vlc目录中的vlc.h文件拷贝到上一级目录,也就是工程所在的顶层目录,然后再将vlc安装目录下的plugin目录整体拷贝到工程所在目录,这个里面都是一些动态库dll文件,这样就完成了所有libvlc所需要的库拷贝,下面是拷贝之后的目录结构
![](http://blog.chinaunix.net/attachment/201307/5/26611383_1373033160BYYt.png)
4.下面一步比较关键,要把设置链接库的路径,在QT的工程文件.pro中设置,在windows下和Linux平台下不一样,windows下类似这样设置,可以根据个人情况加以修改
点击(此处)折叠或打开
INCLUDEPATH += D:\Programing\Practice\Qt\Player\player\vlcLIBS += D:\Programing\Practice\Qt\Player\player\lib\libvlc.lib
LIBS += D:\Programing\Practice\Qt\Player\player\lib\libvlccore.lib
5.下面就是用QT编写界面调用libvlc的问题了,可以根据自己的需要编写界面,我这里贴出部分关键的调用libvlc的代码,界面部分很简单:
下面这个函数时打开本地视频文件的代码,主要是libvlc_media_new_path()函数
点击(此处)折叠或打开void VLCMainwindow::openFile() {
/* Just the basic file-select box */
QString fileOpen = QFileDialog::getOpenFileName(this,tr("Load
a file"), "~");
fileOpen.replace("/", "\\"); //因为getOpenFileName得到的文件名是类//似于C:/Hello/test.avi,与windows下的路径名不匹配,所以需要这一步转换
/* Stop if something is playing */
if( vlcPlayer && libvlc_media_player_is_playing(vlcPlayer) )
stop();
/* New Media */
libvlc_media_t *vlcMedia = libvlc_media_new_path(vlcObject,qtu(fileOpen));
if( !vlcMedia )
return;
vlcPlayer = libvlc_media_player_new_from_media (vlcMedia);
libvlc_media_release(vlcMedia);
/* Integrate the video in the interface */
#if defined(Q_OS_MAC)
libvlc_media_player_set_nsobject(vlcPlayer, videoWidget->winId());
#elif defined(Q_OS_UNIX)
libvlc_media_player_set_xwindow(vlcPlayer, videoWidget->winId());
#elif defined(Q_OS_WIN)
libvlc_media_player_set_hwnd(vlcPlayer, videoWidget->winId());
#endif
//int windid = videoWidget->winId();
//libvlc_media_player_set_xwindow (vlcPlayer, windid );
/* And play */
libvlc_media_player_play (vlcPlayer);
//Set vars and text correctly
playBut->setText("Pause");
}
而下面这个函数时打开RTSP流媒体的函数,关键是调用了libvlc中的libvlc_meida_new_location()实现播放RTSP视频
点击(此处)折叠或打开
void VLCMainwindow::StartPlay()
{
URLDialog = new OpenURLDialog;
URLDialog->hide();
if( vlcPlayer && libvlc_media_player_is_playing(vlcPlayer) )
stop();
// New Media
// libvlc_media_t *vlcMedia = libvlc_media_new_path(vlcObject,qtu(fileOpen));
libvlc_media_t *vlcMedia = libvlc_media_new_location(vlcObject,qtu (URLDialog->urlLineEdit->text()));
if( !vlcMedia )
return;
vlcPlayer = libvlc_media_player_new_from_media (vlcMedia);
libvlc_media_release(vlcMedia);
//libvlc_media_player_set_xwindow(vlcPlayer, windid);
/* And play */
libvlc_media_player_play (vlcPlayer);
//Set vars and text
correctly
playBut->setText("Pause");
}
大家可以看到播放RTSP和本地文件在libvlc中是两个不同的api
基本上Windows平台下的基于QT调用libvlc的主要步骤就是这些,下面说说linux平台下的步骤
二.Linux平台
1. 编译vlc源码并安装
Linux平台下也可以直接命令行apt-get install vlc安装vlc,然后得到linux平台下libvlc的库,也可以去videolan官方网站下载vlc的源码,在本地编译并安装,编译安装部分很简单,可以参考videolan官方网站。
2. 建立一个QT工程
这一步类似于Windows平台下, 或者可以直接将Windows下的工程拷贝到Linux下来
3. 设置链接库libvlc的路径
编译安装好了之后vlc所有依赖的库都会被copy到/usr/local/lib目录,我们可以在qt的工程文件.pro中直接把库的链接路径设置好就ok了。具体的链接库路径设置类似下面这样:
INCLUDEPATH += . vlc
LIBS += -L/usr/local/lib -lvlc
# Input
HEADERS += mainwindow.h \
openurldialog.h \
painter.h \
player.h \
4. 将vlc源代码目录下的include目录下的vlc目录拷贝到工程所在目录,vlc目录下包括libvlc所有库函数的头文件
5.编写自己的QT界面代码实现对libvlc的调用,界面代码跟windows是兼容的
总结一下:
Libvlc库是vlc播放器的核心库,我们只要调用这个库并加以个性化就可以轻松实现自己的播放器,而QT又是跨平台的,双剑合璧,无敌于天下。下面我会把部分代码上传到网上,并不断完善该播放器的功能并share给大家
相关文章推荐
- Ubuntu 默认壁纸历代记
- 关于Ubuntu 11.10启动提示waiting for the network configuration的问题
- 在 Ubuntu 桌面中使用文件和文件夹
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- ubuntu下chrome无法同步问题解决
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- 使用 GNOME 优化工具自定义 Linux 桌面的 10 种方法
- 以Ubuntu 9.04为例 将工作环境迁移到 Linux
- Scientific Linux 5.5 图形安装教程