Catégories
Nagios Open-source Planet-libre Systeme

Pour en finir avec NDO

Vu le nombre de messages sur le forum concernant l’installation et la configuration de NDO (la petite boite qui fait le lien entre Nagios et Centreon), je me devais de rédiger ce billet sur le sujet. Nous allons donc voir étape par étape les choses à vérifier et à faire pour faire fonctionner ce bouzin (oui, oui c’est un bouzin).

Dans la suite de ce billet, je pars sur l’hypothése ou vous avez installé Nagios et Centreon en suivant cette série de billets.

NDO c’est quoi ?

NDO est un module additionnel permettant à Nagios d’écrire dans une base de données l’état des machines et services à superviser.

NDO est composé de deux modules: NDOMOD et NDO2DB.

NDOMOD doit être lancé sur le serveur Nagios et permet de récupérer les informations remontées par Nagios pour les transmettre via TCP (ou un socket Unix) vers NDO2DB.

NDO2DB est un daemon qui écoute sur un port TCP (ou un socket Unix) et écrit les données recues dans une base de donnée (MySQL ou PgSQL).

Compilation de NDO

Le plugin est a récupérer à l’adresse suivante: http://www.nagios.org/download/addons/ ou en saisissant les commandes suivantes:

# sudo -s

# cd /usr/src

# wget http://dfn.dl.sourceforge.net/sourceforge/nagios/ndoutils-1.4b9.tar.gz

Remarque: la version disponible au moment de l’écriture de ce billet est la 1.4b9 (à modifier par vos soins).

On lance la compilation pour une utilisation d’une base de donnée MySQL:

# tar zxvf ndoutils-1.4b9.tar.gz

# cd ndoutils-1.4b9

# ./configure –disable-pgsql –with-mysql-lib=/usr/lib/mysql –with-ndo2db-user=nagios –with-ndo2db-group=nagios

# make

La compilation doit se faire sans erreur…

Installation de NDO

NDO ne dispose pas d’un « installateur » standard, il faut donc saisir les commandes suivantes (toujours en mode root):

# cd /usr/src/ndoutils-1.4b9

# cp src/ndomod-3x.o /usr/local/nagios/bin/ndomod.o

# cp src/ndo2db-3x /usr/local/nagios/bin/ndo2db

On écrase les droits par défaut de ces fichiers:

# chown nagios:nagios /usr/local/nagios/bin/ndo*

# chmod 774 /usr/local/nagios/bin/ndo*

Configuration de la base de donnée MySQL

Avant que NDO2DB ne puisse écrire des informations dans la base de donnée, il faut créer et configurer cette dernière.

Création de la base de données MySQL NDO:

# mysqladmin -u root -p create ndo

# mysql -u root -p mysql

mysql> GRANT ALL ON ndo.* TO ndouser@localhost IDENTIFIED BY ndopassword;

Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.00 sec)

mysql> exit

Puis on la configure:

# cd /usr/src/ndoutils-1.4b9/db

# ./installdb -u ndouser -p ndopassword -h localhost -d ndo

… Table ‘nagios.nagis_dbversion’ doesn’t exist at ./installdb line 51…

Remarque: vous pouvez ignorer l’erreur.

Configuration de NDO

La configuration de NDO se fait par deux fichiers:

  • ndomod.cfg : configuration de NDOMOD
  • ndo2db.cfg: configuration de NDO2DB

Leux fichiers doivent être initialisés:

# cp config/ndomod.cfg /usr/local/nagios/etc/

# cp config/ndo2db.cfg /usr/local/nagios/etc/

On leurs donne les droits:

# chown nagios:nagios /usr/local/nagios/etc/ndo*

Puis on les édite de la manière suivante:

# vi /usr/local/nagios/etc/ndomod.cfg

instance_name=Central

output_type=unixsocket

output=/usr/local/nagios/var/ndo.sock

tcp_port=5668

output_buffer_items=5000

buffer_file=/usr/local/nagios/var/ndomod.tmp

et:

# vi /usr/local/nagios/etc/ndo2db.cfg

ndo2db_user=nagios

ndo2db_group=nagiosgrp

socket_type=unix

socket_name=/usr/local/nagios/var/ndo.sock

tcp_port=5668

db_servertype=mysql

db_host=localhost

db_name=ndo

db_port=3306

db_prefix=nagios_

db_user=ndouser

db_pass=ndopassword

Configuration de Nagios

Nous allons configurer Nagios pour qu’il passe les informations automatiquement à NDOMOD. Pour celà, il faut éditer le fichier /usr/local/nagios/etc/nagios.cfg et y ajouter les 2 lignes suivantes:

# vi /usr/local/nagios/etc/nagios.cfg

event_broker_options=-1

