Archives Mensuelles: mai 2009

J’ai terminé aujourd’hui l’interface graphique de mon application, mais celle-ci ne prend pour le moment qu’un seul client en compte. En effet, en dépit de mes recherches, je ne sais toujours pas comment utiliser gstrtpbin avec une caméra IP. Les quelques exemples de streaming vidéo utilisant Gstreamer et une caméra IP que j’ai pu trouver utilisent tous soit rtspsrc, soit gnomevfssrc.

J’ai également codé la partie Gstreamer de mon application, c’est-à-dire celle qui s’occupe du streaming vidéo. Malheureusement, celle-ci ne fonctionne pas, et je n’arrive pas à cerner pourquoi? Il semblerait pourtant que les pipelines soient bien lancés. Qui-plus-est, hors de l’application (c’est-à-dire si on les lance à partir d’une console), ils fonctionnent très bien. Ce n’est pas non plus l’application qui les bloque, car lorsque l’on lance un pipeline qui se contente d’afficher le flux vidéo de la caméra depuis l’application, cela fonctionne également bien et une fenêtre s’ouvre pour afficher le flux. Je ne vois donc vraiment pas d’où peut provenir le problème.

J’ai commencé à réaliser l’interface graphique de l’application que Nicolas R. m’a demandé de réaliser. Celle-ci doit pouvoir permettre de lancer un émetteur, un serveur ou un récepteur (comme décrit dans mon article précédent) selon un bouton sur lequel on aura cliqué. Cette interface permet de rentrer les différentes informations nécessaires au lancement du dispositif choisi, telles que l’adresse IP de la camera, celle du serveur ou du récepteur, ainsi que les ports utilisés.

J’ai également un peu commencé à réaliser le code permettant de lancer les pipelines.

Sinon, je cherche toujours comment streamer le flux d’une caméra IP avec gstrtpbin, mais je n’ai encore rien trouvé pour le moment.

Maintenant que j’ai un environnement de travail stable, j’ai pu réaliser trois petites applications : la première envoie un flux vidéo à la seconde, qui transmet ce flux à la troisième dont le rôle est de l’afficher. Voici les lignes de commande Gstreamer permettant de réaliser ce travail :

Commande pour lancer la source :

./gst-launch -v rtspsrc location=rtsp://(adresse IP de la webcam):554/mpeg4/media.amp ! queue ! decodebin ! ffenc_h263 ! rtph263pay ! .send_rtp_sink gstrtpsession name=session .send_rtp_src ! udpsink port=5000 host=(adresse IP du relais) session.send_rtcp_src ! udpsink port=5001 host=(adresse IP du relais)

Commande pour lancer le relais

./gst-launch udpsrc port=5000 caps=”application/x-rtp, media=(string)video, seqnum-base=(guint)35089″ ! .recv_rtp_sink gstrtpsession name=sessionrecv .recv_rtp_src ! .send_rtp_sink gstrtpsession name=sessionsend .send_rtp_src ! udpsink port=5002 host=(adresse IP du récepteur) udpsrc port=5001 caps=”application/x-rtcp” ! sessionrecv.recv_rtcp_sink sessionsend.send_rtcp_src ! udpsink port=5003 host=(adresse IP du récepteur)

Commande pour lancer le récepteur/afficheur :

./gst-launch udpsrc port=5002 caps=”application/x-rtp, media=(string)video, seqnum-base=(guint)35089″ ! .recv_rtp_sink gstrtpsession name=session .recv_rtp_src ! rtph263depay !  ffdec_h263 ! xvimagesink udpsrc port=5003 caps=”application/x-rtcp” ! session.recv_rtcp_sink

J’ai ensuite commencé à coder une partie de l’interface graphique de l’application de test qui me servira au final, et j’ai également effectué quelques recherches afin de trouver comment diffuser un flux vidéo à plusieurs clients.

J’ai perdu une journée de plus à cause de mon problème de la veille. En effet, depuis que j’ai désinstallé les plug-ins de Gstreamer, mon Debian refusait de démarrer. J’ai donc dû, avec l’aide de Nicolas R., entièrement réinstaller Debian, ainsi que Gstreamer, Eclipse et Java.

À la fin de la journée, j’ai tout de même pu effectuer quelques tests sur la version de Gstreamer qui a été compilée à la main, ainsi que sur H.263 afin de retrouver les lignes de commande dont j’avais besoin. Cela m’a pris un petit moment, mais tout marche finalement très bien.

Aujourd’hui, j’ai repris l’installation de Gstreamer à la main. Tout d’abord, j’ai dû résintaller la dernière version de libtool (la 2.2.6) ainsi que gtk-doc afin que la compilation se déroule correctement. Malgré cela, l’encodeur h263 était toujours manquant à l’appel. Lorenzo m’a alors fait remarquer que la compilation ne s’effectuait en fait pas correctement et qu’il me manquait git. J’ai alors onstallé git ainsi que certains de ses plug-ins, et la compilation fut effectivement plus longue et plus complète. Malheureusement, lorsque j’ai voulu tester les petites applications que j’avais développées la semaine dernière, celles-ci m’ont affiché le message d’erreur suivant lors de la création du flux vidéo :

(SWT:21473): GStreamer-WARNING **: Failed to load plugin ‘/usr/lib/gstreamer-0.10/libgstrtsp.so’: /usr/local/lib/libgstrtp-0.10.so.0: undefined symbol: gst_event_has_name
Exception in thread “main” org.gstreamer.GstException: pas d’élément « rtspsrc »

