Catégories
Gstreamer Hardware Open-source Planet-libre Video

Streaming depuis la Raspberry Camera

Après une rapide présentation de la Raspberry Camera 5M (voir ce précédant billet), entrons dans le vif du sujet avec une utilisation pratique: le streaming « live » du flux vidéo vers une autre machine de votre réseau. Les applications peuvent aller d’un « baby video phone » à  un « interphone vidéo » pour votre maison en passant par toutes les autres choses qui vous passent par la tête !

Actuellement, la camera dispose d’un logiciel spécifique Raspivid (dont les sources sont disponibles sur Github), pour capturer et encoder en H.264 la vidéo dans un fichier ou bien sur le flux standard de sortie (stdout). C’est cette dernière particularité que nous allons exploiter afin de rediriger le flux vidéo vers une pipeline GStreamer qui va s’occuper du streaming vers notre machine cible (celle ou l’on souhaite voir la vidéo).

Installation des composants GStreamer

On commence par installer GStreamer sur notre Raspberry PI. Pour cela on saisi la commande suivante:

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

L’installation va prendre un certain temps. Passiensa !

Pour vérifier que les composants ont été correctement installé, saisir la commande suivante:

gst-inspect

Qui devrait afficher les chiffres suivants (qui peuvent varier légèrement selon votre configuration):

Total count: 233 plugins, 695 features

Lancement de la diffusion (streaming) sur le Raspberry

On utilise la pipeline suivante:

raspivid -t 0 -w 1280 -h 720 -fps 25 -b 2500000 -p 0,0,640,480 -o - | gst-launch -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=192.168.0.9 port 5000

Détaillons un peu cette ligne de commande. La première partie est dédiée à Raspvid et s’occupe de l’encodage H.264. Les paramètres sont très importants pour avoir une qualité vidéo conforme à vos besoins. Ainsi, dans mon exemple, je n’y suis pas allé avec le dos de la cuillère car j’ai opté pour une résolution HD 720p (-w 1280 -h 720) à 25 images par seconde (-fps 25) pendant un temps infini (-t -1).

Pour le streaming, le paramètre de débit (bitrate, -b 2500000) est primordial car il va fixer le débit sortant de la vidéo (à 2.5 Mbps dans mon exemple).

Ce débit est à adapté selon votre résolution. Après quelques tests, voici une table indicative des débits à utiliser:

  • SD Low: -w 480 -h 260 -fps 25 -b  800000
  • SD Medium: -w 640 -h 360 -fps 25 -b  1200000
  • SD High: -w 960 -h 540 -fps 25 -b  1800000
  • HD Ready: -w 1280 -h 720 -fps 25 -b  2500000
  • Full HD: -w 1920 -h 1080 -fps 25 -b  5000000

Note: attention au dimensionnement de votre réseau si vous utilisez des débits élevés, en effet même avec des bornes Wifi ressentes, il est difficile de garder un débit constant de 5 Mbps (Full HD).

Note 2: sur le Raspberry, je conseille d’utiliser l’interface Ethernet et pas un dongle Wifi, surtout avec des résolutions importantes.

La commande passe ensuite la main à GStreamer qui va encapsuler le flux H.264 dans un conteneur RTP puis créer le serveur TCP en écoute des clients (il faudra penser à remplacer l’adresse IP par celle de votre Raspberry Pi).

Lecture de la vidéo depuis une autre machine

J’ai fait le test depuis mon portable Ubuntu 13.04 en saisissant la ligne de commande suivante pour récupérer et afficher la vidéo:

gst-launch-1.0 -v tcpclientsrc host=192.168.0.9 port=5000  ! gdpdepay ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink sync=false

La qualité de la vidéo est très bonne, fluide. On note quelques retard quand on sollicite le réseau en parallèle mais cela semble normal vu les débits utilisés.

Lecture streaming Raspberry Pi Camera 720p

Ce qui est très impressionnant au niveau du Raspberry, c’est la faible consommation CPU. En effet, Raspivid ne dépasse pas les 2% (merci le GPU) et GStreamer les 25%. On peut sans aucun problème laisser tourner le tout sans risque de surchauffe.

Conclusion

J’espère que cette rapide introduction sur le streaming vidéo depuis le Raspberry vous a donné des idées que vous aller vous empresser de nous faire partager dans les commentaires ci-dessous !

Retrouvez mes articles sur l’écosystème Raspberry Pi en cliquant ici.

Catégories
Gstreamer Musique Open-source Planet-libre raspberry

Utiliser votre Raspberry Pi comme borne Airplay

Airplay est une technologie, mise en avant par Apple et par un nombre croissant d’acteurs du monde de la Hifi, permettant de déporter les flux audio, photo et vidéo d’un device (PC/Mac, tablette, téléphone) sur des périphériques externes (Ampli, Enceintes…). Basée sur un protocole propriétaire (heureusement cassé par reverse ingenering), il n’a malheureusement en face de lui aucune alternative stable et libre: Miracast est uniquement dédié aux devices Wifi et Google qui planchait sur une alternative à Airplay ne semble pas très pressé de la sortir.

Dans ce billet nous allons voir comment transformer un Raspberry Pi (23€ chez votre épicier) en une borne Airplay connectée à votre chaîne Hifi (ou encore mieux en passant par un DAC) afin de disposer d’une chaîne de streaming de bonne qualité entre vos « idevices » (iPhone, iPad, Mac OS mais aussi Android) et vos enceintes.

Dans le jargon Airplay, nous allons donc transformer un Raspberry Pi en « Airplay receiver ». Shazam…

Ma configuration de test

Ce billet a été validé sur la configuration suivante:

  • une chaîne Hifi Cambridge composée d’un DAC, d’un amplificateur et d’une paire d’enceintes.

Ma chaine Hi-Fi Cambridge

  • un Raspberry PI model B (mais cela doit marcher sans problème avec un modèle A)

Raspberry PI B 512

  • un iPhone 4