broker_module=/usr/local/nagios/bin/ndomod.o config_file=/usr/local/nagios/etc/ndomod.cfg

Attention, si vous faite un copier/coller pour ajouter les lignes de
configuration dans le nagios.cfg, il faut faire attention à la ligne:

broker_module=/usr/local/nagios/bin/ndomod.o config_file=/usr/local/nagios/etc/ndomod.cfg

qui est sur une seule ligne et pas en deux lignes…

Automatisation du lancement de NDO

NDO n’est pas fourni avec un script de démarrage automatique (au démarrage du serveur). Voici donc un procédure à suivre pour une installation sous GNU/Linux Ubuntu (script à adapter à votre distribution).

Pour automatiser le lancement de NDO au démarrage du serveur, il faut ajouter le script suivant dans le fichier /etc/init.d/ndo2db). Il faut le rendre exécutable:

# sudo chown root:root /etc/init.d/ndo2db

# sudo chmod 755 /etc/init.d/ndo2db

On automatise le lancement du processus ndo2db au démarrage du serveur:

# sudo update-rc.d ndo2db defaults

Test de NDO + Nagios

Pour que votre configuration soit prise en compte, il faut lancer NDO et relancer Nagios:

# /etc/init.d/ndo2db start

# /etc/init.d/nagios restart

Running configuration check…done.

Stopping nagios: No directory, logging in with HOME=/

done.

Starting nagios:No directory, logging in with HOME=/

No directory, logging in with HOME=/

done.

Remarque: vous pouvez ignorer les messages: « No directory, logging in with HOME=/ »

Si tout se passe bien, Nagios devrait commencer à écrire les informations dans la base de donnée MySQL. Pour vous en assurer, allez voir du coté du fichier de log si vous avez les messages suivants:

tail -f /usr/local/nagios/var/nagios.log

[1234886298] Auto-save of retention data completed successfully.

Configuration de NDO pour Centreon

Passons maintenant aux choses sérieuses avec la configuration de NDO pour Centreon. Il faut commencer par modifier la base de donnée MySQL pour prendre en compte Centreon (quand je vous disais bouzin…):

# cd /usr/src/centreon-2.0/www/install

# mysql -u root -p ndo < ./createNDODB.sql

# mysql -u root -p

mysql> GRANT SELECT , INSERT , UPDATE , DELETE ON ndo . * TO ndouser@localhost IDENTIFIED BY ndopassword;

Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;Query OK, 0 rows affected (0.00 sec)

mysql> exit

Nous allons maintenant générer les fichiers de configuration NDO par Centreon. Pour celà, il faut aller dans le menu Configuration/Centreon, puis cliquer sur
le lien ndo2db.cfg dans le menu de gauche et cliquer sur le lien
Principal.

Centreon - IT & Network Monitoring-1.jpg

Saisir la configuration suivante dans l’onglet General (Socket type: Unix et fichier socket /usr/local/nagios/var/ndo.sock):

  • Socket type: unux
  • Socket name: /usr/local/nagios/var/ndo.sock

Centreon - IT & Network Monitoring-11.jpg

Modifier le login/password pour l’accès à la base de donnée NDO (ndouser/ndopassword):

Centreon - IT & Network Monitoring-3.jpg

il faut ensuite aller dans le menu Configuration/Centreon, puis
cliquer sur le lien ndomod.cfg dans le menu de gauche et cliquer sur le
lien Principal.

Centreon - IT & Network Monitoring-12.jpg
Saisir la configuration suivante:
  • Socket type: unixsocket
  • Output: /usr/local/nagios/var/ndo.sock
  • Buffer File: /usr/local/nagios/var/ndomod.tmp
Centreon - IT & Network Monitoring-15.jpg

Enfin nous allons exporter la configuration de Centreon vers Nagios (et donc normalement écraser les anciens fichiers de configuration de NDO).

La première chose à faire est de vérifier que les droits du
répertoire /usr/local/nagios/etc (et de tout ce qui a dessous) sont
compatible avec un écriture qui va être faite par Centreon (donc avec
l’utilisateur www-data):

# chmod -R 664 /usr/local/nagios/etc

Nagios reste le coeur de notre système de supervision. Ainsi quand
un host/service est créé dans l’interface de Centreon (menu
configuration / Hosts / Add), il faut ensuite exporter cette nouvelle
configuration pour qu’elle soit prise en compte par Nagios et donc
affiché dans l’interface de supervision de Centreon.

Il faut pour cela se rendre dans le menu Configuration / Nagios et saisir le formulaire suivant:

Centreon - IT & Network Monitoring-9.jpg

Le résultat de la commande doit être le suivant:

Centreon - IT & Network Monitoring-10.jpg

