马上工作需要做视频软件了,所以准备学习QT来开发,为什么选择QT呢,因为他优点多多(不说了自己网上g一下
)
随着高清的不断普及,所有视频软件都向高清这个方向而前进,其中有一款开源跨平台的播放器vlc的特性和功能都是非
常的好,所以想准备学习vlc的源码来看看,在看他源码的时候,发现他还有一个可供开发人员调用的libvlc 媒体库可用(GPL),而vlc本身使用的GUI就是QT。
好了不多说了
先装好QT SDK,然后把环境变量设置一下(不会去G!)
然后把vlc库加入到mingw里面
先复制vlc-include.rar解压出来的头文件到Qt\2009.04\mingw\include里面
在把vlc-lib.rar解压出来的文件放到C:\vlc-lib
我们在 Qt Creator 里面建立一个空的QT项目
新建一个Player类 ,会多出player.cpp,player.h 修改成如下
player.cpp
/*
* Flie Name player.cpp
*/
#include "player.h"
#include <QVBoxLayout>
#include <QPushButton>
#include <QSlider>
#include <QTimer>
#include <QFrame>
Player::Player()
: QWidget()
{
//preparation of the vlc command
const char * const vlc_args[] = {
"-I", "dummy", /* Don't use any interface */
"--ignore-config", /* Don't use VLC's config */
"--extraintf=logger", //log anything
"--verbose=2", //be much more verbose then normal for debugging purpose
"--plugin-path=C:\\vlc-0.9.9-win32\\plugins\\" };
_videoWidget=new QFrame(this);
_volumeSlider=new QSlider(Qt::Horizontal,this);
_volumeSlider->setMaximum(100); //the volume is between 0 and 100
_volumeSlider->setToolTip("Audio slider");
// Note: if you use streaming, there is no ability to use the position slider
_positionSlider=new QSlider(Qt::Horizontal,this);
_positionSlider->setMaximum(POSITION_RESOLUTION);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(_videoWidget);
layout->addWidget(_positionSlider);
layout->addWidget(_volumeSlider);
setLayout(layout);
_isPlaying=false;
poller=new QTimer(this);
//Initialize an instance of vlc
//a structure for the exception is neede for this initalization
libvlc_exception_init(&_vlcexcep);
//create a new libvlc instance
_vlcinstance=libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args,&_vlcexcep); //tricky calculation of the char space used
raise (&_vlcexcep);
// Create a media player playing environement
_mp = libvlc_media_player_new (_vlcinstance, &_vlcexcep);
raise (&_vlcexcep);
//connect the two sliders to the corresponding slots (uses Qt's signal / slots technology)
connect(poller, SIGNAL(timeout()), this, SLOT(updateInterface()));
connect(_positionSlider, SIGNAL(sliderMoved(int)), this, SLOT(changePosition(int)));
connect(_volumeSlider, SIGNAL(sliderMoved(int)), this, SLOT(changeVolume(int)));
poller->start(100); //start timer to trigger every 100 ms the updateInterface slot
}
//desctructor
Player::~Player()
{
/* Stop playing */
libvlc_media_player_stop (_mp, &_vlcexcep);
/* Free the media_player */
libvlc_media_player_release (_mp);
libvlc_release (_vlcinstance);
raise (&_vlcexcep);
}
void Player::playFile(QString file)
{
//the file has to be in one of the following formats /perhaps a little bit outdated)
/*
[file://]filename Plain media file
http://ip:port/file HTTP URL
ftp://ip:port/file FTP URL
mms://ip:port/file MMS URL
screen:// Screen capture
[dvd://][device][@raw_device] DVD device
[vcd://][device] VCD device
[cdda://][device] Audio CD device
udp:[[<source address>]@[<bind address>][:<bind port>]]
*/
/* Create a new LibVLC media descriptor */
_m = libvlc_media_new (_vlcinstance, file.toAscii(), &_vlcexcep);
raise(&_vlcexcep);
libvlc_media_player_set_media (_mp, _m, &_vlcexcep);
raise(&_vlcexcep);
// /!\ Please note /!\
//
// passing the widget to the lib shows vlc at which position it should show up
// vlc automatically resizes the video to the ´given size of the widget
// and it even resizes it, if the size changes at the playing
/* Get our media instance to use our window */
#if defined(Q_OS_WIN)
libvlc_media_player_set_drawable(_mp, reinterpret_cast<unsigned int>(_videoWidget->winId()), &_vlcexcep );
//libvlc_media_player_set_hwnd(_mp, _videoWidget->winId(), &_vlcexcep ); // for vlc 1.0
#elif defined(Q_OS_MAC)
libvlc_media_player_set_drawable(_mp, _videoWidget->winId(), &_vlcexcep );
//libvlc_media_player_set_agl (_mp, _videoWidget->winId(), &_vlcexcep); // for vlc 1.0
#else //Linux
libvlc_media_player_set_drawable(_mp, _videoWidget->winId(), &_vlcexcep );
//libvlc_media_player_set_xwindow(_mp, _videoWidget->winId(), &_vlcexcep ); // for vlc 1.0
#endif
raise(&_vlcexcep);
/* Play */
libvlc_media_player_play (_mp, &_vlcexcep );
raise(&_vlcexcep);
_isPlaying=true;
}
void Player::changeVolume(int newVolume)
{
libvlc_exception_clear(&_vlcexcep);
libvlc_audio_set_volume (_vlcinstance,newVolume , &_vlcexcep);
raise(&_vlcexcep);
}
void Player::changePosition(int newPosition)
{
libvlc_exception_clear(&_vlcexcep);
// It's possible that the vlc doesn't play anything
// so check before
libvlc_media_t *curMedia = libvlc_media_player_get_media (_mp, &_vlcexcep);
libvlc_exception_clear(&_vlcexcep);
if (curMedia == NULL)
return;
float pos=(float)(newPosition)/(float)POSITION_RESOLUTION;
libvlc_media_player_set_position (_mp, pos, &_vlcexcep);
raise(&_vlcexcep);
}
void Player::updateInterface()
{
if(!_isPlaying)
return;
// It's possible that the vlc doesn't play anything
// so check before
libvlc_media_t *curMedia = libvlc_media_player_get_media (_mp, &_vlcexcep);
libvlc_exception_clear(&_vlcexcep);
if (curMedia == NULL)
return;
float pos=libvlc_media_player_get_position (_mp, &_vlcexcep);
int siderPos=(int)(pos*(float)(POSITION_RESOLUTION));
_positionSlider->setValue(siderPos);
int volume=libvlc_audio_get_volume (_vlcinstance,&_vlcexcep);
_volumeSlider->setValue(volume);
}
void Player::raise(libvlc_exception_t * ex)
{
if (libvlc_exception_raised (ex))
{
fprintf (stderr, "error: %s\n", libvlc_exception_get_message(ex));
exit (-1);
}
}
player.h
/* libVLC and Qt sample code
* Copyright © 2009 Alexander Maringer <maringer@maringer-it.de>
*/
#ifndef VLC_ON_QT_H
#define VLC_ON_QT_H
#include <vlc/vlc.h>
#include <QWidget>
class QVBoxLayout;
class QPushButton;
class QTimer;
class QFrame;
class QSlider;
#define POSITION_RESOLUTION 10000
class Player : public QWidget
{
Q_OBJECT
QSlider *_positionSlider;
QSlider *_volumeSlider;
QFrame *_videoWidget;
QTimer *poller;
bool _isPlaying;
libvlc_exception_t _vlcexcep;
libvlc_instance_t *_vlcinstance;
libvlc_media_player_t *_mp;
libvlc_media_t *_m;
public:
Player();
~Player();
void raise(libvlc_exception_t * ex);
public slots:
void playFile(QString file);
void updateInterface();
void changeVolume(int newVolume);
void changePosition(int newPosition);
};
#endif
在新建立一个main.cpp 修改成如下
#include <QtGui/QApplication>
#include "player.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Player p;
p.resize(640,480);
p.playFile("#填写你要播的文件路径#");
p.show();
return a.exec();
}
然后我们修改 .pro文件 成如下
TARGET = test1
TEMPLATE = app
LIBS += -L'C:\vlc-lib'
LIBS += -lvlc
SOURCES += player.cpp \
main.cpp
HEADERS += player.h
然后运行qmake
然后就可以编译了
编译成功以后想要运行,还必须把C:\vlc-lib里面的libvlc.dll,和libvlccore.dll拷贝到生成exe的目录里面才能运行
现在在qt creator里面就可以运行了(单独运行还需要其它dll)
haha
分享到:
相关推荐
【基于QT的视频监控系统】是一种使用QT框架开发的实时监控应用。QT是一个跨平台的C++库,它为开发者提供了丰富的图形用户界面(GUI)工具包,支持多种操作系统,如Windows、Linux、macOS等。这个视频监控系统利用QT...
综上所述,基于QT5.12的视频桌面软件是一个集成了多媒体处理、用户交互、系统集成等多种技术的复杂项目,对于学习和理解Qt框架以及多媒体编程具有很高的实践价值。通过深入研究和理解这些知识点,开发者可以提升自己...
"基于Qt的视频监控源代码"指的是使用Qt框架开发的视频监控系统的原始编程代码。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++语言,同时也提供了QML进行UI设计。在视频监控领域,Qt...
在本项目中,我们将基于Qt开发平台,结合V4L2驱动,来实现视频的实时采集和帧数据的保存。 首先,Qt是一个跨平台的C++图形用户界面应用程序框架,它提供了丰富的库和工具,使得开发者可以在不同操作系统上构建用户...
【基于QT的简易视频播放器】是一个利用QT框架开发的简单视频播放软件。QT是一个流行的开源C++图形用户界面应用程序开发框架,它提供了丰富的API和工具,使得开发者能够轻松创建跨平台的应用程序,包括多媒体应用。在...
作为一个开源项目,这个视频通话工具的源代码可供学习和改进。开发者可以借此理解如何在Qt环境下集成网络通信与多媒体处理,为自己的项目提供参考。 总的来说,这个“Qt制作的视频通话”项目展示了Qt库在开发高效、...
在本项目中,我们探讨的是一个基于QTC++和OpenCV的图像处理软件设计。QTC++,全称为Qt C++,是Qt框架与C++语言的结合,它提供了一个全面的工具集,用于开发跨平台的图形用户界面应用程序。而OpenCV(开源计算机视觉...
【Qt5开发】是计算机软件开发领域中的一个重要主题,它是一个跨平台的C++图形用户界面应用程序开发框架。Qt5由The Qt Company开发并维护,广泛应用于桌面、移动设备和嵌入式系统的应用开发。本资源集合是针对Qt5开发...
【QT与FFmpeg技术概述】 ...深入研究这个"project"文件,我们可以学习到如何在实际项目中结合QT和FFmpeg,实现录屏和播放器的完整流程,这对于理解多媒体处理和跨平台应用开发具有很高的参考价值。
**Qt 5.9 C++ 开发指南:深入...深入理解其核心特点和源码,将使你能够更好地利用Qt进行软件开发,创建出高效、美观的应用程序。通过实践与学习,你将成为一名精通Qt 5.9的开发者,能够应对各种复杂的软件工程挑战。
【标题】: "基于QT的跨平台视频编辑软件源代码" 这个标题暗示了我们讨论的...以上内容涵盖了从QT开发到视频编辑软件实现的多个技术领域,对于想要学习和开发跨平台视频编辑软件的开发者来说,这些都是宝贵的学习资源。
Qt技术是一套强大的跨平台应用程序开发框架,专注于使用C++语言来构建高性能、高可维护性的软件解决方案。自1991年首次推出以来,Qt因其卓越的跨平台能力、丰富的功能集、高效的开发工具和良好的社区支持而广受...
2. 图形化编程软件开发:该职责要求开发者能够基于 QT 开发图形化编程软件,能够满足产品需求。 3. 相关代码编写和产品化文档编写:该职责要求开发者能够编写高质量的代码和产品化文档,能够满足产品需求。 4. 架构...
【标题】基于QT的网络视频直播...总的来说,基于QT的网络视频直播软件开发涉及网络通信、多媒体处理、图形渲染等多个技术领域,通过学习和实践,开发者不仅可以掌握QT框架的使用,还能提升在实时流媒体领域的专业技能。
【基于QT电子相册】是一个使用QT框架开发的简易电子相册应用,它在培训过程中被创建,并且作为学习和实践的示例项目。虽然功能可能并不完善,但其核心特性在于能够遍历指定目录下的所有图片并进行展示,这为理解和...
QT视频监管平台是一款基于Qt库开发的视频监控系统,它提供了强大的视频监控、管理和分析功能。Qt是一个跨平台的应用程序开发框架,支持多种操作系统,如Windows、Linux、macOS等,使得开发人员能够构建高性能、用户...
【基于Qt5音视频播放器】是一个利用Qt5框架开发的多媒体播放软件。Qt5是Qt库的一个版本,它提供了一套丰富的C++工具包,用于构建跨平台的图形用户界面应用程序。Qt5包含了多种模块,如Widgets、Core、Network、Gui等...
【标题】"精选_基于QT与mplayer的视频播放器_源码打包"指的是一个开源项目,它将流行的跨平台图形用户界面库Qt与强大的多媒体播放引擎mplayer结合,创建了一个功能丰富的视频播放器。这个源码打包资源是为开发者提供...