Configuration système du Raspberry Pi

J’ai utilisé le système d’exploitation Raspbian « Wheezy » dont j’ai déjà détaillé l’installation dans un précédant billet. Comme ma chaîne Hifi est loin de mon réseau Ethernet filaire, j’ai utilisé un dongle USB Wifi (attention la liste des dongles supportés est ici) que j’ai connecté au Raspberry et configuré en suivant ce tutoriel.

Ma configuration réseau est la suivante pour le fichier /etc/network/interfaces:

auto lo

iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

et celle-ci pour le fichier /etc/wpa_supplicant/wpa_supplicant.conf:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="MONWIFI"
scan_ssid=1
key_mgmt=WPA-PSK
proto=WPA
psk="MACLEWIFI"
}

Shairport, le coeur de la borne Airplay

Shairport est une implémentation libre d’un serveur RAOP qui est lui même à la base des Airport Express d’Apple. Il n’implémente, pour l’instant, que la version 1.0 d’Airplay (prise en charge des flux audio mais pas de vidéo ni de photo).

L’installation se fait en 5 commandes:

sudo aptitude install git libao-dev libssl-dev libcrypt-openssl-rsa-perl libio-socket-inet6-perl libwww-perl avahi-utils
git clone https://github.com/albertz/shairport.git shairport
cd shairport
make
sudo make install

Pour tester Shairport, il suffit de lancer:

/shairport.pl -a ShairPort

Si, comme moi, vous avez l’erreur suivante qui s’affiche:

Can't locate Net/SDP.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at ./shairport.pl line 48.
BEGIN failed--compilation aborted at ./shairport.pl line 48.

Alors, il faudra en plus saisir une sixième commande pour finaliser l’installation:

sudo cpan install Net::SDP

Pour automatiser le lancement de ShairPort au démarrage de votre Raspberry Pi:

sudo cp ./shairport.init.sample /etc/init.d/shairport
sudo chmod a+x /etc/init.d/shairport

Note: il est possible d’éditer le « nom » de votre borne Airplay en modifiant l’option -a dans le script:

DAEMON_ARGS="-w $PIDFILE -a ShairPort"

Il ne reste plus qu’à lancer le démon:

sudo update-rc.d shairport defaults
sudo service shairport start

Premier test: bien mais peut mieux faire

Arrivez à ce stade (bravo si vous êtes encore là), vous devriez pouvoir détecter votre borne Airplay ShairPlay à partir de votre iPhone:

Airplay Spotify photo

Configuration de l’iPhone pour utiliser la borne Airplay (Spotify à gauche et iTunes à droite)

En branchant votre casque | chaîne sur la sortie analogique (prise jack) du Raspberry, vous allez entendre le son émis par votre iPhone.

Avec un <pub> Glances </pub> lancé sur le Raspberry, on peut constater, avec une liaison réseau filaire la faible consommation CPU en utilisation et un débit de streaming audio de 1Mbps:

capture_064

Par contre cette consommation grimpe à plus de 60% si vous utilisez un dongle Wifi. En effet, le protocole WPA implique un déchiffrement des données non négligeable pour le Raspberry.

Si fonctionnellement on est arrivés à notre objectif, ce n’est pas cas pour la qualité audio. En effet, la sortie analogique est incompatible avec une écoute Hifi.

Raspberry + USB + DAC = Bonheur

Heureusement pour moi et pour mes oreilles, mon DAC (Cambridge Audio DacMagic) dispose d’une entrée USB. Si ce n’est pas votre cas, il existe pas mal de solutions plus ou moins chères sur le marché.

Pour forcer le Raspberry à utiliser le DAC (sortie USB) comme carte son, il faut éditer le fichier /etc/modprobe.d/alsa-base.conf en commentant une première ligne et en ajoutant une deuxième:

#options snd-usb-audio index=-2
options snd-usb-audio nrpacks=1

Après un dernier redémarrage, votre borne Airplay est enfin prête !

Update (28/04/2013): Pour vérifier que tout est configuré comme attendu, le plus simple est d’utiliser la commande aplay -l qui va afficher la liste des cartes sons de votre Raspberry Pi. On doit retrouver la « carte audio USB en premier » puis la classique carte intégrée bcm2835 en second:

pi@raspberrypi $ aplay -l

**** List of PLAYBACK Hardware Devices ****
card 0: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7

 

Conclusion

Ma configuration fonctionne maintenant sans problème depuis quelques jours. Je suis justement en train d’écouter ma Playlist Spotify 2013 en rédigeant ce billet.

Seul problème rencontré: il faut que je redémarre mon Raspberry quand je désactive et réactive le Wifi sur ma Freebox. Si vous avez des idées, je suis preneur.

Quelques liens en bonus:

Catégories
Gstreamer Musique Open-source Planet-libre

Musique en qualité Studio Masters à partir de votre PC GNU/Linux

Définition: « Est considéré comme étant de qualité Studio Masters tout fichier dont au moins l’échantillonnage ou la quantification sont supérieurs à celle de la qualité CD. Pour rappel, un CD a un échantillonnage de 44,1 kHz et une quantification de 16 bits.« 

La manière d’écouter la musique est certainement une des choses qui a changé le plus radicalement ces 10 dernières années. Contrairement à la vidéo et à l’utilisation des format HD, ce changement s’est accompagné d’une baisse globale de la qualité de la source musicale. En effet, les stores proposent majoritairement des fichiers musicaux compressés en utilisant des codecs avec perte d’information (MP3, MP4, Vorbis…). Si cette perte d’information est négligeable pour une écoute grand public avec votre baladeur ou depuis votre PC, il en est autrement sur une chaîne HIFI de bonne qualité. On se retrouve alors avec une source qui n’est plus en adéquation avec le matériel, celui-ci se trouvant sous exploité.

