LibVLC SampleCode Qt: Difference between revisions
Jump to navigation
Jump to search
Initial Release |
No edit summary |
||
| Line 79: | Line 79: | ||
}; | }; | ||
#endif | #endif | ||
</pre> | |||
vlc_on_qt.cpp: | |||
<pre> | |||
/* libVLC and Qt sample code | |||
* Copyright © 2009 Alexander Maringer <maringer@maringer-it.de> | |||
*/ | |||
#include "vlc_on_qt.h" | |||
#include <QVBoxLayout> | |||
#include <QWidget> | |||
#include <QSizePolicy> | |||
#include <QPushButton> | |||
#include <QTextEdit> | |||
#include <QSlider> | |||
#include <QCloseEvent> | |||
#include <QTimer> | |||
#include <QDebug> | |||
Player::Player() | |||
: QWidget() | |||
{ | |||
//mise en place des widgets | |||
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(){} | |||
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 */ | |||
libvlc_media_player_set_drawable( _mp, reinterpret_cast<unsigned int>(_videoWidget->winId()), &_vlcexcep ); | |||
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=(newPosition)/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; | |||
//input sert a recuperer les info sur la lecture en cours | |||
//input sert aussi a controller certains aspect de la lecture | |||
//on recupere la position (entre 0.0f et 1.0f) | |||
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); | |||
} | |||
} | |||
</pre> | </pre> | ||
Revision as of 00:18, 22 May 2009
This sample code will render a video into a Qt QWidget.
This was tested with vlc-0.9.9 and Qt 4.5.1 on WinXP.
main.cpp:
/* libVLC and Qt sample code
* Copyright © 2009 Alexander Maringer <maringer@maringer-it.de>
*/
#include "vlc_on_qt.h"
#include <QtGui/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Player p;
p.resize(640,480);
p.playFile("rtp://@:2626");
p.show();
return a.exec();
}
vlc_on_qt.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 QProcess;
class QVBoxLayout;
class QWidget;
class QSizePolicy;
class QPushButton;
class QTextEdit;
class QCloseEvent;
class QTimer;
class QDebug;
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;
libvlc_media_list_t *_ml;
libvlc_media_list_player_t * _mlp;
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
vlc_on_qt.cpp:
/* libVLC and Qt sample code
* Copyright © 2009 Alexander Maringer <maringer@maringer-it.de>
*/
#include "vlc_on_qt.h"
#include <QVBoxLayout>
#include <QWidget>
#include <QSizePolicy>
#include <QPushButton>
#include <QTextEdit>
#include <QSlider>
#include <QCloseEvent>
#include <QTimer>
#include <QDebug>
Player::Player()
: QWidget()
{
//mise en place des widgets
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(){}
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 */
libvlc_media_player_set_drawable( _mp, reinterpret_cast<unsigned int>(_videoWidget->winId()), &_vlcexcep );
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=(newPosition)/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;
//input sert a recuperer les info sur la lecture en cours
//input sert aussi a controller certains aspect de la lecture
//on recupere la position (entre 0.0f et 1.0f)
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);
}
}