Catégories
Gstreamer Open-source

Test du codec Speex dans Gstreamer

Speex (wiki / site officiel) est un codec audio libre (licence dérivée de BSD) dont les perfomances sont très intéressantes, surtout pour transporter un signal comme la voix humaine. Le but de ce billet est de tester ce codec dans le cadre d’une application de streaming audio.

Mise en place du test

Pour tester ce codec, j’utilise le framework GStreamer et deux scripts shell tournant sur deux machines différentes. Le script rtpserver.sh prend comme source le microphone par défaut de votre machine, encode le flux en Speex, puis le diffuse en RTP/UDP vers la seconde machine. Le script rtpclient.sh récupére le flux RTP/UDP venant de la première machine, le décode et le diffuse sur la sortie son par défaut.

Le script rtpserver.sh:

#!/bin/sh

SEND_TO_ADDR=192.168.29.111
SEND_TO_RTP_PORT=5003
SEND_TO_RTCP_PORT=5004
RECV_FROM_RTCP_PORT=5005

ENCODER=speexenc
PAYLOADER=rtpspeexpay

SPEEX_PARAMS= »quality=4 vad=true dtx=true »
SPEEX_CAPS= »audio/x-raw-int,rate=16000″

ENCODER_PARAMS=${SPEEX_PARAMS}
RTP_PARAMS= »latency=200″
AUDIO_CAPS=${SPEEX_CAPS}

gst-launch -v  gstrtpbin name=rtpbin ${RTP_PARAMS} \
alsasrc \
! queue ! audioresample ! ${AUDIO_CAPS} ! ${ENCODER} ${ENCODER_PARAMS} ! ${PAYLOADER} \
! rtpbin.send_rtp_sink_1 \
rtpbin.send_rtp_src_1 ! udpsink port=${SEND_TO_RTP_PORT} host=${SEND_TO_ADDR} \
rtpbin.send_rtcp_src_1 ! udpsink port=${SEND_TO_RTCP_PORT} host=${SEND_TO_ADDR} sync=false async=false \
udpsrc port=${RECV_FROM_RTCP_PORT} ! rtpbin.recv_rtcp_sink_1

Le script rtpclient.sh:

#!/bin/sh

SEND_TO_RTCP_PORT=5005
RECV_FROM_ADDR=192.168.29.146
RECV_FROM_RTP_PORT=5003
RECV_FROM_RTCP_PORT=5004
AUDIORATE=16000

gst-launch-0.10 -v gstrtpbin name=rtpbin latency=200 \
udpsrc caps= »application/x-rtp, media=(string)audio, clock-rate=(int)${AUDIORATE}, encoding-name=(string)SPEEX, encoding-params=(string)1, ssrc=(guint)419764010, payload=(int)110, clock-base=(guint)3478167082, seqnum-base=(guint)57894″ port=${RECV_FROM_RTP_PORT} \
! rtpbin.recv_rtp_sink_1 \
rtpbin. ! rtpspeexdepay ! decodebin ! alsasink \
udpsrc port=${RECV_FROM_RTCP_PORT} ! rtpbin.recv_rtcp_sink_1 \
rtpbin.send_rtcp_src_1 ! udpsink port=${SEND_TO_RTCP_PORT} host=${RECV_FROM_ADDR} sync=false async=false

Attention, il faut lancer le script rtpclient.sh avant le rtpserver.sh . Les variables suivantes sont modifiables dans les scripts:

Script rtpserver.sh:
SEND_TO_ADDR: Adresse IP du client
SEND_TO_RTP_PORT: Numéro de port sur lequel les paquets RTP seront envoyés
SEND_TO_RTCP_PORT: Numéro de port sur lequel les paquets RTCP seront envoyés
RECV_FROM_RTCP_PORT: Numéro de port sur lequel les paquets RTCP seront reçus
SPEEX_PARAMS: Paramètres du plugin d’encodage Speexenc
SPEEX_CAPS: Caps du flux audio (audio rate)

Script rtpclient.sh:
SEND_TO_RTCP_PORT: Numéro de port sur lequel les paquets RTCP seront envoyés
RECV_FROM_ADDR:  Adresse IP du serveur
RECV_FROM_RTP_PORT: Numéro de port sur lequel les paquets RTP seront reçus
RECV_FROM_RTCP_PORT: Numéro de port sur lequel les paquets RTCP seront reçus
AUDIORATE: Audio rate, mettre la même valeur que celle dans le caps du serveur

Résultats des tests

Le premier test a été effectué avec un audio rate de 44000 (bref un taux d’échantillonnage proche de celui d’un CD audio).