L’élément rtspsrc est pourtant bien présent sur mon ordinateur.

J’ai, au début, pensé qu j’avais mal compilé les plug-ins “goog” de gstreamer, car ceux-ci affichent des messages lors de la compilation qui sont plus désordonnés que ceux des autres plugins. Mais en comparant avec Lorenzo, il semblerati que l’erreur ne vienne pas de là. Puis en parcourant quelques forums, j’ai découvert que cette erreur pouvait provenir du fait que deux versions de Gstreamer étaient installées. J’ai donc vérifié, et l’ancienne version, installée à l’aide des paquets Synaptic était toujours présente. Je l’ai donc désinstallée, et j’ai recompilé la nouvelle version, et tout marche désormais à nouveau.

J’ai finalement résolu mon problème de la veille : il était simplement dû au fait que certains backslash contenus dans le caps n’étaient pas interprétés comme tel, mais comme des signaux de caractères spéciaux.

Le second problème que j’ai rencontré était le fait que je voulais pouvoir récupérer mon flux vidéo sans pour autant retirer la partie RTCP de ma ligne de commande. Mais Lorenzo a pu m’aider en me montrant la pipeline à utiliser dans ce cas.

J’ai alors voulu régler mon problème d’encodeurs indisponibles. Nicolas R. et Lorenzo m’ont dit, tous deux, qu’il fallait que je compile Gstreamer à la main afin d’avoir ces encodeurs. J’ai donc suivi la manœuvre indiquée par Lorenzo sur son blog, mais au moment de compiler un des plug-in, j’ai reçu le message d’erreur suivant :

Making all in gst
Making all in parse
../../libtool: line 833: X–tag=CC: command not found
../../libtool: line 866: libtool: ignoring unknown tag : command not found
../../libtool: line 833: X–mode=compile: command not found
../../libtool: line 1000: *** Warning: inferring the mode of operation is deprecated.: command not found
../../libtool: line 1001: *** Future versions of Libtool will require –mode=MODE be specified.: command not found
../../libtool: line 1031: libtool: warning: cannot infer operation mode from `/bin/sh’: No such file or directory
../../libtool: line 7122: libtool: you must specify a MODE: command not found
../../libtool: line 7123: Try `libtool –help’ for more information.: command not found
make[4]: *** [libgstparse_la-lex._gst_parse_yy.lo] Erreur 1
make[3]: *** [all-recursive] Erreur 1
make[2]: *** [all] Erreur 2
make[1]: *** [all-recursive] Erreur 1
make: *** [all] Erreur 2

Il semblerait que la version de libtool que j’utilise (1.5.26)  ne soit pas la bonne. Cependant, certains sites disent le contraire. J’ai donc désinstallé ma version de libtools et je l’ai réinstallée à la main. Étant donné que cela n’a rien changé, j’ai fait de même avec la dernière version(2.2.6) et celle-ci s’est avérée être la bonne.

Mais j’ai à présent un autre problème : lorsque je lance le fichier de configuration, il semblerait qu’il ne réussisse pas à trouver Gstreamer, alors que j’ai installé ce paquet précédemment…

Ayant un peu mieux cerné SWT, j’ai pu commencer aujourd’hui à implémenter une petite interface affichant le flux d’une caméra IP, en me servant de gstreamer-java et bien évidemment de SWT. Cela a tout de suite bien fonctionné. J’ai ensuite voulu implémenter une petite application de type client/serveur. La partie serveur n’est composée pour le moment que d’un bouton, qui envoie le flux vidéo de la caméra à une autre application lorsque l’on clique sur ce bouton. L’autre application est une application cliente, qui est composée, elle, d’un bouton et d’un composant de type conteneur vidéo, qui affichera le flux vidéo une fois qu’un serveur a été lancé et que l’on a cliqué sur le bouton. Malheureusement, cette partie-là ne fonctionne pas encore. Le pipeline Gstreamer est pourtant le bon (il fonctionne en ligne de commande), et l’application serveur envoie bien le flux (on peut le récupérer par ligne de commande, toujours). Mais la partie cliente semble incapable de récupérer ce flux.

Je rencontre également un autre problème : l’encodeur H.263, qui est celui que nous devrions utiliser dès à présent, n’est pas installé sur mon ordinateur. Pourtant, il ne me manque pas de paquets Gstreamer. Je crains que, à l’instar de l’encodeur H.264, il ne soit plus disponible dans les dernières versions des plug-in de Gstreamer.

Aujourd’hui, j’ai continué d’étudier un peu SWT, notamment réalisant quelques “exercices”. Ces derniers sont présentés dans le PDF que vous pouvez trouver ici. J’ai ainsi pu découvrir les différents contrôles ainsi que les différentes manières de traiter un évènement avec SWT, et les appels synchrones et asynchrones.

J’ai terminé mon rapport aujourd’hui. Il est disponible à l’adresse suivante :

http://www.scribd.com/share/upload/11923383/1b6g7y8vq8tvsvgkexea?from_email_13_share_upload=1

L’ordinateur sur lequel est installé Debian s’avère être trop lent pour le développement, on m’a donc suggéré d’utiliser une partition de mon ordinateur Windows pour installer Debian dessus. Mais cette installation est très très très longue et a occupé une bonne partie de ma journée…

Comme hier, j’ai poursuivi la rédaction de mon rapport, et j’ai relancé quelques tests afin de m’assurer que je n’étais pas passée à côté d’un paramètre important, comme ce fut le cas avec le paramètre quality de la veille.