Nous allons donc voir dans ce billet comment télécharger et exploiter des fichiers musicaux en qualité supérieure au format CD (Studio Masters) sur nos chers machines GNU/Linux. Avant de commencer, voici le matériel que j’ai utilisé pour rédiger ce billet:

  • chaîne HIFI Cambridge avec un DAC Audio Magic de la même marque (voir le test ici) et casque audio AKG K450 et/ou enceintes B&W 685
  • PC sous Ubuntu 11.10 avec la suite logiciel libre Sox
  • MacBook Pro avec sortie audio optique pour exploiter les fichiers > 44.1 kHz (mon PC sous Ubuntu ne disposant pas de sortie audio numérique et l’entrée USB du DAC Cambridge est limité à 44.1 khz)
  • un album en qualité StudioMaster (24 bits / 96.0 kHz) acheté sur le site Qobuz

Obtenir une source « Studio Masters »

Comme nous l’avons vu en introduction, les « stores leaders » sur le marché ne propose pas de formats de fichiers supérieurs à la qualité CD. Il faut donc se retourner sur les boutiques spécialisés dans la haute définition comme par exemple Qobus. Bien que leur catalogue « Studio Masters » ne soit pas très étoffé, c’est quand un même un point d’entrée.

J’ai donc acheté l’album « Audio, video, Disco. » du Groupe Français Justice. en qualité FLAC 24 bits / 96 kHz. (15€ soit 3€ plus cher que la qualité CD et 5€ de plus que la qualité MP3).

Qui dit qualité Studio Masters, dit fichiers de taille importante, il faut donc télécharger presque 1 Go pour un album.

Installation de SoX, le couteau Suisse des logiciels audio HQ

SoX est un ensemble de logiciels permettant de manipuler, en ligne de commande tout type de fichier musicaux.

Pour installer SoX sur votre distribution Ubuntu, rien de plus simple:

[cc]

sudo aptitude install sox libsox-fmt-all

[/cc]

SoX se compose des commandes suivantes:

  • soxi pour obtenir des informations sur un fichier audio
  • rec pour enregistrer dans un fichier audio le son venant d’un de vos périphérique d’entrée
  • play pour jouer vos fichiers audio sur la sortie définie par votre système (analogique, numérique, USB…)
  • sox pour convertir, ajouter des effets dans un fichier audio

Utilisation des fichiers Studio Masters

« Commençons pas le commencement » en utilisant la commande soxi sur les fichiers Studio Masters téléchargés sur Qobus.

[cc]

soxi 01-01-Justice-Horsepower-SMR.flac

[/cc]

On obtient le résultat suivant:

Input File     : '01-01-Justice-Horsepower-SMR.flac'
Channels       : 2
Sample Rate    : 96000
Precision      : 24-bit
Duration       : 00:03:40.09 = 21128600 samples ~ 16506.7 CDDA sectors
File Size      : 89.9M
Bit Rate       : 3.27M
Sample Encoding: 24-bit FLAC
Comments       :
ALBUM=Audio, Video, Disco.
TITLE=Horsepower
TRACKNUMBER=1
TRACKTOTAL=11
DISCNUMBER=1
DISCTOTAL=1
DATE=2011
COPYRIGHT=Ed Banger Records Because Music
GENRE=Electro
ALBUMARTIST=Justice
ARTIST=Justice
DESCRIPTION=Interprètes : Justice, performer; Gaspard Augé, composer & author; Xavier de Rosnay, composer & author
Label : Ed Banger Records Because Music - Because

Les informations « intéressantes » pour notre sujet sont le « sample rate » et la « precision » respectivement aux valeurs 96 kHz et 24 bits.

En utilisant la commande play, j’ai joué ce fichier depuis mon PC Ubuntu branché via un câble USB sur l’entrée USB de mon DAC Cambridge. Comme la documentation du DAC l’annonçait, le fichier est joué en 44,1 kHz car le port USB est seulement en version 1 donc avec un débit insuffisant pour du 96 kHz (plus de 3 Mbps).

[cc]

play 01-01-Justice-Horsepower-SMR.flac

[/cc]

01-01-Justice-Horsepower-SMR.flac:

 File Size: 89.9M     Bit Rate: 3.27M
  Encoding: FLAC          Info: Interprètes : Justice, performer; Gaspard Augé, composer & author; Xavier de Rosnay, composer & author
Label : Ed Banger Records Because Music - Because

  Channels: 2 @ 24-bit   Track: 1 of 11
Samplerate: 96000Hz      Album: Audio, Video, Disco.
Replaygain: off         Artist: Justice
  Duration: 00:03:40.09  Title: Horsepower

In:7.33% 00:00:16.13 [00:03:23.96] Out:1.55M [  ====|====- ] Hd:5.9 Clip:0

La qualité est cependant au rendez-vous. Surtout si je fais la comparaison avec le même morceau compressé en MP3 à 320 Kbps.

Note: les DAC récents proposent des entrées USB 2 supportant des entrées en 24 bits/ 96 kHz (comme le très bon HRT Music Streamer II à moins de 200€ que j’ai eu la chance d’écouter chez un ami).

En jouant le même fichier depuis mon Mac BookPro en utilisant la sortie jack optique (c’est quand même la classe le matériel chez Apple) connecté via un câble Jack – TosLink S/PDIF sur mon DAC Cambridge, je dois avouer (comme pour mon premier billet sur le sujet) que la différence n’est pas flagrante. J’ai donc décidé de faire un « blind test » en passant d’une source 24 bits/ 96 kHz (Mac) à la même source mais « resampler » à 24 bits / 44.1 kHz par le DAC (PC Ubuntu).

Résultat des courses: 7 fois sur 10, j’ai préféré le morceau en 24 bits/ 96 kHz.

Manipuler ses fichiers audio avec SoX

Nous allons maintenant passer à la partie ludique de ce billet en manipulant nos fichiers audio avec les différentes fonctions offertes par SoX.

Resampling: de « Studios Masters » vers CD

Pour transformer notre fichier source Studio Masters (24 bits/ 96 kHz) dans un fichier au format CD (16 bits/ 44.1 kHz), il faut saisir la commande suivante:

[cc]

sox -S 01-01-Justice-Horsepower-SMR.flac -b 16 01-01-Justice-Horsepower-SMR-16bits-44.1kHz.flac rate -h -I -b 90 44100

[/cc]

Notes sur les options:

  • -S permet d’avoir une barre de progression qui s’affiche sur l’écran
  • -b 16 force un resampling en 16 bits (compatible CD)
  • rate -h -I -b 90 44100: resampling de haute qualité en 44.1 kHz

Après une dizaine de secondes de traitement, vous devriez obtenir un fichier de 27 Mo (contre 86 Mo pour la source):

[cc]

soxi 01-01-Justice-Horsepower-SMR-16bits-44.1kHz.flac

[/cc]

Input File     : '01-01-Justice-Horsepower-SMR-16bits-44.1kHz.flac'
Channels       : 2
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:03:40.09 = 9705951 samples = 16506.7 CDDA sectors
File Size      : 28.1M
Bit Rate       : 1.02M
Sample Encoding: 16-bit FLAC
Comments       :
ALBUM=Audio, Video, Disco.
TITLE=Horsepower
TRACKNUMBER=1
TRACKTOTAL=11
DISCNUMBER=1
DISCTOTAL=1
DATE=2011
COPYRIGHT=Ed Banger Records Because Music
GENRE=Electro
ALBUMARTIST=Justice
ARTIST=Justice
DESCRIPTION=Interprètes : Justice, performer; Gaspard Augé, composer & author; Xavier de Rosnay, composer & author
Label : Ed Banger Records Because Music - Because

Conversion en MP3

SoX reconnait le format MP3, il est donc simple comme bonjour de transformer notre source loss-less en MP3:

[cc]

sox -S 01-01-Justice-Horsepower-SMR.flac -r 44100 01-01-Justice-Horsepower-SMR-16bits-44.1kHz.mp3 rate -h -I -b 90 44100

[/cc]

Mais…

…  même si la conversion se passe sans problème, le fichier obtenu à un débit de 128 Kbps (donc un MP3 de très mauvaise qualité). Je n’ai trouvé nulle part une option pour encoder à un débit plus important. Si vous avez une idée je suis preneur (avec SoX bien sûr…).

Il est toujours possible d’utiliser SoX pour resampling et lame (sudo apt-get install lame) en utilisant un pipe comme le montre la ligne de commande suivante:

[cc]

sox -S 01-01-Justice-Horsepower-SMR.flac -r 44100 – rate -h -I -b 90 44100 | lame –preset insane – 01-01-Justice-Horsepower-SMR-16bits-44.1kHz.mp3

[/cc]

Et encore…

Voici quelques exemples en bonus (les commentaires sont là pour en ajouter d’autres):

Mixer plusieurs sources audio entre elles en conservant les volumes d’origines:

[cc]

sox -m source1.flac source2.flac destination.flac

[/cc]

Mixer plusieurs sources audio entre elles en mettant tous les volumes au même niveau:

[cc]

sox –combine mix-power source1.flac source2.flac destination.flac

[/cc]

Enregistrer dans un fichier FLAC (par défaut en 16 bits et 48 kHz) le son venant du périphérique d’entrée par défaut de votre PC:

[cc]

rec test.flac

[/cc]

Enregistrer dans un fichier FLAC (16 bits et 8 kHz, adapté à la voix) le son venant du périphérique d’entrée par défaut de votre PC:

[cc]

rec -r 8000 test.flac

[/cc]

 Pour trouver d’autres exemples d’utilisation de SoC, je vous conseille la lecture des ce billet ou de celui-là.
Catégories
Gstreamer Hardware Open-source Reseau Systeme

Supervision SMART de vos disques via Nagios

Disque durSuperviser l’espace disque des serveurs est une bonne chose… encore faut il que les données soient stockées sur des disques en bonne santé. Le but de ce billet est de mettre en place via Nagios/Shinken une supervision de l’état SMART renvoyé par l’outil Smartmontool.

Sur le serveur à superviser

Les pré-requis

La commande smartctl sera exécutée avec sudo, il faut donc l’installer si ce n’est pas déjà fait sur votre système:

[cce lang=bash »]

apt-get update

apt-get install sudo

[/cce]

Il fait aussi installer l’outil de vérification SMART : SmartMonTools.

[cce lang=bash »]

apt-get install smartmontools

[/cce]

Superviser quels disques ?

Pour savoir quels disques superviser, on peut utiliser la commande suivante (en root):

[cce lang=bash »]

fdisk -l

[/cce]

Exemple : sur un RAID1, on trouvera souvent /dev/sda et /dev/sdb. On prendra ce cas pour illustrer le reste de notre procédure.

Récupération et installation du plugin

Téléchargement du script :

[cce lang=bash »]

cd /etc/snmp/

wget https://raw.github.com/nicolargo/nagiosautoinstall/master/check_smart.pl

[/cce]

On donne les droits d’exécution :

[cce lang=bash »]

chmod 755 /etc/snmp/check_smart.pl

[/cce]

Modification de la configuration de SNMP

Pour prendre en compte Smart, il faut modifier la configuration de votre serveur SNMP (suivre cette procédure pour installer le serveur SNMPd sur votre machine) en éditant le fichier snmpd.conf et en y ajoutant les lignes suivantes :

[cce lang=bash »]

vi /etc/snmp/snmpd.conf

exec SmartSDA /etc/snmp/check_smart.pl -t -d /dev/sda

exec SmartSDB /etc/snmp/check_smart.pl -t -d /dev/sdb

[/cce]

Note : L’ordre des lignes est important !

La première ligne « exec » aura l’OID « .1.3.6.1.4.1.2021.8.1.101.1 », la seconde ligne l’OID « .1.3.6.1.4.1.2021.8.1.101.2 », etc…

Si vous utilisez déjà des commande exec dans le fichier snmpd.conf, les OID ne correspondront pas forcément avec ceux de cette procédure.