Paramètres:
rate=44000 / vad=false / dtx=false
Tests:
En jouant sur l’option quality, on obtient
quality=10 -> bande passante de 80 Kbps
quality=8 -> bande passante de 60 Kbps
quality=6 -> bande passante de 50 Kbps
quality=4 -> bande passante de 40 Kbps
quality=3 -> bande passante de 36 Kbps
quality=2 -> bande passante de 35 Kbps
Conclusion:
On obtient une dégradation de la qualité de réception de la voix en dessous d’une valeur de quality de 4. Il est clairement dit dans la documentation que la qualité > 4 son a réserver pour les sources audio plus complexes que la voix humaine (musique, film…). Par contre la consommation de CPU est plus importante (rapport de 5 contre 1 entre quality=10 et quality=1).
La bande passante est constante (à quelques Kbps) que l’on parle ou que l’on ne parle pas.

Paramètres:
En jouant sur les paramètres vad et dtx, on va essayer d’optimiser la bande passante en gardant la même qualité.
VAD (dixit Wiki): « Quand cette option est activé, le VAD détecte quand l’audio encodé est du dialogue ou du silence/bruit de fond. VAD est toujours implicitement activé en encodage VBR, donc cette option est utile uniquement en mode non VBR. Dans ce cas Speex détecte les périodes sans dialogue et les encode avec le strict minimum de bits pour reproduire le bruit de fond. Cette fonction est appelée Comfort Noise Generation (CNG). »
DTX (dixit Wiki): « la transmission discontinue est une fonctionnalité qui s’ajoute aux
opérations de VAD et de VBR, qui permet de couper la transmission
complètement quand le bruit de fond est stationnaire. Dans un fichier,
5 bits sont utilisés pour chaque frame manquante (correspondant à 250 bits/s) »

Tests:
On ajoute les paramètres vad=true et dtx=true au niveau du serveur (SPEEX_PARAMS)
La bande passante reste la même (40 Kbps) quand on parle, par contre elle passe à 23 Kbps quand on ne parle pas.
Conclusion:
Les algorithmes VAD et DTX fonctionnent très bien. Ils permettent de gagner de la bande passante quand l’activité au niveau sonore est faible (ce qui est le cas dans une conversation ou, normalement, une seule personne parle à un instant t).

En conservant les paramètres du premier test (quality=4, vad=true, dtx=true), on change seulement l’audio rate (au niveau du serveur et du client).

Paramètres:
rate=16000
Tests:
Bande passante de 28 Kbps lorsque l’on parle, 17 Kbps pendant les silences.
Conclusion:
La qualité reste excellente. Sur une conversation (voix humaine), on ne voit pas la différence avec un rate de 44000 (44 KHz).

Paramètres:
rate=8000
Tests:

Bande passante de 23 Kbps lorsque l’on parle, 16 Kbps pendant les silences.

Conclusion:
La qualité est dégradée mais la conversation reste compréhensible. On gagne seulement 5 Kbps par rapport au test précédant.

Pour conclure

D’après les tests effectués, le meilleur compromis bande passante qualité est:

  • audio rate = 16000 (16 Khz)
  • quality = 4
  • vad = true
  • dtx = true

Catégories
Gstreamer Open-source Web

Mes marques ta-pages de la semaine

Main Page – PiTiViWiKi

Un éditeur de vidéo libre basé sur Gstreamer

SquidGuard : filtre d’URL et listes à jour (le plus dur) – Le blog de Michauko

Squid et Squidguard pour le filtrage d’URL via un proxy HTTP

Flavour Extended: The Ultimate Icon Set For Web Designers | Freebies | Smashing Magazine

420 icônes pour votre blog

Apprendre à faire une application iphone en 10 leçons

Tutos vidéo de l’université de Standford sur comment développer une application sur iPhone.

Migrer son site/blog WordPress chez un nouvel hébergeur | Jonasluthi.com | Blog officiel de Jonas Luthi

Comment migrer son blog WordPress d’un hébergeur à un autre.

100 Amazing Free WordPress Themes for 2009 | Developer’s Toolbox | Smashing Magazine

Idée de design de thème WordPress

Sortie de Cairo-Dock 2.0, les nouveautés – Génération Linux

Un dock à la Mac OS X sous GNU/Linux…

Catégories
Gstreamer Open-source Web

Mes marques ta-pages de la semaine

Personnalisation de Pidgin | Jonathan Ernst

Comment ajouter des fonctions (notamment Facebook) à Pidgin, le logiciel libre de messagerie instantanée.

25 Magento Templates For Your E-Commerce Business | Developer’s Toolbox | Smashing Magazine

Une liste de 25 templates pour votre prochain commerce sur le Web !

Over 35 Free, Essential Open Source Resources and Apps

Une liste de 35 logiciels libres à découvrir ! (en)

7.2R fois plus de rouge sur ton écran ! | Anapivirtua’s Blog

