<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://doc.qtfr.org/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Documentation Qtfr - VLC</title>
  <link>http://doc.qtfr.org/</link>
  <description>La documentation francophone sur Qt</description>
  <language>fr</language>
  <pubDate>Thu, 03 Sep 2009 16:42:30 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Intégration de VLC</title>
    <link>http://doc.qtfr.org/post/2007/02/21/Integration-de-VLC</link>
    <guid isPermaLink="false">urn:md5:65c3d5b954ca0f9de7cf8e553dab58a0</guid>
    <pubDate>Wed, 21 Feb 2007 22:55:00 +0100</pubDate>
    <dc:creator>lud42fr</dc:creator>
        <category>Tutoriels</category>
        <category>class_QWidget</category><category>intégration</category><category>version_Qt3</category><category>version_Qt4</category><category>VLC</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Comment intégrer VLC dans une application Qt&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment visualiser une vidéo dans une applicaiton Qt&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce tutoriel va explorer l'intégration de la bibliothèque VLC dans Qt, pour la lecture de fichier.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qt3, Qt4 &lt;br /&gt;
&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: Ludo (&lt;a href=&quot;http://forum.qtfr.org/profile.php?id=1041&quot;&gt;lud42fr&lt;/a&gt;) &lt;br /&gt;
&lt;strong&gt;Status&lt;/strong&gt;&amp;nbsp;: basé sur la version SVN 0.9.0 de l’API VLC (devrait egalement fonctionner avec une version &amp;gt;= 0.8.6)&lt;/p&gt;    &lt;h3&gt;Introduction&lt;/h3&gt;


&lt;p&gt;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: &lt;a href=&quot;http://www.videolan.org/&quot; hreflang=&quot;en&quot;&gt;VLC&lt;/a&gt;.&lt;/p&gt;



&lt;h3&gt;Pré-requis&lt;/h3&gt;


&lt;p&gt;Voici ce dont vous aurez besoin&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les librairies VLC &amp;gt;= 0.8.6 &lt;a href=&quot;http://www.videolan.org/vlc/&quot; hreflang=&quot;en&quot;&gt;(Page de téléchargement)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;La documentation des &lt;a href=&quot;http://www.videolan.org/developers/vlc/doc/doxygen/html/modules.html&quot; title=&quot;en&quot;&gt;fonctions internes de VLC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Il semblerait que VLC soit &lt;em&gt;difficilement compilable sous Visual C++&lt;/em&gt;. 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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour compiler VLC 0.9.0 (la version actuellement en cours de développement, récupérable depuis le SVN), vous aurez besoin de&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bibliothèque MAD (MPEG Audio Decoder)&amp;nbsp;: &lt;a href=&quot;http://www.underbit.com/products/mad/&quot; title=&quot;http://www.underbit.com/products/mad/&quot;&gt;http://www.underbit.com/products/ma...&lt;/a&gt; ou mettre une option lors du &lt;code&gt;configure&lt;/code&gt; pour la désactiver,&lt;/li&gt;
&lt;li&gt;FFMpeg&amp;nbsp;: &lt;a href=&quot;http://ffmpeg.mplayerhq.hu/&quot; title=&quot;http://ffmpeg.mplayerhq.hu/&quot;&gt;http://ffmpeg.mplayerhq.hu/&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;liba52&amp;nbsp;: &lt;a href=&quot;http://liba52.sf.net&quot; title=&quot;http://liba52.sf.net&quot;&gt;http://liba52.sf.net&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;libmpeg2&amp;nbsp;: &lt;a href=&quot;http://libmpeg2.sf.net&quot; title=&quot;http://libmpeg2.sf.net&quot;&gt;http://libmpeg2.sf.net&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Lecteur vidéo&lt;/h3&gt;


&lt;p&gt;Ce tutoriel détaille la manière d'utiliser l'API VLC au travers d'une application Qt.&lt;/p&gt;


&lt;p&gt;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).&lt;/p&gt;