Redémarrage du service SNMP

[cce lang=bash »]

/etc/init.d/snmpd restart

[/cce]

Modification des sudoers

Il faut autoriser l’utilisateur snmp à exécuter la commande « /usr/sbin/smartctl ».

Pour faire cela, il est nécessaire de modifier le fichier /etc/sudoers via la commande visudo et d’ajouter :

[cce lang=bash »]

snmp ALL= NOPASSWD:/usr/sbin/smartctl

[/cce]

Vérification du plugin

Pour voir si les résultats des checks sont bien rentrés dans la MIB SNMP du serveur, on teste avec cette commande :

[cce lang=bash »]

snmpwalk -c public -v 1 [IP du serveur à superviser] .1.3.6.1.4.1.2021.8.1

[/cce]

On devrait avoir quelque chose du genre :

UCD-SNMP-MIB::extIndex.1 = INTEGER: 1

UCD-SNMP-MIB::extIndex.2 = INTEGER: 2

UCD-SNMP-MIB::extNames.1 = STRING: SmartSDA

UCD-SNMP-MIB::extNames.2 = STRING: SmartSDB

UCD-SNMP-MIB::extCommand.1 = STRING: /etc/snmp/check_smart.pl

UCD-SNMP-MIB::extCommand.2 = STRING: /etc/snmp/check_smart.pl

UCD-SNMP-MIB::extResult.1 = INTEGER: 0

UCD-SNMP-MIB::extResult.2 = INTEGER: 0

UCD-SNMP-MIB::extOutput.1 = STRING: SMART overall-health self-assessment test result: PASSED

UCD-SNMP-MIB::extOutput.2 = STRING: SMART overall-health self-assessment test result: PASSED

UCD-SNMP-MIB::extErrFix.1 = INTEGER: noError(0)

UCD-SNMP-MIB::extErrFix.2 = INTEGER: noError(0)

UCD-SNMP-MIB::extErrFixCmd.1 = STRING:

UCD-SNMP-MIB::extErrFixCmd.2 = STRING:

L’état SMART du disque sda est remonté sur l’OID : .1.3.6.1.4.1.2021.8.1.101.1

L’état SMART du disque sdb est remonté sur l’OID : .1.3.6.1.4.1.2021.8.1.101.2

Sur le serveur Nagios

Création de la commande

On défini une nouvelle commande en ajoutant les lignes suivantes dans le fichier commands.cfg:

[cce lang=bash »]

define command{

command_name check_smart

command_line $USER1$/check_snmp -H $HOSTADDRESS$ -C public -o $ARG1$ -r $ARG2$

;command_example !.1.3.6.1.4.1.2021.8.1.101.1!PASSED

}

[/cce]

Syntaxe de la commande :

• -H Hostaddress : IP ou nom DNS de la machine à superviser

• -C public : Communauté SNMP (on peut la mettre en variable si on veut)

• -o $ARG1$ : OID SNMP à intérroger

• -r $ARG2$ : Comparaison avec une chaine de caratère, ici « PASSED » (attention de respecter la casse). Si dans le retour du check, on ne trouve pas la chaine de caractère « PASSED », le service va passer en « Critical ».

Exemple de service

On défini ensuite le service:

[cce lang=bash »]

define host{

use generic-host

host_name monserveur

alias Serveur_Zimbra

address 192.168.0.100

}

define service{

use generic-service

host_name monserveur

service_description SMART_sda

check_command check_smart!.1.3.6.1.4.1.2021.8.1.101.1!PASSED

}

[/cce]

Il ne reste plus qu’à redémarrer votre service Nagios ou Shinken pour prendre en compte la configuration:

[cce lang=bash »]

sudo /etc/init.d/nagios restart

[/cce]

Catégories
Gstreamer Musique Open-source Planet-libre Video

Présentation « powerpoint » du framework GStreamer

Comme vous avez pu le remarquer, depuis quelques mois la fréquence des billets sur le blog est en chute libre. La « faute » à mon boulot (celui qui paye les factures) pour lequel je suis pas ma en déplacement. J’ai pu juger comme il était difficile de bloguer loin de ses terres. J’ai donc vite renoncer à écrire des articles depuis les chambres d’hôtels et j’ai préféré visiter les belles villes de Rennes et de Paris.

Cependant ces fameuses mission m’ont permis de poser sur quelques planches « powerpoint » (c’est votre chef qui va être heureux) une introduction au framework GStreamer que j’aborde souvent dans mon blog (voir la page dédiée ici).  Cette présentation est bien évidemment distribuée sous licence CC BY v3.  L’idéal si vous avez à l’utiliser est de la faire tourner sur PC sous GNU/Linux avec l’ensemble des plugins GStreamer installés. puis à chaque planche ou il y a un exemple de faire un copier/coller de ce dernier dans un terminal (effet démo garanti).

Pour d’évidentes raisons de compatibilité, je diffuse la présentation au format PDF (il suffit de cliquer sur l’image ci-dessous pour lancer le téléchargement). Pour les personnes voulant modifier cette présentation, vous pouvez également la télécharger au format ODP.

Je vous rappelle, que l’ensemble des billets sur GStreamer est regroupé sur cette page. Si vous voulez être tenu au courant des nouveaux articles sur le sujet, je vous conseille de vous abonner au flux RSS du blog, à mon compte Twitter ou à partir de Facebook.

Enfin pour finir, si vous utilisez cette présentation merci de laisser un petit commentaire sur cette page…

Catégories
Gstreamer Musique Open-source Planet-libre

Streaming audio haute qualité avec AAC

Le codec AAC (Advanced Audio Coding dont les fichiers portent souvent l’extension. MP4) est devenu au moins aussi populaire que le bon vieux MP3. Le fait que ce soit le codec audio utilisé par iTunes, le leader mondial de la vente en ligne, n’y est surement pas étranger.