La version 7.2 de FreeBSD est bien là, à vos updates…

Unix Toolbox

Une liste de commandes bien utiles pour Unix…

9 Ways to Make Your WordPress Blog “Smart” | Weblog Tools Collection

9 trucs por rendre son blog plus… "smart"…

GStreamer Application Development Manual (0.10.21.3)

La doc officielle du développeur pour GStreamer

GTK Reference Manual

Le manuel de référence de GTK

GtkFr – Cours Gtk -2:LeTutorial

Un tuto sur le framework GTK (en Français)

Coherence – a DLNA/UPnP Framework for the Digital Living – Trac

A suivre, un serveur DLNA UPnP sous licence libre et proposant un framework Python

Installation rapide d’un serveur PXE

Installation automatique d’une machine sous Linux après boot en PXR

UNR – Ubuntu Wiki

Distribution Ubuntu pour mini portable… (Ubuntu Netbook Remix)

A110 1Tb (1000Gb) (Western Digital Caviar Green): Amazon.fr: High-tech

Popcorn hour 110 avec disque dûr

Popcorn Hour A-110 – Achat / Vente Lecteur multimédia de salon sur LDLC.com

Popcorn Hour, un serveur multimédia compatible UPNP et avec sortie HDMI
Attention, livré sans disque dur…

BUFFALO serveur multimédia linkstation live – nas – 500 go 7200 tr/min – sata – gigaethernet – compatible apple iphone – achat/vente BUFFALO serveur multimédia linkstation live – nas – 500 go 7200 tr/min – sata – gigaethernet – compatible apple iphone –

Serveur NAS multimédia compatible DLNA

SyncPlaces :: Modules pour Firefox

Pour synchroniser ces bookmarks Firefox entre plusieurs machines en utilisant son propre serveur FTP !

Gestion dual screen enfin simple grâce à ARandR – Le blog de jp.fox…

Utilitaire pour gérer de manière simple une configuration de Xorg avec un double écran.

Catégories
Developpement Gstreamer Open-source

Compilation d’une application GStreamer

Voici la procédure à suivre pour compiler un programme C utilisant le framework GStreamer sur une distribution GNU/Linux Ubuntu.

Installation des librairies

On commence par installer les packages suivants:

sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libxml2-dev

Puis on créer les liens symboliques suivants:

sudo ln -s /usr/include/gstreamer-0.10/gst /usr/include/gst
sudo ln -s /usr/include/libxml2/libxml /usr/include/libxml

Compilation de HelloGStreamer.c

Prenons en exemple le fichier hellogstreamer.c contenant le code ci-dessous (source ici):

#include <gst/gst.h>

int
main (int   argc,
      char *argv[])
{
  const gchar *nano_str;
  guint major, minor, micro, nano;

  gst_init (&argc, &argv);

  gst_version (&major, &minor, &micro, &nano);

  if (nano == 1)
    nano_str = « (CVS) »;
  else if (nano == 2)
    nano_str = « (Prerelease) »;
  else
    nano_str = «  »;

  printf (« This program is linked against GStreamer %d.%d.%d %s\n »,
          major, minor, micro, nano_str);

  return 0;
}

La compilation devra se faire via la commande suivante:

gcc `pkg-config –cflags –libs gstreamer-0.10` hellogstreamer.c -o hellogstreamer

Le résultat de l’exécution du programme hellogstreamer devrait alors donner:

# ./hellogstreamer
GStreamer version 0.10.22

A vous les beaux programmes utilisant ce superbe framework multimedia.

Catégories
Gstreamer Open-source Systeme

Tu fais quoi après l’installation d’Ubuntu ?

C’est en lisant le billet de SckyzO ce matin que je me suis rendu compte que je n’avais jamais mis sur le papier (sic) la liste des logiciels que j’installais systématiquement sur mes machines GNU/Linux Ubuntu.

Je vais essayer de mettre régulièrement ce billet à jour.

Voici donc ma commande magique (validée sur Ubuntu 9.04):

sudo apt-get install compizconfig-settings-manager gstreamer0.10-plugins-bad gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly-multiverse vlc ffmpeg ffmpeg2theora banshee music-applet liferea gwibber build-essential rxvt-unicode checkgmail gtk-recordmydesktop pidgin-facebookchat pidgin-plugin-pack drapes gnome-do gnome-do-plugins conky hardinfo flashplugin-installer sun-java6-plugin gthumb moovida