&lt;p&gt;Nous allons créer un petit exemple simple de lecteur vidéo, ce dernier permettant&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;d’initialiser VLC,&lt;/li&gt;
&lt;li&gt;de charger un flux vidéo,&lt;/li&gt;
&lt;li&gt;de naviguer dans la vidéo (avance/retour),&lt;/li&gt;
&lt;li&gt;de modifier le volume.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Une image valant mieux qu'un long discours, voici une capture d'écran du résultat final&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://doc.qtfr.org/public/2006/vlc.jpg&quot;&gt;&lt;img src=&quot;http://doc.qtfr.org/public/2006/.vlc_m.jpg&quot; alt=&quot;vlc.jpg&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://doc.qtfr.org/public/2007/qt_vlc.zip&quot;&gt;Le code de ce tutorial (source + .pro)&lt;/a&gt;&lt;/p&gt;


&lt;h4&gt;Compilation&lt;/h4&gt;


&lt;p&gt;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&lt;/p&gt;


&lt;h5&gt;Linux/Unix&lt;/h5&gt;


&lt;p&gt;Voici le fichier pro typique&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
TEMPLATE = app
DEPENDPATH += .
INCLUDEPATH += . 
SOURCES += tuto_vlc.cpp
LIBS+=-lvlc
&lt;/pre&gt;



&lt;h3&gt;Explications&lt;/h3&gt;


&lt;p&gt;Si l'on résume les étapes nécessaires à la lecture d'un vidéo dans une application Qt&amp;nbsp;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;initialiser un contexte VLC,&lt;/li&gt;
&lt;li&gt;ajouter un flux à la playlist,&lt;/li&gt;
&lt;li&gt;rediriger la fenêtre vidéo de sortie vlc sur un widget Qt de l'application,&lt;/li&gt;
&lt;li&gt;démarrer la lecture du flux.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Certaines fonctions de l'API de VLC seront détaillées. Toutes ces fonctions et bien plus encore sont disponibles dans la &lt;a href=&quot;http://www.videolan.org/developers/vlc/doc/doxygen/html/modules.html&quot; hreflang=&quot;en&quot;&gt;documentation de VLC&lt;/a&gt;.&lt;/p&gt;



&lt;h4&gt;Initialisation d'un contexte VLC&lt;/h4&gt;


&lt;p&gt;Normalement seule l'inclusion de l'entête vlc/libvlc.h est nécessaire pour utiliser toutes les fonctions VLC.&lt;/p&gt;


&lt;pre&gt;#include &amp;lt;vlc/libvlc.h&amp;gt;&lt;/pre&gt;


&lt;p&gt;VLC reporte toutes ses erreurs dans une structure particulière &lt;code&gt;libvlc_exception_t&lt;/code&gt;. Avant tout appel à une fonction VLC, il nous faudra donc une telle structure&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;libvlc_exception_t _vlcexcep; &lt;span style=&quot;color: #ff0000;&quot;&gt;//déclaration de la structure&lt;/span&gt;
libvlc_exception_init &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;_vlcexcep&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span style=&quot;color: #ff0000;&quot;&gt;//initialisation de la structure&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Quelques fonctions pratiques à utiliser avec &lt;code&gt;libvlc_exception_t&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;libvlc_exception_raised&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;_vlcexcep&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;!=&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;....&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;//teste si une erreur a eu lieu.&lt;/span&gt;
libvlc_exception_get_message&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;_vlcexcep&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span style=&quot;color: #ff0000;&quot;&gt;//retourne le message d'erreur&lt;/span&gt;
libvlc_exception_clear&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;_vlcexcep&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span style=&quot;color: #ff0000;&quot;&gt;//efface la/les erreurs précédentes&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Il est maintenant temps de créer un contexte VLC, de type &lt;code&gt;libvlc_instance_t&lt;/code&gt;, nécessaire à la plupart des fonctions&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;libvlc_instance_t *_vlcinstance;
_vlcinstance=libvlc_new&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;argc,argv,&amp;amp;_vlcexcep&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;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&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;libvlc_destroy (_vlcinstance, &amp;amp;_vlcexcep);&lt;/pre&gt;



&lt;h4&gt;Ajout d'un flux&lt;/h4&gt;


