|
|
| 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> |
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