Il faut également penser à vérifier que l’exportation vers le répertoire de Nagios se passe sans problème (il ne faut PAS de message de type KO dans l’écran précédant).

Cette action est a répéter a chaque fois que vous souhaitez ajouter une configuration depuis Centreon vers Nagios.

Après quelques minutes, les informations
sur l’état de vos machines/services devraient remonter dans Centreon à
travers le module NDO. Pour vérifier que tout ce passe bien à ce
niveau, il faut se rendre dans le menu Monitoring / Event logs et
vérifier qu’il n’y a pas d’erreur au niveau ndomod:

Centreon - IT & Network Monitoring-14.jpg

Et voilà, vous devriez avoir un système opérationnel. En cas de problème pour suivre cette procédure, vous pouvez toujours poser une question sur le forum.

Catégories
Blog Open-source Reseau Systeme

Petites stats sur le forum

Après un mois d’existence, le forum du Blog de Nicolargo se porte bien. Quelques chiffres:

  • 69 utilisateurs déclarées
  • 70 question posées
  • 426 réponses
  • quelques utilisateurs très actifs (Suikox, Carnage76, Raptor45, Megax…)
  • plus de 100 pages vues par jours

Beaucoup de sujets abordés autour de Nagios, Centreon et la supervision réseau, mais n’oubliez pas que le but de ce forum est de partager ses idées sur tout les sujets du blog 😉

Pour vous inscrire et participer activement à la vie open-source, c’est par ici !

Catégories
Open-source

Actualité open-source de la semaine #51

L’actualité open-source de la semaine…

L’image de la semaine

Windows 7even ou KDE4 ?

Tout le monde en parle, sauf moi…

L’actualité du libre et de l’open source en vrac:

Autres choses ?

Catégories
Open-source Reseau Systeme

Utilisation de Centreon

Centreon est une belle couche d’administration Web à ajouter à votre serveur Nagios (si vous êtes allergiques à la ligne de commande Unix). Cependant la prise en main de Centreon peut s’avérer difficile vu l’absence de guide utilisateur digne de ce nom…

Avant de commencer, il faut vous assurer d’avoir une configuration Nagios/Centreon en état de marche…

Nous allons donc dans ce billet dérouler un cas d’école: l’ajout  d’un « host » de type serveur Linux et d’un « service » HTTP pour la supervision d’un serveur Web Apache.

Ajout d’un « host »

Nous allons ajouter un host de type serveur Linux à notre configuration Nagios.

On va pour cela dans le menu Configurer / Hosts et on clique sur le bouton Add:

Ensuite, on entre les caractéristiques propres du serveur (1):

  • Son nom (« host name »): www
  • Sa description (« Alias »): Serveur Web
  • Son adresse IP/DNS: www.mondomaine.com

On clique ensuite sur le bouton + pour ajouter un template associé a cet « host » (2). Pour rappel, un template est la centralisation de caractéristiques communes à des machines.

Puis on sélectionne le template (3): Servers-Linux

Enfin, on clique sur le bouton Save (4).

A ce stade, l' »host » www est dans la configuration de Centreon.

Ajout d’un « service »

Nous allons ajouter un host de typeNous allons poursuivre notre exemple par l’ajout d’un « service » pour superviser un serveur Web hébergé sur notre « host » www. Pour cela, il faut se rendre dans les menus Configuration / Service.

 

Comme on peut le voir, Centreon à créé des services par défaut (associé au template par défaut) permettant de superviser par SNMP certains services (disque, charge, swap) de notre serveur. Pour que cela fonctionne, il faut bien évidemment qu’un serveur SNMP soit lancé et configuré sur la machine « host » www. Dans mon exemple, je veux seulement surveiller la présence d’un serveur Web, je vais donc supprimer ces services de ma configuration Nagios:

Puis:

On peut ensuite ajouter notre nouveau service en cliquant sur le bouton Add:

Nous allons commencer par saisir:

  • le nom du service: Serveur HTTP (1)
  • le template assosié: generic-service (2)

Il est possible de voir le contenu d’un template en cliquant sur le bouton à droite du menu déroulant:

ce qui va afficher:

  • Le plugin à appeler pour ce service: check_http (3)

On clique ensuite sur le menu Relations (4) pour associer notre « service » au « host »

On ajoute donc le « host » www à la liste des hosts associés à ce service:

On finalise en cliquant sur le bouton Save:

Le service est maintenant présent dans la configuration de Centreon.

Notre configuration n’est pas encore supervisé, Centreon ne fait pas la supervision, c’est Nagios qui s’occupe de ces taches. Il faut donc exporter la nouvelle configuration sur notre serveur Nagios.

Exportation de la configuration vers Nagios