qui va installer:

  • la totale pour le FrameWork GStreamer
  • VideoLAN, le seul, l’unique, le meilleur logiciel pour regarder ses vidéos
  • Pour l’encodage/decodage FFmpeg et FFmpeg2theora
  • Banshee, mon lecteur audio préféré sous GNU/Linux (et son applet music-applet)
  • Liferea, comment vivre sans un lecteur de flux RSS de nos jours ? Celui-ci est simple, libre et efficace… (petit rappel, pour vous abonner au flux RSS de ce blog, c’est par ici)
  • Besoin de Twitter ? alors Gwibber est là…
  • un environnement de développement minimal (build-essential) puis suivre ce tuto pour installer Eclipse)
  • Urxvt est un terminal, plus rapide que gnome-terminal (voir ici pour une configuration aux petits oignons).
  • CheckGmail, un petit icone bien pratique qui se positionne dans la barre des taches pour me prévenir des nouveaux mail (Gmail). On peut même lire le contenu des mails. Il est même possible de gérer plusieurs comptes (option -profile=boulot) et les domaines hébergés chez Google (-hosted=mondomaine.com).
  • gtk-recordmydesktop permet de faire un screencast de son écran et d’une entrée audio. Idéal pour les tutos vidéos.
  • pidgin-facebookchat et pidgin-plugin-pack sont des plugins pour Pidgin, le client de messagerie instantané.
  • drapes est un utilitaire pour changer automatiquement de fond d’écran.
  • Gnome Do, un lanceur d’application libre et très bien.
  • Conky apporte une touche geek à votre bureau avec une supervision temps réel de votre machine (CPU / Memoire / T° …). Personnellement, j’utilise ce fichier .conkyrc (à mettre à la racine de votre compte). Si vous voulez le charger au démarrage : Système préférences → Application au démarrage.
  • Hardinfo permet d’avoir des informations systèmes et hardware de votre machine
  • Gthumb pour retoucher simplement mes images
  • Moovida: le media center ultime et libre !

Configuration du système

Pour le thèmes, je suis un fan de ceux proposées par Francois. Il faut d’abord installer des repos en suivant cette procédure. Puis séléctionner un des thèmes proposées.

Autres logiciels nécessitant des repos non standards…

Update: mon fichier /etc/apt/sources.list se trouve ici.

Si nécessaire, j’installe aussi Handbrake, il permet de riper les DVD et de convertir une vidéo dans un autre format. Pour cela, il faut ajouter les entrées suivants au fichier /etc/apt/sources.list:

## Medibuntu
deb http://packages.medibuntu.org/ jaunty free non-free

## Handbrake
# sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 62D38753
deb http://ppa.launchpad.net/handbrake-ubuntu/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/handbrake-ubuntu/ppa/ubuntu jaunty main

Puis installer les packages:

sudo apt-get update

sudo aptitude install libdvdcss2 handbrake

Pour faire les captures d’écran qui illustre mes billets, j’utilise le logiciel Shutter. Pour l’installer, il faut:

Ajouter la lignes suivantes à votre fichier /etc/apt/sources.list:

## Shutter (capture ecran)
# sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 009ED615
deb http://ppa.launchpad.net/shutter/ppa/ubuntu jaunty main

Puis lancer les deux commandes suivantes:

sudo apt-get update

sudo apt-get install  shutter

La version d’OpenOffice fournie en standard date un peu, pour avoir une version toute fraiche, il faut ajouter la lignes suivantes à votre fichier /etc/apt/sources.list:

## OpenOffice
# sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 247D1CFF
deb http://ppa.launchpad.net/openoffice-pkgs/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/openoffice-pkgs/ppa/ubuntu jaunty main

Puis lancer les deux commandes suivantes:

sudo apt-get update

sudo aptitude safe-upgrade

J’ai (pour l’instant ) laissé tombé Firefox (devenu trop lourd, il faut maigrir un peu Mr…) pour Chromium (lire ce billet):

Ajouter la lignes suivantes à votre fichier /etc/apt/sources.list:

## Chromium beta

# sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 4E5E17B5

deb http://ppa.launchpad.net/chromium-daily/ppa/ubuntu jaunty main

deb-src http://ppa.launchpad.net/chromium-daily/ppa/ubuntu jaunty main

Puis on installe le bébé:

sudo aptitude update

sudo aptitude install chromium-browser

Pour toujours avoir mes fichiers sous la main quelque soit l’ordinateur ou je me trouve, j’utilise le répertoire partagé Dropbox.

Ajouter la lignes suivantes à votre fichier /etc/apt/sources.list:

## Dropbox
# sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 30A514BE
deb http://linux.getdropbox.com/ubuntu jaunty main
deb-src http://linux.getdropbox.com/ubuntu jaunty main
deb http://ppa.launchpad.net/nautilus-dropbox/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/nautilus-dropbox/ppa/ubuntu jaunty main

Puis lancer les deux commandes suivantes:

sudo apt-get update

sudo apt-get install nautilus-dropbox

Conclusion

Et vous c’est quoi votre ligne magique ???

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 !