&lt;p&gt;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).&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;libvlc_playlist_clear&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;_vlcinstance,&amp;amp;_vlcexcep&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span style=&quot;color: #ff0000;&quot;&gt;//on vide la playlist&lt;/span&gt;
libvlc_playlist_add &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;_vlcinstance,URL,&lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&amp;amp;_vlcexcep&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;span style=&quot;color: #ff0000;&quot;&gt;//on ajoute le nouveau flux&lt;/span&gt;&lt;/pre&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&amp;nbsp;: à 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.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Avec URL une chaine de caractère de la forme (principalement)&amp;nbsp;:&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;          &lt;th&gt;Forme&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Fichier local&lt;/td&gt; &lt;td&gt;file://chemin&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Url http&lt;/td&gt;      &lt;td&gt;http://ip:port/file&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Fichier ftp&lt;/td&gt;   &lt;td&gt;ftp://ip:port/file&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;DVD&lt;/td&gt;           &lt;td&gt;dvd://[device]&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Flux UDP&lt;/td&gt;      &lt;td&gt;udp:[&lt;source address=&quot;&quot;&gt;]@[&lt;bind address=&quot;&quot;&gt;][:&lt;bind port=&quot;&quot;&gt;]%% &lt;/bind&gt;&lt;/bind&gt;&lt;/source&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;




&lt;h4&gt;Redirection du flux sur un widget Qt&lt;/h4&gt;


&lt;p&gt;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 ;-) ).&lt;/p&gt;


&lt;p&gt;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).&lt;/p&gt;


&lt;p&gt;N'importe quel widget peut servir pour afficher une video, mais dans la mesure ou il sera complètement recouvert, un simple &lt;code&gt;QWidget&lt;/code&gt; suffit.&lt;/p&gt;


&lt;pre&gt;//Notez l'usage de Widget-&amp;gt;winId() pour indiquer on dessiner la video
libvlc_video_set_parent(_vlcinstance ,Widget-&amp;gt;winId(),&amp;amp;_vlcexcep);&lt;/pre&gt;



&lt;h4&gt;Functions vidéos/audios&lt;/h4&gt;


&lt;p&gt;Certaines fonctions requièrent un pointeur sur libvlc_input_t .Pour obtenir ce pointeur, un flux doit etre en cours de lecture/pause&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;libvlc_input_t *input=libvlc_playlist_get_input (_vlcinstance,&amp;amp;_vlcexcep); //obtenir un pointeur input
libvlc_input_free (input); //il est en general de bon ton de libérer input après usage&lt;/pre&gt;



&lt;h5&gt;Contrôle de la vidéo&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Démarrer la lecture&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;libvlc_playlist_play (_vlcinstance , -1, 0, NULL, &amp;amp;_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&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Stopper la lecture&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;libvlc_playlist_stop (_vlcinstance, &amp;amp;_vlcexcep);&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Mettre en pause la lecture&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;libvlc_playlist_pause (_vlcinstance, &amp;amp;_vlcexcep);&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Connaître l'état&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;int etat=libvlc_playlist_isplaying(_vlcinstance, &amp;amp;_vlcexcep);
//etat=0 si stop ou pause
//etat=1 si lecture en cours&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Lire en boucle&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;int loop=1; //mettre a 0 pour stopper la lecture en boucle
libvlc_playlist_loop (_vlcinstance, loop,&amp;amp;_vlcexcep);&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Connaître la durée totale du flux (nécessite un pointeur input)&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;long long duree=libvlc_input_get_length (input, &amp;amp;_vlcexcep);&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Connaître la position actuelle en ms (nécessite un pointeur input)&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;long long position=libvlc_input_get_time (input, &amp;amp;_vlcexcep);&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Se positionner dans le flux (position en ms - nécessite un pointeur input)&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;libvlc_input_set_time (input, 42000,&amp;amp;_vlcexcep); //se positionne a 42 sec&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Connaître la position actuelle en pourcentage (nécessite un pointeur input)&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;float posEnPourcent=libvlc_input_get_position (input, &amp;amp;_vlcexcep)*100.0;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Se positionner dans le flux (position en pourcentage du temps total - nécessite un pointeur input)&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;libvlc_input_set_position(input, 0.42f,&amp;amp;_vlcexcep); // se positionne a 42% du flux ???&lt;/pre&gt;



&lt;h5&gt;Contrôle du volume&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Obtenir la valeur du volume comprise entre 0 et 100 - 0 étant le minimum&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;int volume=libvlc_audio_get_volume (_vlcinstance, &amp;amp;_vlcexcep);&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Positionner le volume (valeur en 0 et 100)&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;libvlc_audio_set_volume (_vlcinstance, 42,&amp;amp;_vlcexcep); //volume a 42%&lt;/pre&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2007/qt_vlc.zip"
      length="2792" type="application/zip" />
    
    
      </item>
    
</channel>
</rss>