Il faut pour cela, aller dans le menu Configuration / Nagios / Generation (1 / 2) puis cliquer sur les boutons:

  • « Move export files »: pour déplacer physiquement les fichiers de configuration dans l’arborescence Nagios.
  • « Restart Nagios »: pour demander à Centreon de redémarrer Nagios pour que la configuration soit prise en compte.

Puis cliquer sur Export (3)

Si tout ce passe bien, vous ne devriez pas avoir de message d’erreur mais seulement:

Quelques minutes après l’exportation, la nouvelle configuration apparaitra dans l’interface de Centreon:

Catégories
Open-source

Actualité open-source de la semaine #50

L’actualité open-source de la semaine…

L’image de la semaine


Une distribution Ubuntu modifié sur le Netbook HP (Mini 1000 Mi)

Tout le monde en parle, sauf moi…

L’actualité du libre et de l’open source en vrac:

  • Amaya, l’éditeur Web open-source développé par l’INRIA sort en version 11.1.
  • La sortie de Firefox 3.1 repoussée à cause de bugs non résolus dans le moteur de JavaScript.
  • Une Forge pour les projets informatiques militaires US open-source.
  • Linus adore Microsoft SongSmith
  • VMWare met un pied dans l’open-source (enfin dans le LGPL)

Autres choses ?

Catégories
Developpement

Comment développer sur l’iPhone

O’Reilly, mon éditeur préféré, propose un nouvel ouvrage qui va intéresser plus d’un Geek/développeur.  « iPhone SDK » est un ouvrage complet sur le développement d’applications pour le téléphone vedette de la société Apple ce qui peut également intéressé ceux qui recherchent un emploi de game designer.

Le bouquin est en Anglais et voici une description détaillé (source O’Reilly):

This practical book offers programmers the knowledge and code they need
to create cutting-edge mobile applications, using Apple’s iPhone SDK.
The iPhone is one of the hottest new pieces of technology: a fully
functional portable Unix operating system with the most advanced
handheld user interface in existence. iPhone SDK Application Development
covers development environment for both the iPhone and iPod Touch, from
windows and navigation bars to more advanced layers of the iPhone SDK,
such as screen transitions, low-level graphics rendering using
CoreSurface, the MultiTouch API, and digital sound and music rendering
with Celestial and CoreAudio. With this book, you will:

  • Understand how the iPhone works internally, with a complete introduction to the technology
  • Learn how different iPhone components interact with each other
  • Use your existing Mac OS X development skills by understanding the similarities between iPhone and Mac OS X Leopard
  • Learn about the iPhone-specific APIs, such as the user interface, to develop custom iPhone applications
  • Get code examples to help you write various features of your application


With iPhone SDK Application Development, you’ll learn how to create effective iPhone applications and games with the same tools Apple uses.

Bon dev 😉

Catégories
Open-source

Un client SIP en ligne de commande

PJSip est un framework (C et Python) open-source permettant de développer simplement des applications de VoIP basées sur le protocole SIP. PJSip est fourni en standard avec PJsua, un client SIP en ligne de commande que nous allons aborder dans ce billet.

Installation

Pour installer PJSip (et donc PJsua) sur votre système (exemple sous Ubuntu), il faut saisir les lignes de commandes suivantes:

# wget http://www.pjsip.org/release/1.0.1/pjproject-1.0.1.tar.bz2
# bzip2 -d pjproject-1.0.1.tar.bz2
# tar xvf pjproject-1.0.1.tar
# cd pjproject-1.0.1
# ./configure
# make dep
# make
# sudo make install
# sudo cp ./pjsip-apps/bin/pjsua-i686-pc-linux-gnu /usr/local/bin/pjsua

Premier lancement de PJsua

PJsua est un client SIP en ligne de commande (CLI) qui utilise les librairies PJSip.

Pour lancer le logiciel, il faut utiliser la commande suivante:

# pjsua

Le menu suivant devrait apparâitre:

Enregistrement d’un compte SIP

Nous allons commencer par nous enregistrer sur notre serveur SIP:

>>> +a
Your SIP URL: (empty to cancel): sip:login@monserveur.mondomaine.com
URL of the registrar: (empty to cancel): sip:monserveur.mondomaine.com
Auth Realm: (empty to cancel): login
Auth Username: (empty to cancel): login
Auth Password: (empty to cancel): password

Je n’utilise pas cette interface textuelle. Culture BSD oblige, je préfère passer les paramètres en ligne de commande de la manière suivante:

# pjsua –id sip:login@monserveur.mondomaine.com –registrar sip:monserveur.mondomaine.com –realm * –username login –password password

ou, encore mieux, par un fichier de configuration:

# vi login.cfg

–id sip:login@monserveur.mondomaine.com
–registrar sip:monserveur.mondomaine.com
–realm *
–username login
–password password