Nous allons dans ce billet voir que l’on peut également utiliser ce codec lors de streaming. Je ne suis pas le premier à avoir cette idée car l’AAC est déjà utilisé pour la diffusion de la radio numérique Japonaise.

On ne change pas une équipe qui gagne, nous allons utiliser le framework GStreamer pour faire ce petit test de streaming audio entre deux machines. Pour ceux qui ne sont pas habitués à la notion de pipeline GStreamer, je vous conseille la lecture de ce billet.

Que cherche t’on à faire ?

Nous allons essayer de diffuser (« streamer ») un flux audio (par exemple un .WAV non compressé pour être sûr d’avoir une source de bonne qualité) depuis une machine A vers une machine B (reliées par un réseau IP) en utilisant un encodage AAC-LC et une encapsulation MPEG-4 / RTP.

Création de la pipeline d’émission

Si vous avez bien suivi, la commande suivante doit être saisie sur la machine A:

gst-launch -tv \

gstrtpbin name=rtpbin latency=0 buffer-mode=0 \

filesrc location=\ »samples/test.wav\ » ! decodebin ! audioconvert \

! queue ! faac bitrate=128000 ! rtpmp4apay \

! rtpbin.send_rtp_sink_1 \

rtpbin.send_rtp_src_1 ! udpsink port=6969 host=$IP_B

Bien que fait cette commande:

  1. elle lance GStreamer (gst-launch)
  2. Elle produit un flux réseau RTP (gstrtpbin)
  3. La source audio du flux réseau RTP sera un fichier WAV (filesrc), qui sera décodé (decodebin)
  4. On encode en AAC en utilisant le plugin faac (basée sur FAAC l’implémentation libre du codec AAC) en fixant un débit réseau cible de 128Kbps (128000 bits). On utilisera ainsi un streaming de type CBR (constant bitrate), c’est à dire que l’on fixe le débit et que le codec s’arrange pour adapter la qualité
  5. On encapsule le résultat dans une trame RTP MP4 Audio (rtpmp4apay)
  6. On stream en UDP (udpsink) vers la machine $IP_B  (à remplacer par l’adresse IP de la machine B) et sur le port 6969

Création de la pipeline de réception

A saisir sur la machine… B (bravo vous avez gagné une partie gratuite):

gst-launch -tv \

udpsrc port=6969 caps= »application/x-rtp, media=(string)audio, clock-rate=(int)16000, encoding-name=(string)MP4A-LATM, cpresent=(string)0, payload=(int)96, config=(string)40002810″ \

! gstrtpjitterbuffer latency=200 drop-on-latency=true ! rtpmp4adepay ! faad \

! audioconvert ! audioresample ! autoaudiosink

Que fait cette commande:

  1. Elle lance GStreamer (gst-launch)
  2. Elle écoute sur le port UDP port 6969 en filtrant les paquets RTP MP4A (udpsrc). La valeur a mettre dans la string config varie selon la fréquence d’échantillonnage de votre source. Elle est affichée lors du lancement de la pipeline A.
  3. Elle bufferise les paquets dans un buffer qui aura une taille maximale de 200ms (à adapter selon la qualité de votre réseau entre A et B). Si les paquets sortes de ce buffer avec plus de 200ms, ils seront dropés (donc perte de paquets, perte d’information, perte de son…).
  4. On décode le paquet RTP (rtpmp4adepay)
  5. On décode le flux audio AAC (faad)
  6. On joue le son sur le périphérique de sorti audio standard (autoaudiosink)

Résultat des tests

Après avoir fait mumuse avec des sources différentes (musique, voix…) et des débits plus ou moins importants (de 8 à 320 Kbps). On arrive à des résultats très intéressants.

Par exemple pour de la voix (« Pierre si tu m’entends 🙂 »), on arrive à une qualité tout à fait acceptable en réglant un bitrate de 16bps pour un flux à 16KHz.

Pour la musique, point de salut en dessous de 128 Kbps (à moins de se contenter d’une qualité vraiment médiocre). A 256 Kbps, on a une qualité qui correspond à une écoute depuis un fichier .MP4 téléchargé sous iTunes Store. Au dessus de 256 Kbps, je n’ai pas noté d’amélioration (mais je n’avais pas un périphérique de sorti de très grande qualité).

Catégories
Gstreamer Open-source Planet-libre Video

Transcoder facilement ses vidéos avec Arista

Arista est un projet développé en parallèle de Transmageddon qui a pour objectif d’avoir une solution logicielle libre et simple pour transformer une vidéo en un beau fichier compressé et compatible avec vos périphériques de lectures. Le logiciel se base sur le merveilleux framework GStreamer.

Nous allons donc voir dans ce billet comment installer puis utiliser ce logiciel sur une distribution Ubuntu 10.10 (vous pouvez bien-sur utiliser ce logiciel sur d’autre distribution, seule la procédure d’installation sera à changer).

Installation de Arista

C’est très simple sous Ubuntu:

sudo aptitude install arista nautilus-arista

Lancement de Arista

On passe par le menu principal > Son et vidéo > Arista Transcoder:

Transcodage pas à pas

1) Sélection de la source

On commence par sélectionner la source vidéo parmi:

  • un disque DVD (à insérer dans votre lecteur)
  • un fichier vidéo quelconque
  • une caméra / une webcam

2) Sélection du périphérique cible

On doit choisir le périphérique sur lequel on voudra lire la vidéo transcodé. On a le choix entre (cette liste évolue automatiquement selon les changement de version et des mises à jour spécifiques):

  • Android
  • Apple iPad
  • Apple iPod/iPhone
  • Ordinateur (Linux)
  • Lecteur DVD
  • Nokia N
  • Sony PSP
  • Sony PS3
  • Web (navigateur)

3) Sélection du format de pré réglage

Ce dernier choix dépend du périphérique cible. Par exemple pour une lecture sur un ordinateur, on a le choix entre H.264, WebM (VP8) ou Theora.

4) Sélection du fichier de la vidéo transcodé

