您的位置:首页 > 编程语言 > Qt开发

基于QT视频软件的开发和学习

2012-03-29 14:10 459 查看



博客分类:

C++

先装好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

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

Cpp代码



/* 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 修改成如下

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文件 成如下

Cpp代码



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)

vlc.rar (29.5 KB)

下载次数: 73

vlc-lib.rar (1.8 MB)

下载次数: 323
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