# pjsua –config-file login.cfg

Remarque: si vous souhaitez lancer PJsua directement sur votre serveur SIP il faut ajouter une option pour lui dire de fonctionner sur un autre port SIP (en effet le port par défaut 5060 est utilisé par votre serveur SIP).

# pjsua –local-port=5080 –config-file login.cfg

Nous allons maintenant simuler notre premier appel SIP

Pour simuler un appel entre notre compte « login » (défini dans le fichier login.cfg) et le compte « login2 » , il faut saisir en ligne de commande:

# pjsua –config-file login.cfg sip:login2@monserveur.mondomaine.com

Simuler un appel à partir d’un fichier .WAV

Si vous souhaitez simuler un appel non pas avec un péripherique d’entrée audio mais à partir d’un fichier .wav, il suffit de

# pjsua –config-file login.cfg –play-file=./monficher.wav sip:login2@monserveur.mondomaine.com

Conclusion

Nous avons abordés une infime partie des fonctionnalités proposées par PJSip. Je vous conseille la lecture des documentations officielles.

Catégories
Gstreamer Open-source

J’ai streamé avec GStreamer

Après une introduction à GStreamer qui vous, je l’espère, donné l’eau à la bouche, nous allons poursuivre la découverte de ce superbe framework en nous focalisant sur les fonctions de streaming audio et vidéo.

Avant de commencer à jouer, il faut installer GStreamer et ses composants sur votre machine. Je vous conseille d’installer GStreamer en suivant ce tutoriel. Vous disposerez ainsi des dernières versions des codecs.

Premier streaming vidéo: Theora et UDP

Nous allons dans ce premier exemple diffuser un flux vidéo (venant d’une Webcam) en utilisant le protocole UDP. Nous utiliserons le codec libre Theora (wiki) pour compresser la vidéo.

Sur la machine cliente (celle qui va recevoir et afficher le flux vidéo), il faut saisir la ligne suivante:

# gst-launch -v udpsrc port=1234 ! theoradec ! autovideosink

En clair, GStreamer va écouter le flux vidéo sur le port UDP/1234 (avec udpsrc) puis décompressé le flux Theora (theoradec) et enfin l’afficher sur l’écran (autovideosink).

Sur le serveur (la machine sur laquelle la Webcam est connectée et accessible par /dev/video1), nous allons saisir:

# gst-launch -v v4l2src device=/dev/video1 ! ffmpegcolorspace \
! videoscale method=1 ! video/x-raw-yuv,width=320,height=240,framerate=\(fraction\)15/1 \
! theoraenc bitrate=150 ! udpsink host=127.0.0.1 port=1234

Plusieurs remarques sur cette ligne de commande. On utilise la fonction videoscale pour redimensionner le format d’entrée de la vidéo (en taille et en nombre d’images par seconde) afin de limiter la bande passante. Je force ainsi dans ce cas le codec Theora à 150 Kbps. Enfin, la fonction udpsink permet de diffuser en UDP sur le réseau (port 1234 et adresse destination 127.0.0.1 – celle du client).

Remarque importante: il faut que le client soit lancé avant le serveur.

Streaming vidéo: Theora et TCP

Nous allons modifier légèrement notre premier exemple pour utiliser le protocole TCP en lieu et place du protocole UDP.

Le framework au niveau du client (le poste qui va recevoir le flux vidéo) est:

gst-launch -v tcpserversrc host=127.0.0.1 port=1234 ! decodebin ! autovideosink

GStreamer lance un serveur TCP (en écoute sur le port 1234 de l’adresse 127.0.0.1) et affiche le résultat (on peut utiliser decodebin à la place de theoradec) sur l’écran.

Sur le serveur (la machine avec la WebCam) on lance la commande:

gst-launch -v v4l2src device=/dev/video1 ! ffmpegcolorspace \
! video/x-raw-yuv,width=320,height=240,framerate=\(fraction\)10/1 \
! theoraenc bitrate=200 ! oggmux \
! tcpclientsink host=127.0.0.1 port=1234

On utilise la fonction
videoscale pour redimensionner le format d’entrée de la vidéo (en
taille et en nombre d’images par seconde) afin de limiter la bande
passante. Je force ainsi dans ce cas le codec Theora à 150 Kbps. Enfin,
la fonction tcpclientsink permet de diffuser en TCP sur le réseau (port 1234 et adresse destination 127.0.0.1 – celle du client).

Remarque importante: il faut que le client soit lancé avant le serveur.

Streaming vidéo: Theora et RTP/RTCP

On va compliquer encore un peu plus notre système de streaming en utilisant les protocoles RTP (pour les données) et RTCP (pour les flux de contrôle de ces données).