On sélectionne enfin le nom du fichier de destination en cliquant sur le bouton « + Ajouter à la file« :

Puis on entre le nom du fichier.

Attention, le transcodage commence tout de suite, avec un aperçu en « live ».

Et voilà le résultat:

  • Fichier source (RAW): football_cif.y4m de 38 Mo
  • Fichier transcodé (VP8): football_cif.webm de 1.5 Mo

Conclusion

Arista est un transcoder simple à utiliser dans la pure tradition des logiciels Unix, une tache, un logiciel. Le fait que la liste des périphériques se mette automatiquement à jour est vraiment un plus non négligeable. Et hop un logiciel de plus dans mon script de post installation d’Ubuntu !

Catégories
Gstreamer Open-source Planet-libre Video Web

Un serveur RTSP basé sur GStreamer

Dans le petit monde du streaming vidéo, RTSP est un protocole permettant à un client (lecteur multimédia) de contrôler un serveur (serveur de streaming) en lui envoyant des ordres simples: lire, pause, stop, déplacement temporel (pour avoir une liste des fonctions théoriquement disponibles, vous pouvez lire la RFC 2326). Il est important, pour comprendre la suite de ce billet que le protocole RTSP ne fait pas lui même le streaming vidéo (il utilise pour cela le protocole RTP). RTSP est juste une couche complémentaire permettant de contrôler ce streaming.

Nous allons dans ce billet étudier un serveur basé sur le framework GStreamer. Maintenu par Wim Taymans, un des développeurs de GStreamer, gst-rtsp se compose d’un ensemble de librairies permettant de concevoir simplement son propre serveur RTSP. Pour effectuer des tests, les développeurs fournissent quelques exemples de serveurs.

Installation de gst-rtsp

On commence par récupérer les sources puis à compiler:

mkdir ~/src

cd ~/src

wget http://gstreamer.freedesktop.org/src/gst-rtsp/gst-rtsp-0.10.8.tar.bz2

bzip2 -d gst-rtsp-0.10.8.tar.bz2

tar xvf gst-rtsp-0.10.8.tar

cd gst-rtsp-0.10.8/

./configure

make

Premier streaming RTSP: la mire

On commence par lancer le serveur de test qui va streamer une mire:

cd examples/

./test-readme

Le serveur est maintenant lancé, en écoute sur le port TCP/8554 et l’URL: rtsp://127.0.0.1:8554/test

Note: si vous lancer le client sur une autre machine il faut bien sur remplacer 127.0.0.1 par l’adresse IP (ou le nom d’hôte) de votre serveur.

Si on regarde le code C de ce premier serveur (./test-readme.c), on peut retrouver la pipeline GStreamer qui va s’occuper de diffuser le flux sur le réseau:

videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96

On a donc la génération de la mire avec videotestsrc, puis un encodage H.264 avec x264enc puis enfant un streaming RTP avec rtph264pay.

Pour lire se genre de flux, on peut utiliser plusieurs logiciels. Le plus « populaire » est le très frenchie VLC. On lance donc le logiciel puis on va dans le menu Média / Ouvrir un flux réseau, puis on entre l’URL: rtsp://127.0.0.1:8554/test

Après quelques secondes, la vidéo devrait s’afficher:

On peut aussi utiliser FFplay (le player basée sur FFmpeg):

ffmplay rtsp://127.0.0.1:8554/test

Ou bien directement une pipeline GStreamer, ce qui ouvre la porte à des post traitements:

gst-launch -v rtspsrc location=rtsp://127.0.0.1:8554/test ! queue ! decodebin ! ffmpegcolorspace ! autovideosink

Il est bien sur possible de lancer plusieurs clients vers la même source RTSP (j’ai testé 3 clients en parallèle).

Une mire c’est bien, un fichier MPEG-4 c’est mieux

Les esprits chagrins vont me dire que pour tester les fonctions de seekink (déplacement temporel) avec une mire ce n’est pas terrible… Nous allons donc streamer une vidéo MPEG-4 (j’ai utilisé le logiciel Avidemux pour produire une vidéo de 640×360 en MPEG-4 ISO à partir d’une source Big Buck Bunny 720p AVI).

On va lancer le serveur avec les commandes suivantes (toujours dans le sous répertoires examples):

./test-mp4 ~/big_buck_bunny_360p_surround.mp4

Lecture à partir de VLC:

On a alors, pour cette vidéo, un flux réseau entre le serveur et le client variant entre 350 et 550 Kbps. Ceci est normal car la pipeline suivante que l’on peut trouver dans le fichier test-mp4.c ne fait en fait aucun transcodage. Comme la vidéo n’a pas été encodé en CBR (constant bit rate) on se retrouve avec des variations de débits:

filesrc location=%s ! qtdemux name=d d. ! queue ! rtph264pay pt=96 name=pay0 d. ! queue ! rtpmp4apay pt=97 name=pay1

Coté occupation CPU du coté client je suis à environ 25% sur un Core 2 à 1.8 Ghz.

Capture réseau

Pour les plus curieux d’entre vous, voici le résultat d’une capture réseau entre mon serveur RTSP (192.168.29.79) et un client (192.168.29.148).

On peut notamment y voir la négociation RTSP avec la liste des fonctions disponibles sur le serveur (OPTIONS, DESCRIBE, GET_PARAMETER, PAUSE, PLAY, SETUP, SET-PARAMETER, TEARDOWN) puis le début du streaming RTP.

Conclusion

Bien qu’en développement, ce projet de serveur RTSP basé sur GStreamer est très stable (je n’ai pas rencontré de plantage lors de mes tests) et facile à intégrer dans un développement en C. Si vous voulez faire mumuse et développer votre propre serveur, je vous conseille la lecture du fichier README qui se trouve dans le sous répertoire docs.

A vos serveurs !

Catégories
Gstreamer Open-source Planet-libre Video

Streaming live MPEG-4 entre Windows et Linux avec GStreamer

Nous allons dans ce billet aborder un sujet plutôt inhabituel pour ce blog: Windows 🙂 !

