马上工作需要做视频软件了,所以准备学习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
-
-
-
- #include "player.h"
-
- #include <QVBoxLayout>
- #include <QPushButton>
- #include <QSlider>
- #include <QTimer>
- #include <QFrame>
-
- Player::Player()
- : QWidget()
- {
-
- const char * const vlc_args[] = {
- "-I", "dummy",
- "--ignore-config",
- "--extraintf=logger",
- "--verbose=2",
- "--plugin-path=C:\\vlc-0.9.9-win32\\plugins\\" };
-
- _videoWidget=new QFrame(this);
-
- _volumeSlider=new QSlider(Qt::Horizontal,this);
- _volumeSlider->setMaximum(100);
- _volumeSlider->setToolTip("Audio 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);
-
-
-
- libvlc_exception_init(&_vlcexcep);
-
-
- _vlcinstance=libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args,&_vlcexcep);
- raise (&_vlcexcep);
-
-
- _mp = libvlc_media_player_new (_vlcinstance, &_vlcexcep);
- raise (&_vlcexcep);
-
-
- 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);
- }
-
-
- Player::~Player()
- {
-
- libvlc_media_player_stop (_mp, &_vlcexcep);
-
-
- libvlc_media_player_release (_mp);
-
- libvlc_release (_vlcinstance);
- raise (&_vlcexcep);
- }
-
- void Player::playFile(QString file)
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- _m = libvlc_media_new (_vlcinstance, file.toAscii(), &_vlcexcep);
- raise(&_vlcexcep);
-
- libvlc_media_player_set_media (_mp, _m, &_vlcexcep);
- raise(&_vlcexcep);
-
-
-
-
-
-
-
-
- #if defined(Q_OS_WIN)
- libvlc_media_player_set_drawable(_mp, reinterpret_cast<unsigned int>(_videoWidget->winId()), &_vlcexcep );
-
- #elif defined(Q_OS_MAC)
- libvlc_media_player_set_drawable(_mp, _videoWidget->winId(), &_vlcexcep );
-
- #else //Linux
- libvlc_media_player_set_drawable(_mp, _videoWidget->winId(), &_vlcexcep );
-
- #endif
- raise(&_vlcexcep);
-
-
- 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);
-
-
- 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;
-
-
-
- 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
-
-
-
- #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