Contrairement aux deux premiers exemples, il faut lancer le client après le serveur. En effet, il est nécessaire de renseigner, au niveau du client, une chaine de configuration (caps) généré par le serveur.

gst-launch -v  v4l2src \
! videoscale method=1 ! video/x-raw-yuv,width=320,height=240,framerate=\(fraction\)15/2 \
! theoraenc ! rtptheorapay \
! .send_rtp_sink gstrtpsession name=session .send_rtp_src ! udpsink port=5000 host=127.0.0.1  \
session.send_rtcp_src ! udpsink port=5001 host=127.0.0.1

Le serveur va encoder le flux vidéo avec le codec Theora, ajouter les entêtes RTP Theora (rtptheorapay) puis diffuser le flux en UDP (RTP/UDP sur le port 5000) grâce aux plugins gstrtpsession et udpsink. En parallèle, un serveur RTCP (RTCP/UDP) est lancé. Il envoie les information RTCP vers le port 5001 de la machine cliente (127.0.0.1).

Notez le paramètre -v passé à gst-launch. Il est nécessaire pour l’obtention de la chaine de configuration (caps).

Lors du lancement de cette commande, un grand nombre de messages va s’afficher. Il faut récupérer la dernière occurence du type:

caps = application/x-rtp, media=(string) video … seqnum-base=(guint)39194

Nous pouvons alors lancer notre client:

gst-launch udpsrc port=5000 caps= »application/x-rtp, media=(string) video … seqnum-base=(guint)39194 » \
! .recv_rtp_sink gstrtpsession name=session .recv_rtp_src \
! rtptheoradepay !  theoradec ! xvimagesink \
udpsrc port=5001 caps= »application/x-rtcp » ! session.recv_rtcp_sink

Le client écoute le flux de donnée vidéo sur le port UDP/5000. Grâce aux informations fournies dans le champs caps, il peut décoder le flux. On enlève l’entête RTP (rtptheoradepay) puis on décode le flux théora (theoradec) et on affiche. En parallèle, on écoute les flux de contrôle de ces données (RTCP) sur le port 5001 et on les injectent dans le gestionnaire RTP (gstrtpsession).

Streaming vidéo: H.264 et RTP/RTCP

Nous allons modifier l’exemple précedant en remplacant le codec H.264 au lieu de Theora. Pour celà, nous allons utiliser le plugins X.264 (développé par l’équipe VideoLAN).

Contrairement au codec Theora, il n’est pas nécessaire de passer la chaine de configuration « caps » du serveur vers le client.

On a donc la configuration suivante au niveau du serveur (à lancer en premier). Vous pouvez récupérer le script shell correspondant à ici:

WEBCAM_DEV= »/dev/video0″
WEBCAM_WIDTH=352
WEBCAM_HEIGHT=288
WEBCAM_FPS=24
SERVER_IP=$1
SEND_RTP_PORT=5000
SEND_BUFFER=0
X264_BITRATE=600
X264_PARAM= »byte-stream=true bframes=4 ref=4 me=hex subme=4 weightb=true threads=0 sliced-threads=1 vbv-buf-capacity=300″
# With RTCP
SEND_RTCP_PORT=5001
RECV_RTCP_PORT=5002
gst-launch -v  gstrtpbin name=rtpbin \
v4l2src device=$WEBCAM_DEV \
! queue ! videoscale method=1 ! video/x-raw-yuv,width=\(int\)$WEBCAM_WIDTH,height=\(int\)$WEBCAM_HEIGHT \
! queue ! videorate ! video/x-raw-yuv,framerate=\(fraction\)$WEBCAM_FPS/1 \
! queue ! x264enc bitrate=$X264_BITRATE $X264_PARAM ! rtph264pay \
! rtpbin.send_rtp_sink_0 \
rtpbin.send_rtp_src_0 ! udpsink port=$SEND_RTP_PORT host=$SERVER_IP \
rtpbin.send_rtcp_src_0 ! udpsink port=$SEND_RTCP_PORT host=$SERVER_IP sync=false async=false \
udpsrc port=$RECV_RTCP_PORT ! rtpbin.recv_rtcp_sink_0

La seule différence avec l’exemple du chapitre précedant est l’utilisation de l’encodeur X.264 (x264enc qui génére un flux H.264). Pour une description des nombreux paramètres de ce plugin, je vous conseille la lecture de la documentation:

gst-inspect x264enc

La ligne de commande du client est la suivante (la encore vous pouvez récupérer le script shell ici):