Le but étant de récupérer un flux vidéo live (venant par exemple d’une caméra) à partir  d’une machine sous Windaube (Xp, Se7en ou autres trucs dans le genre) vers une autre machine (Linux mais aussi Mac ou Windows). Pour cela, nous allons utiliser le framework open-source GStreamer qui va permettre d’unifier tout ce beau monde.

Avant de commencer

Pour illustrer cet article nous allons faire un streaming live depuis une machine Windows Xp vers une machine GNU/Linux Fedora 14 connecté sur le même réseau LAN.

On commence donc par installer GStreamer sur la machine Windows en récupérant et installant la dernière version à partir du site WinBuilds. Je parts sur le principe ou votre Gstreamer est installé dans le répertoire C:\Program Files\OSSBuild\GStreamer\v0.10.6 (si ce n’est pas le cas, il suffit d’adapter le script .BAT, variable GSTPATH, en conséquence).

Ensuite on installe Gstreamer sur son PC GNU/Linux (procédure ici pour Fedora et là pour Ubuntu).

Ok, on a donc le framework GStreamer installé sur les deux machines que nous allons utilisé pour faire nos tests.

Streaming depuis Windows

On commence par éditer un fichier texte (Notepad est ton ami) que l’on va nommer client.bat contenant:

REM

REM Streaming from WebCam + MPEG4-ISO encoding + RTP + UDP

REM

 

set GSTPATH= »C:\Program Files\OSSBuild\GStreamer\v0.10.6″

set CAPS= »video/x-raw-yuv,width=(int)640,height=(int)480,framerate=(fraction)10/1″

set STREAMTO= »192.168.0.10″

set STREAMPORT=5000

 

%GSTPATH%\bin\gst-launch.exe -tv –gst-plugin-path=%GSTPATH%\lib ^

gstrtpbin name=rtpbin latency=0 buffer-mode=0 ^

autovideosrc ! ffmpegcolorspace ^

! queue ! videoscale method=1 ! videorate ! %CAPS% ^

! timeoverlay ^

! queue ! ffenc_mpeg4 pass=0 bitrate=256000 rc-buffer-aggressivity=99 trellis=0 ^

! tee name= »display » ^

! rtpmp4vpay send-config=true ^

! rtpbin.send_rtp_sink_0 ^

rtpbin.send_rtp_src_0 ! udpsink port=%STREAMPORT% host=%STREAMTO% ^

display. ^

! queue ! decodebin ! ffmpegcolorspace ! autovideosink

 

pause

Il faut adapter les deux lignes set à votre configuration sachant que STREAMTO doit être associé à l’adresse IP de votre machine cible (la machine Fedora 14 dans mon cas) et que la résolution de votre Webcam doit être compatible avec les valeur de CAPS.

On exécute ensuite le fichier .bat (une fenêtre CMD va s’ouvrir et afficher les éventuels message d’erreurs).

La ligne de commande qui va s’occuper de l’encodage MPEG-4 est la suivante:

ffenc_mpeg4 pass=0 bitrate=256000 rc-buffer-aggressivity=99 trellis=0

Le paramètre bitrate (256 Kbps) va fixer le débit cible du streaming. Cette valeur est bien sur à adapter selon la résolution et la fréquence (fps) de votre source vidéo.

L’encapsultation dans une trame RTP est faite grâce à la commande:

rtpmp4vpay send-config=true

L’option send-config (=true)  permet à Gstreamer d’envoyer régulièrement sur le réseau (trame RTP) des informations sur les caractéristiques du stream au lieu de les envoyer seulement au début de la session.

Réception du stream depuis GNU/Linux

C’est (un peu) plus simple, on va créer un shell script server.sh:

#!/bin/sh

 

CAPS= »application/x-rtp,media=\(string\)video,clock-rate=\(int\)90000,encoding-name=\(string\)MP4V-ES,payload=\(int\)96″

PORT=5000

 

gst-launch -tv gstrtpbin name=rtpbin latency=0 buffer-mode=0 \

udpsrc caps=$CAPS port=$PORT do-timestamp=true \

! rtpbin.recv_rtp_sink_0 \

rtpbin. ! rtpmp4vdepay ! ffdec_mpeg4 ! autovideosink

Une fois le script édité, il faut le rendre exécutable:

chmod a+x server.sh

Puis executer le script pour recevoir le stream venant du PC Window

./server.sh

Et si on veut ajouter du son ?

Il suffit d’adapter les pipelines ! A tittre d’exemple, vous pouvez consulter les scripts suivants:

J’ai également essayé d’utiliser le codec X.264 (x264enc + x264dec) succés pour l’instant (qualité très mauvaise).

Catégories
Gstreamer Open-source Planet-libre Video Web

MyScreenCast passe en version 0.11

Il y quelques mois, j’avais écrit un script shell (MyScreenCast) permettant d’automatiser, en ligne de commande, la création d’un screencast (une vidéo de votre écran) avec des outils libres disponibles sur les distributions GNU/Linux (notamment GStreamer).

Je viens de mettre en ligne la version 0.11 de ce script avec les fonctions suivantes:

  • possibilité d’incruster un texte en overlay avec l’option  -o <Bla bla>
  • encodage du même screencast avec différents codecs
  • amélioration des pipelines GStreamer

Ces fonctions viennent s’ajouter aux fonctions suivantes:

  • capture vidéo de l’écran quelque soit sa résolution
  • capture audio (depuis le microphone par défaut de votre système)
  • incrustation de la vidéo venant de votre Webcam (avec l’option -w)
  • affichage des touches actionnées avec keymon (avec l’option -k)

Pour tester ce logiciel, il faut récupérer la dernière version du script:

MyScreencast

Puis de lancer la ligne de commande suivante:

chmod a+x ./myscreencast.sh

./myscreencast.sh

Comme toujours j’attend vos retours / tests sur d’autres distributions (je l’ai testé sous Ubuntu 10.10).