Difference between revisions of "LibVLC SampleCode Qt"

From VideoLAN Wiki
Jump to navigation Jump to search
(Initial Release)
 
(Initial Release)
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