RECV_RTP_PORT=5000
RECV_BUFFER=300
CLIENT_IP=$1
RECV_RTCP_PORT=5001
SEND_RTCP_PORT=5002
gst-launch -tv gstrtpbin name=rtpbin latency=$RECV_BUFFER \
udpsrc caps= »application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96″ port=$RECV_RTP_PORT \
! rtpbin.recv_rtp_sink_0 \
rtpbin. ! rtph264depay ! ffdec_h264 ! ffmpegcolorspace ! autovideosink \
udpsrc port=$RECV_RTCP_PORT ! rtpbin.recv_rtcp_sink_0 \
rtpbin.send_rtcp_src_0 ! udpsink port=$SEND_RTCP_PORT host=$CLIENT_IP sync=false async=false

gst-launch -tv gstrtpbin name=rtpbin latency=$RECV_BUFFER \ udpsrc caps= »application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96″ port=$RECV_RTP_PORT \ ! rtpbin.recv_rtp_sink_0 \ rtpbin. ! rtph264depay ! ffdec_h264 ! ffmpegcolorspace ! autovideosink \ udpsrc port=$RECV_RTCP_PORT ! rtpbin.recv_rtcp_sink_0 \ rtpbin.send_rtcp_src_0 ! udpsink port=$SEND_RTCP_PORT host=$CLIENT_IP sync=false async=false


On utilise le décodeur H.264 fourni par FFMpeg (ffdec_h264).

Streaming audio et vidéo: H.264, Speex et RTP/RTCP

Dernier exemple de ce billet qui va streamer un flux vidéo et un flux audio (venant du périphérique de capture standard de votre système). La vidéo sera encodé en H.264 et la vidéo en Speex. Le tout en utilisant le protocole RTP/RTCP.

Le serveur (à lancer en premier). Il faut récupérer la chaine « caps » pour la partie audio Speex.

gst-launch -v  gstrtpbin name=rtpbin \
v4l2src ! videoscale method=1 ! video/x-raw-yuv,width=640,height=480,framerate=\(fraction\)15/2 \
! queue ! x264enc byte-stream=true bitrate=300 vbv-buf-capacity=300 me=0 subme=3 ! rtph264pay \
! rtpbin.send_rtp_sink_0 \
rtpbin.send_rtp_src_0 ! udpsink port=5000 host=127.0.0.1 \
rtpbin.send_rtcp_src_0 ! udpsink port=5001 host=127.0.0.1 sync=false async=false \
udpsrc port=5002 ! rtpbin.recv_rtcp_sink_0 \
alsasrc \
! queue ! speexenc ! rtpspeexpay \
! rtpbin.send_rtp_sink_1 \
rtpbin.send_rtp_src_1 ! udpsink port=5003 host=127.0.0.1 \
rtpbin.send_rtcp_src_1 ! udpsink port=5004 host=127.0.0.1 sync=false async=false \
udpsrc port=5005 ! rtpbin.recv_rtcp_sink_1

Et le client:

gst-launch-0.10 -v gstrtpbin name=rtpbin latency=200 \
udpsrc caps= »application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, profile-level-id=(string)4d4033, sprop-parameter-sets=(string)Z01AM6tAUB7YCIAAAAMBAAADAA9HjBlQ, ssrc=(guint)614294178, payload=(int)96, clock-base=(guint)3718899905, seqnum-base=(guint)59615″ port=5000 \
! rtpbin.recv_rtp_sink_0 \
rtpbin. ! rtph264depay ! ffdec_h264 ! xvimagesink \
udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \
rtpbin.send_rtcp_src_0 ! udpsink port=5002 host=127.0.0.1 sync=false async=false \
udpsrc caps= »application/x-rtp, media=(string)audio, clock-rate=(int)44100, encoding-name=(string)SPEEX, encoding-params=(string)1, ssrc=(guint)419764010, payload=(int)110, clock-base=(guint)3478167082, seqnum-base=(guint)57894″ port=5003 \
! rtpbin.recv_rtp_sink_1 \
rtpbin. ! rtpspeexdepay ! decodebin ! alsasink \
udpsrc port=5004 ! rtpbin.recv_rtcp_sink_1 \
rtpbin.send_rtcp_src_1 ! udpsink port=5005 host=127.0.0.1 sync=false async=false

Bon stream à vous !

Catégories
Open-source

Actualité open-source de la semaine #49

L’actualité open-source de la semaine…

L’image de la semaine

OOoLiberezVousBlog.png

Un poster de promotion de OpenOffice (à afficher dans votre bureau)

Tout le monde en parle, sauf moi…

L’actualité du libre et de l’open source en vrac:

Autres choses ?

Catégories
Open-source

Introduction à GStreamer, le framework multimedia

Depuis l’intégration dans le noyau de Gnome 2.2, GStreamer est devenu un « framework » multimédia très à la mode. Contrairement à la musique, être à la mode peut être compatible avec qualité. Nous allons dans ce billet aborder cet outil très pratique à partir du moment ou vous voulez développer des applications gérants du son et de la vidéo.

