Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.3.1 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Intégration de VLC

Introduction

Qt, dans son souci de framework généraliste, n’implémente pas toujours tout ce dont on peut avoir besoin, surtout lorsque cela n’est pas d’usage courant. Les vidéos font partie de ce qui n’est pas couvert par Qt. Cependant, un grand nombre de librairies et autres backends existent. Nous allons voir comment utiliser l’une d’entre elle: VLC.

Pré-requis

Voici ce dont vous aurez besoin :
[list=*]
[*]Les librairies VLC >= 0.8.6 (Page de téléchargement)[/*]
[*]La documentation des fonctions internes de VLC[/*]
[*]Il semblerait que VLC soit difficilement compilable sous Visual C++. Comme ce tutoriel suppose de pouvoir lier votre application avec les libraires VLC, les personnes désireuses de développer sous Windows devront utiliser Mingw pour générer leur application.[/*]
[/list]

Pour compiler VLC 0.9.0 (la version actuellement en cours de développement, récupérable depuis le SVN), vous aurez besoin de :
[list=*]
[*]bibliothèque MAD (MPEG Audio Decoder) : http://www.underbit.com/products/mad/ ou mettre une option lors du configure pour la désactiver,[/*]
[*]FFMpeg : http://ffmpeg.mplayerhq.hu/,[/*]
[*]liba52 : http://liba52.sf.net,[/*]
[*]libmpeg2 : http://libmpeg2.sf.net.[/*]
[/list]

Lecteur vidéo

Ce tutoriel détaille la manière d'utiliser l'API VLC au travers d'une application Qt.

L’avantage de cette méthode est que le contrôle de VLC est plus simple et précis et ne nécessite pas d’exécuter/piloter un processus externe (contrairement à l'utilisation de MPlayer).

Nous allons créer un petit exemple simple de lecteur vidéo, ce dernier permettant :

[list=*]
[*]d’initialiser VLC,[/*]
[*]de charger un flux vidéo,[/*]
[*]de naviguer dans la vidéo (avance/retour),[/*]
[*]de modifier le volume.[/*]
[/list]

Une image valant mieux qu'un long discours, voici une capture d'écran du résultat final :

image

Le code de ce tutorial (source + .pro)

Compilation

La compilation de l’exemple nécessite bien entendu les includes et les libraires de VLC.
Celles ci doivent êtres dans dans les chemins de recherche

Linux/Unix

Voici le fichier pro typique :

TEMPLATE=app
DEPENDPATH += .
INCLUDEPATH += .
SOURCES += tuto_vlc.cpp
LIBS+=-lvlc
Explications

Si l'on résume les étapes nécessaires à la lecture d'un vidéo dans une application Qt :

[list=1]
[*]initialiser un contexte VLC,[/*]
[*]ajouter un flux à la playlist,[/*]
[*]rediriger la fenêtre vidéo de sortie vlc sur un widget Qt de l'application,[/*]
[*]démarrer la lecture du flux.[/*]
[/list]

Certaines fonctions de l'API de VLC seront détaillées. Toutes ces fonctions et bien plus encore sont disponibles dans la documentation de VLC.

Initialisation d'un contexte VLC

Normalement seule l'inclusion de l'entête vlc/libvlc.h est nécessaire pour utiliser toutes les fonctions VLC.
#include <vlc/libvlc.h>
VLC reporte toutes ses erreurs dans une structure particulière libvlc_exception_t. Avant tout appel à une fonction VLC, il nous faudra donc une telle structure :
[cpp]
libvlc_exception_t _vlcexcep; //déclaration de la structure
libvlc_exception_init (&_vlcexcep); //initialisation de la structure
Quelques fonctions pratiques à utiliser avec libvlc_exception_t :
[cpp]
if(libvlc_exception_raised(&_vlcexcep)!=0) {....} //teste si une erreur a eu lieu.
libvlc_exception_get_message(&_vlcexcep); //retourne le message d'erreur
libvlc_exception_clear(&_vlcexcep); //efface la/les erreurs précédentes
Il est maintenant temps de créer un contexte VLC, de type libvlc_instance_t, nécessaire à la plupart des fonctions :
[cpp]
libvlc_instance_t *_vlcinstance;
_vlcinstance=libvlc_new(argc,argv,&_vlcexcep);
Il n'est possible de lire qu'un seul flux vidéo à la fois par contexte. Pour lire plusieurs flux en parallèle, il faut donc initialiser plusieurs contextes. Lorsqu'un contexte, n'est plus utile, ne pas oublier de le libérer :
libvlc_destroy (_vlcinstance, &_vlcexcep);
Ajout d'un flux

Le chargement d'un flux vidéo se fait dans un contexte initialisé et dans l'élément playlist de VLC (se réfèrer à la doc quant à la gestion des playlist, ce tutoriel n'en faisant pas d'autres mentions).
[cpp]
libvlc_playlist_clear(_vlcinstance,&_vlcexcep); //on vide la playlist
libvlc_playlist_add (_vlcinstance,URL,NULL,&_vlcexcep);//on ajoute le nouveau flux

Note : à ce niveau, le fichier est dans la playlist, il n'est pas en cours de lecture ou n'a pas interrompu la lecture en cours.
Avec URL une chaine de caractère de la forme (principalement) :

Type Forme

Fichier local file://chemin

Url http http://ip:port/file

Fichier ftp ftp://ip:port/file

DVD dvd://[device]

Flux UDP udp:[]@[][:]%%

Redirection du flux sur un widget Qt

La redirection de la sortie vidéo sur un widget de l'application est une des étapes les plus importantes pour l'intégration (ce n'est pas la plus compliquée ;-) ).

A noter que VLC, se chargera d'adapter la taille de la vidéo à la taille du widget tout en conservant l'aspect de la video (VLC se chargera aussi de resizer la video si la taille du widget venait a changer en cours de lecture).

N'importe quel widget peut servir pour afficher une video, mais dans la mesure ou il sera complètement recouvert, un simple QWidget suffit.
//Notez l'usage de Widget-&gt;winId() pour indiquer on dessiner la video
libvlc_video_set_parent(_vlcinstance ,Widget-&gt;winId(),&_vlcexcep);
Functions vidéos/audios

Certaines fonctions requièrent un pointeur sur libvlc_input_t .Pour obtenir ce pointeur, un flux doit être en cours de lecture/pause :
libvlc_input_t *input=libvlc_playlist_get_input (_vlcinstance,&_vlcexcep); //obtenir un pointeur input
libvlc_input_free (input); //il est en general de bon ton de libérer input après usage
Contrôle de la vidéo

[list=*]
[*]Démarrer la lecture :[/*]
[/list]
libvlc_playlist_play (_vlcinstance , -1, 0, NULL, &_vlcexcep);
// avec :
// -1 pour indiquer de lire l'element suivant de la playlist
// 0 le nombre d'option a passer au flux a lire
// NULL : les options
[list=*]
[*]Stopper la lecture :[/*]
[/list]
libvlc_playlist_stop (_vlcinstance, &_vlcexcep);
[list=*]
[*]Mettre en pause la lecture :[/*]
[/list]
libvlc_playlist_pause (_vlcinstance, &_vlcexcep);
[list=*]
[*]Connaître l'état :[/*]
[/list]
int etat=libvlc_playlist_isplaying(_vlcinstance, &_vlcexcep);
//etat=0 si stop ou pause
//etat=1 si lecture en cours
[list=*]
[*]Lire en boucle :[/*]
[/list]
int loop=1; //mettre a 0 pour stopper la lecture en boucle
libvlc_playlist_loop (_vlcinstance, loop,&_vlcexcep);
[list=*]
[*]Connaître la durée totale du flux (nécessite un pointeur input) :[/*]
[/list]
long long duree=libvlc_input_get_length (input, &_vlcexcep);
[list=*]
[*]Connaître la position actuelle en ms (nécessite un pointeur input) :[/*]
[/list]
long long position=libvlc_input_get_time (input, &_vlcexcep);
[list=*]
[*]Se positionner dans le flux (position en ms - nécessite un pointeur input) :[/*]
[/list]
libvlc_input_set_time (input, 42000,&_vlcexcep); //se positionne a 42 sec
[list=*]
[*]Connaître la position actuelle en pourcentage (nécessite un pointeur input) :[/*]
[/list]
float posEnPourcent=libvlc_input_get_position (input, &_vlcexcep)*100.0;
[list=*]
[*]Se positionner dans le flux (position en pourcentage du temps total - nécessite un pointeur input) :[/*]
[/list]
libvlc_input_set_position(input, 0.42f,&_vlcexcep); // se positionne a 42% du flux ???
Contrôle du volume

[list=*]
[*]Obtenir la valeur du volume comprise entre 0 et 100 - 0 étant le minimum :[/*]
[/list]
int volume=libvlc_audio_get_volume (_vlcinstance, &_vlcexcep);
[list=*]
[*]Positionner le volume (valeur en 0 et 100) :[/*]
[/list]
libvlc_audio_set_volume (_vlcinstance, 42,&_vlcexcep); //volume a 42%

Réponses

  • Bonjour,

    Je suis sous windows, j'ai téléchargé le code du tuto ( source + .pro),VLC 0.8.6 dans les archives VLC.
    1er problème: dans VLC 0.8.6, je n'ai pas la libvlc.h. je vois libvlc.dll
    2ème problème: Comment fait on pour intégrer les includes et les librairies de VLC dans le code du tuto.
    Merci
  • Bonjour, je suis debutant et je galere pour l'integration de vlc dans qt. j'ai rid les sources vlc 0.8.6 et dans tuto_vlc j'ai comme erreur ::

    C:/QtSDK/Desktop/Qt/4.8.1/mingw/include/QtCore/qglobal.h:1492: multiple definition of `Player::Player()'
    debug/tuto_vlc.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/tuto_vlc.cpp:42: first defined here
    debug/main.o: In function `Player':
    C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/tuto_vlc.cpp:42: multiple definition of `Player::Player()'
    debug/tuto_vlc.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/tuto_vlc.cpp:42: first defined here
    debug/main.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/tuto_vlc.cpp:96: multiple definition of `Player::playFile(QString)'
    debug/tuto_vlc.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/tuto_vlc.cpp:96: first defined here
    debug/main.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/tuto_vlc.cpp:149: multiple definition of `Player::changeVolume(int)'
    debug/tuto_vlc.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/tuto_vlc.cpp:149: first defined here
    debug/main.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/tuto_vlc.cpp:159: multiple definition of `Player::changePosition(int)'
    debug/tuto_vlc.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/tuto_vlc.cpp:159: first defined here
    debug/main.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/tuto_vlc.cpp:178: multiple definition of `Player::updateInterface()'
    debug/tuto_vlc.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/tuto_vlc.cpp:178: first defined here
    debug/main.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/debug/tuto_vlc.moc:49: multiple definition of `Player::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)'
    debug/tuto_vlc.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/debug/tuto_vlc.moc:49: first defined here
    debug/main.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/debug/tuto_vlc.moc:77: multiple definition of `Player::metaObject() const'
    debug/tuto_vlc.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/debug/tuto_vlc.moc:77: first defined here
    debug/main.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/debug/tuto_vlc.moc:82: multiple definition of `Player::qt_metacast(char const*)'
    debug/tuto_vlc.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/debug/tuto_vlc.moc:82: first defined here
    debug/main.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/debug/tuto_vlc.moc:90: multiple definition of `Player::qt_metacall(QMetaObject::Call, int, void**)'
    debug/tuto_vlc.o:C:\Users\Public\DOWNLOAD\qt_vlc\tuto_vlc/debug/tuto_vlc.moc:90: first defined here
    debug/main.o:main.cpp:(.data+0x0): multiple definition of `Player::staticMetaObject'
    debug/tuto_vlc.o:tuto_vlc.cpp:(.data+0x0): first defined here
    debug/main.o:main.cpp:(.rdata+0x1c8): multiple definition of `Player::staticMetaObjectExtraData'
    debug/tuto_vlc.o:tuto_vlc.cpp:(.rdata+0x1c8): first defined here
    collect2: ld returned 1 exit status
    mingw32-make.exe[1]: *** [debug\tuto_vlc.exe] Error 1
    mingw32-make.exe: *** [debug] Error 2
    15:10:55: The process "C:\QtSDK\mingw\bin\mingw32-make.exe" exited with code 2.
    Error while building project tuto_vlc (target: Desktop)
    When executing build step 'Make
  • Pour le project tuto-vlc j'ai juste rajouter main:

    Pour instancier le player
  • Bonjour Bodafotsy, alors pour commencer, un petit tour ici serait utile : http://forum.qtfr.org/viewtopic.php?id=14003 !

    Ensuite, nous apprécions que les nouveaux membres utilisés les balises de mise en forme de leurs messages surtout pour les bouts de codes et les messages d'erreur, alors si tu pouvais modifier ton message, cela rendrais ton message p.us lisible par tous !
  • Bonjour,

    J'ai vu ce post concernant l'installation de VLC pour Qt. J'ai quelques problèmes lors de la phase d'installation de la lib VLC.
    J'ai récupéré la lib VLC par la commande : git://github.com/ntadej/vlc-qt.git

    J'ai également installé cmake comme demandé dans le Readme. Le problème c'est que j'ai plusieurs compilateur (visual C++, mingw, ...). J'ai compiler Qt avec mingw donc j'ai fait la commande: cmake .. -DCMAKE_INSTALL_PREFIX=prefix -G "MinGW Makefiles"

    Le début de l'installation se passe bien mais j'obtiens ce message suivant :

    -- The C compiler identification is GNU 4.7.2
    -- The CXX compiler identification is GNU 4.7.2
    -- Check for working C compiler: C:/MinGW/bin/gcc.exe
    -- Check for working C compiler: C:/MinGW/bin/gcc.exe -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Check for working CXX compiler: C:/MinGW/bin/g++.exe
    -- Check for working CXX compiler: C:/MinGW/bin/g++.exe -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    VLC-Qt: Build with Widgets: ON
    VLC-Qt: Build with QML: OFF
    VLC-Qt: Build with Qt5: OFF
    -- Looking for Q_WS_X11
    -- Looking for Q_WS_X11 - not found
    -- Looking for Q_WS_WIN
    -- Looking for Q_WS_WIN - found
    -- Looking for Q_WS_QWS
    -- Looking for Q_WS_QWS - not found
    -- Looking for Q_WS_MAC
    -- Looking for Q_WS_MAC - not found
    -- Found Qt4: C:/Qt/4.8.4/bin/qmake.exe (found suitable version "4.8.4", minimum
    required is "4.8.0")
    CMake Error at cmake/FindLIBVLC.cmake:71 (MESSAGE):
    Could not find LibVLC
    Call Stack (most recent call first):
    CMakeLists.txt:138 (FIND_PACKAGE)


    -- Configuring incomplete, errors occurred!
    Quelqu'un saurait-il me dire à quoi est du cette erreur?
    Apparemment il ne trouve pas la libVLC, c'est pas sensé être ce que je suis en train d'installer?

    Quelqu'un pourrait-il m'éclairer?
    D'avance merci.
  • Bonjour,

    Ne connaissant pas grand chose aux joies des makefile (et encore moins sous Windows), serait-ce possible de détailler d'avantage la partie compilation ?

    Je travail donc sous Win XP, avec QT SDK. J'utilise Qt Creator 2.4.1 Basé sur Qt 4.7.4 (32 bit), pour un projet en Qt 4.8

    J'ai déjà récupérer toutes les librairies et téléchargé et installé VLC 2.0.7. J'ai également MinGW d'installé quelque part dans le dossier de QtSDK/Symbian/...

    Mais à partir de là je ne sais pas quoi faire de plus. J'aimerai déjà essayer la démo fournie - qui pour le moment ne compile donc pas - afin d'avoir une idée du rendu final.

    Une autre question également :

    Serait-ce possible ensuite de modifier la vidéo, c'est-à-dire d'y incruster des images par exemple en cliquant avec le curseur ou autre ?

    Merci d'avance,

    Cordialement,
    Discaulit.
  • Bonjour,

    Merci pour ce tutoriel.
    Pour ceux qui voudrait aller plus loin, une manière plus propre d'intégrer VLC à Qt serait en créant un nouveau backend multimédia.

    http://qt-project.org/doc/qt-5.0/qtmultimedia/multimediabackend.html

    Cordialement,

    Cédric
Connectez-vous ou Inscrivez-vous pour répondre.