Introduction

GStreamer est une boite à outil permettant de gérer des données multimédia (son et vidéo) de bout en bout: de l’acquisition de la source (fichier, flux réseau, webcam, micro…) au traitement (effet vidéo, audio, encodage) à la diffusion (sur l’écran, dans un fichier, sur le réseau).

Un exemple:

Ce dernier est développé en C (note du Troll: le seul et unique language pour faire ce genre de chose) mais il existe de nombreuse librairie pour appeller GStreamer à partir de logiciel développé dans d’autres languages (C, Java, Perl, Pythonet autres). GStreamer existe sous GNU/Linux, BSD et Windows (voir ici la procédure pour compiler GStreamer sous Windows).

Il se base sur une architecture modulaire composé d’un coeur (GStreamer) et de plugins (Base, Good, Ugly, Bad).

Installation de GStreamer

Voici les lignes de commandes à saisir pour installer GStreamer et les plugins sur une distribution GNU/Linux Ubuntu:

# sudo apt-get install gstreamer0.10-tools gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg

Pour vérifier que l’installation est ok, vous pouvez lancer la commande suivante qui devrait afficher la liste des plugins disponibles:

# gst-inspect

Nombre total : 168 greffons, 762 fonctionnalités

Un premier exemple

Pour tester notre Framework avant de l’intégrer dans votre logiciel, il existe une ligne de commande très pratique: gst-launch.

Nous allons par exemple utiliser GStreamer pour ouvrir un fichier vidéo au format OGG et l’afficher sur notre écran (les bases d’un lecteur multimédia… sans le son ;)):

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

et le résultat:

Détaillons un peu cette ligne:

 

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

La commande gst-launch permet de tester un framework en ligne de commande.

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

Nous appelons en premier le plugin filesrc qui est un plugin qui prend en entrée un fichier multimédia (dont le nom est passé par le paramètre location).

Pour avoir une documentation précise du plugin (et des ses paramètres), vous pouvez utilsier la commande suivante:

# gst-inspect filesrc

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

Le deuxième plugin utilisé (il faut utiliser le ! entre deux plugins, c’est un peu l’équivalent d’un | pour les commandes Unix) est oggdemux, qui prend en entrée un flux vidéo OGG (fourni dans notre cas par filesrc) et qui de décode.

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

Ensuite on utilise le plugin theoradec pour décoder la vidéo dont le format est Theora.

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

Ce dernier plugin (xvimagesink) prend en entrée un flux video décodé (format RAW) et l’affiche sur l’écran en utilisant Xv (XFree86 Video).

Comme on peut le voir, cette logique d’enchaînement de tâches est très intuitive.

Ainsi, si l’on souhaite que notre lecteur vidéo redimmensionne l’image avant de l’afficher, il suffit d’ajouter les plugins suivants (videoscale):

# gst-launch filesrc location=../Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! videoscale ! video/x-raw-yuv,height=240 ! xvimagesink

Simple non 🙂 ?

D’autres exemples…

Récupération d’un flux venant d’une caméra (sur /dev/video0), redimensionnement en 240 lignes et affichage sur l’écran:

# gst-launch v4l2src ! videoscale ! video/x-raw-yuv,height=240 ! xvimagesink

Récupération d’un flux venant d’une caméra (sur /dev/video0), redimensionnement en 240 lignes, application d’un filtre EffectTV (quarktv qui rend flou les objets en mouvement) et affichage sur l’écran:

# gst-launch v4l2src ! videoscale ! video/x-raw-yuv,height=240 ! ffmpegcolorspace ! quarktv ! ffmpegcolorspace ! xvimagesink

Dans nos premiers exemples, nous avons traités notre flux de manière séquentielle. Si nous voulons, par exemple, ajouter l’audio à notre lecteur multimédia il faut que GStreamer gére la vidéo et le son en parallèle. On va utiliser le plugin queue qui a pour fonction de créer un nouveau « thread » GStreamer.

Notre lecteur multimédia devient donc:

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux name=demux \
demux. ! queue ! vorbisdec ! audioconvert ! audioresample ! osssink \
demux. ! queue ! theoradec ! xvimagesink

On peut améliorer le lecteur en laissant GStreamer sélectionner lui même les sorties audio et vidéo (autodetect):

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux name=demux \
demux. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink \
demux. ! queue ! theoradec ! autovideosink

Je m’arrête là pour ce premier article sur GStreamer. Nous reviendrons bientôt sur ce passionnant sujet notamment en abordant l’encodage audio et vidéo et le streaming sur le réseau.Je vous laisse consulter la longue liste des plugins pour trouver votre bonheur. N’hésitez pas à proposer vos framework GStreamer en ligne de commande dans les commentaires 😉