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

Encodage de vidéo WebM en ligne de commande

Le format multimédia WebM fait beaucoup parler de lui ces derniers temps. Sous l’impulsion de Google, il a pour objectif de devenir le standard libre pour la diffusion de fichier vidéo sur Internet. Sans entrer dans les polémiques de qualité et des problèmes de licence, nous allons dans ce billet voir comment encoder un vidéo dans un format WebM en ligne de commande en utilisant le framework GStreamer, fourni en standard sous GNU/Linux.

WebM, c’est quoi donc ?

En fait WebM est un conteneur multimédia, une enveloppe au même titre que OGG, MP4  ou AVI. Quand on parle de fichiers au « format WebM », cela sous entant l’utilisation des codecs audio Vorbis et vidéo VP8 (racheté il y a quelques mois par Google à la societé On2).

Avant de tester l’encodage d’un fichier WebM sur votre distribution GNU/Linux. Sous Ubuntu, il faut d’abord vérifier que vous disposez de la dernière version PPA de GStreamer:

sudo add-apt-repository ppa:gstreamer-developers

sudo aptitude update

sudo aptitude upgrade

sudo aptitude install gstreamer0.10-x gstreamer-tools gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse gstreamer0.10-ffmpeg gstreamer0.10-alsa gstreamer0.10-sdl

Enfin on vérifie que l’on a les bons plugins:

# gst-inspect | grep webmmux

matroska: webmmux: WebM muxer

 

# gst-inspect | grep vp8enc

vp8: vp8enc: On2 VP8 Encoder

 

gst-inspect | grep vorbisenc

vorbis: vorbisenc: Vorbis audio encoder

Passons maintenant aux choses sérieurses…

Encodage au format WebM

Pour mes test j’ai utilisé une bande annonce du film « Prince of persia » en qualité HD 1080p récupérée sur le site HDTrailers.

J’utilise ensuite la pipeline (ligne de commande) suivante pour effectuer l’encodage:

gst-launch -t filesrc location=pp_rltA_1080.mov ! progressreport \

! decodebin name=decoder decoder. \

! queue ! audioconvert ! vorbisenc quality=0.5 \

! queue ! webmmux name=muxer decoder. \

! queue ! ffmpegcolorspace ! vp8enc quality=5 speed=2 \

! queue ! muxer. muxer. ! queue ! filesink location=pp_rltA_1080-Q5.webm

La qualité vidéo par défaut (option quality=5) n’est pas terrible, on obtient de meilleurs résultats en l’augmentent. Voici un tableau comparatif:

Format Codecs Taille Aperçu (clique pour agrandir)
Source HQ .mov Audio: AAC 48 Khz
Video: H.264
126 Mo
WebM Audio: Vorbis 

Video: VP8 « Quality 5 »

24 Mo
WebM Audio: Vorbis 

Video: VP8 « Quality 6 »

30 Mo
WebM Audio: Vorbis 

Video: VP8 « Quality 7 »

40 Mo
WebM Audio: Vorbis 

Video: VP8 « Quality 8 »

61 Mo
WebM Audio: Vorbis 

Video: VP8 « Quality 9 »

73 Mo
WebM Audio: Vorbis 

Video: VP8 « Quality 10 »

92 Mo

Je trouve que la paramètre quality=7 est un bon compromis taille/qualité. Il faut noter que la source est d’un  qualité nettement supérieure (je ne connais pas les paramètre H.264 utilisés).

Comparaison avec les codecs Theora et H.264

Pour compléter ce petit test de WebM, nous allons comparer maintenant le résultat obtenu avec le paramètre quality=7 et les codecs Theora (avec une qualité égale à 7) et X.264 (avec une qualité de 23 équivalente).

Voici les lignes de commandes utilisées, pour l’encodage en WebM (VP8/Vorbis):

gst-launch -t filesrc location=pp_rltA_1080.mov ! progressreport \

! decodebin name=decoder decoder. \

! queue ! audioconvert ! vorbisenc quality=0.5 \

! queue ! webmmux name=muxer decoder. \

! queue ! ffmpegcolorspace ! vp8enc quality=7 speed=2 \

! queue ! muxer. muxer. ! queue ! filesink location=pp_rltA_1080-Q7.webm

puis en OGG (Theora/Vorbis):

ffmpeg2theora -v 7 –optimize pp_rltA_1080.mov -o pp_rltA-1080-Q7.ogg

et enfin en MP4 (X.264/FAAC):

x264 –tune animation –crf 23 -o pp_rltA-1080-Q7.mp4 pp_rltA_1080.mov

On obtient les résultats suivants:

Format Codecs Taille Aperçu (clique pour agrandir)
WebM Audio: Vorbis 

Video: VP8 « Quality 7 »

40 Mo
OGG Audio: Vorbis 

Video: Theora « -v 7 »

57 Mo
MP4 Audio: AAC 

Video: X.264 « CRF 23 »

56 Mo

Que peut on en déduire ? Niveau qualité, le format H.264 garde une longueur d’avance (mais pour combien de temps). Theora est en dessous. Par contre le taux de compression est bien meilleur avec le codec VP8 mais encore faut il être sur que l’on peut comparer les paramètres utilisés…

A vous de vous faire une idée !

Conclusion

Bien que « jeune » ce format de fichier semble avoir un bel avenir. Surtout si Google arrive à l’imposer comme un « standard industriel » (sic). Avec des leviers comme YouTube et Google Chrome, j’ai peu de doute sur le résultat des courses qui ne se fera pas sur un plan technique mais sur la capacité de chacun de défendre son format.

Catégories
Open-source Video

Installation de FFMpeg avec support WebM sous Ubuntu

Plus la peine de tout celà… La version 0.6 de FFMpeg supporte nativement WebM !

WebM est un format multimedia qui risque de mettre tout le monde d’accord dans la « gueguerre » des codecs vidéos pour la diffusion sur le Web.

WebM est libre, gratuit, basée sur les codecs vidéo VP8 et audio Vorbis et il est soutenu par… Google.

Voici donc un script shell permettant d’installer ce nouveau format sur votre système Ubuntu: ffmpeginstall-with-webm.sh

et la procédure d’installation associée:

[shell]

wget http://svn.nicolargo.com/ubuntupostinstall/trunk/ffmpeginstall-with-webm.sh

chmod a+x ffmpeginstall-with-webm.sh

./ffmpeginstall-with-webm.sh

[/shell]

Le script fait les choses suivantes:

  • Installation de la dernière version de X.264 (git)
  • Installation du codec VPX (VP8) (git)
  • Installation de FFmpeg version SVN-23210 et le patch WebM en version RC3

Pour tester ce nouveau codec, vous pouvez utiliser la commande suivante:

[shell]

ffmpeg -i source.avi -f webm -vcodec libvpx destination.webm

[/shell]

Je reviendrai surement sur le sujet WebM, notamment pour parler qualité du codec vidéo VP8…

Catégories
Gstreamer Open-source Video Web

MyScreenCast, comment faire du screencast avec GStreamer

Je ne sais pas vous mais je n’arrive pas à trouver LE logiciel de screencast libre ultime pour mon PC Linux. J’ai essayé Istanbul (le résultat est très mauvais sur ma distribution Ubuntu 10.04), XVidCap (pas d’enregistrement du son) et même VLC (un peu usine à gaz pour ce besoin)… Seul RecordMyDesktop sort du lot bien que son interface graphique d’administration (gtk-recordmydesktop) ne soit pas des plus ergonomique.

Ce billet est donc un appel à la communauté pour développer CE logiciel en question !

Nous allons dans un premier temps donner les bases techniques permettant de faire un screencast à partir du framework GStreamer (fourni en standard sous Linux). Puis donner dans les grandes largeurs les spécifications DU logiciel.

On commence par la fin: le résultat

Voici le screencast obtenu (format libre OGV – Theora/Vorbis – hébergé sur blip.tv): si votre navigateur est compatible…

Sinon vous pouvez toujours consulter la vidéo en ligne sur Blip.tv ou sur Vimeo (codec H.264/AAC)

Les fichiers générés sont au format HD 720p et ont une taille d’environ 11 Mo pour le format M4V et 13 Mo pour le format OGV.

Screencast avec GStreamer en ligne de commande

On commence par vérifier que l’on dispose bien du plugin gstreamer istximagesrc:

[cc]

gst-inspect istximagesrc

version 0.2.2

[/cc]

Si ce n’est pas le cas, il suffit d’installer le package Istanbul qui inclue ce plugin:

[cc]

sudo aptitude install istanbul

[/cc]

Aller, une fois ces menus préparatifs passés,  on commence par lancer un capture vidéo de l’écran et sonore en utilisant la ligne de commande GStreamer (pipeline) suivante:

[cc]

gst-launch avimux name=mux ! filesink location=screencast.avi \
alsasink ! audioconvert ! queue ! mux. \
istximagesrc name=videosource use-damage=false ! video/x-raw-rgb,framerate=10/1 \
! ffmpegcolorspace ! queue ! videorate ! ffmpegcolorspace ! videoscale method=1 \
! video/x-raw-yuv,width=1152,height=720,framerate=10/1 ! mux.

[/cc]

Cette commande va capturer l’écran à 10 images par secondes (istximagesrc), le son (alsasink) et mixer le tout (sans compression mais avec une redimensionnement de la vidéo au format 720p) dans un fichier temporaire au format AVI. Ce fichier aura une taille très importante mais c’est juste une étape temporaire avant la compression.

Pour cette compression j’utilise deux pipelines permettant de générer des screencasts au format libre OGV (Theora/Vorbis) et propriétaire M4V (H.264/AAC), comme cela, tous les navigateurs sont heureux:

[cc]

gst-launch filesrc location=screencast.avi ! decodebin name= »decode » \
decode. ! videoparse format=1 width=1152 height=720 framerate=10/1 \
! queue ! ffmpegcolorspace ! theoraenc ! queue ! \
oggmux name=mux ! filesink location=screencast.ogv \
decode. ! queue ! audioconvert ! vorbisenc ! queue ! mux.

gst-launch filesrc location=screencast.avi ! decodebin name= »decode » \
decode. ! videoparse format=1 width=1152 height=720 framerate=10/1 \
! queue ! ffmpegcolorspace ! x264enc pass=4 quantizer=23 threads=0 ! queue ! \
ffmux_mp4 name=mux ! filesink location=screencast.m4v \
decode. ! queue ! audioconvert ! faac tns=true ! queue ! mux.

[/cc]

Un script qui fait tout…

Comme je suis un bon loulou, voici un script shell qui automatise

  1. le lancement de votre Webcam pour avoir une incrustation de votre image dans le screencast
  2. le lancement de la capture video de l’écran + capture audio (après un délais de 3 secondes histoire de refaire son nœud de cravate)
  3. (on arrête la capture en faisant un CTRL-C dans la fenêtre)
  4. la compression du screencast dans un fichier screencast-dateetheure.ogv (codec Theora/Vorbis)
  5. la compression du screencast dans un fichier screencast-dateetheure.m4v (codec H.264/AAC)
  6. la suppression du fichier temporaire

A télécharger ici: https://raw.github.com/nicolargo/myscreencast/master/myscreencast.sh

Vous pouvez éditer le fichier et notamment la configuration suivante:

[cc]

### Variables à ajuster selon votre configuration
AUDIODEVICE= »alsasrc »
WEBCAMDEVICE= »/dev/video0″
WEBCAMHEIGHT= »240″
OUTPUTHEIGHT= »720″
OUTPUTFPS= »10″
### Fin des variables à ajuster

[/cc]

… en attendant LE programme ultime

qui devra reprendre en gros les étapes de mon script mais en ajoutant:

  • une interface graphique
  • le choix d’une portion de l’écran à capturer
  • le choix d’une application (fenêtre) à capturer
  • le choix de la source audio (mixage possible avec la librairie Jack)
  • paramétrage fin des codecs audio et video
Catégories
Gstreamer Open-source Systeme Video

Maintenir à jour FFMpeg et X.264 sous Ubuntu

Dans la série petits scripts permettant de gagner du temps, je vous présente ffmpeginstall.sh et ffmpegupdate.sh. Ils se basent sur un post du forum Ubuntu qui est régulièrement mis à jour à chaque version d’Ubuntu.

  1. ffmpeginstall.sh permet d’installer les dernières versions de FFMpeg (svn) et du codec X.264 (git) à partir des sources.
  2. ffmpegupdate.sh permet de mettre à jour ces deux logiciels à partir des sources.

Suivi des modifications:

  • 26/04/2010: Scripts version 0.1 (validé sous Ubuntu 9.10 et 10.04)

Récupération des scripts

On commence par récupérer les scripts:

[shell]

mkdir ~/src

cd ~/src

wget http://svn.nicolargo.com/ubuntupostinstall/trunk/ffmpeginstall.sh

wget http://svn.nicolargo.com/ubuntupostinstall/trunk/ffmpegupdate.sh

chmod a+ ffmpeg*.sh

[/shell]

Lancement des scripts

Pour une installation initiale:

[shell]

cd ~src

./ffmpeginstall.sh

[/shell]

Pour une mise à jour:

[shell]

cd ~src

./ffmpegupdate.sh

[/shell]

Le résultat

[shell]

ffmpeg -version
FFmpeg version SVN-r22965, Copyright (c) 2000-2010 the FFmpeg developers
built on Apr 26 2010 16:57:27 with gcc 4.4.3
configuration: –enable-gpl –enable-version3 –enable-nonfree –enable-postproc –enable-pthreads –enable-libfaac –enable-libfaad –enable-libmp3lame –enable-libopencore-amrnb –enable-libopencore-amrwb –enable-libtheora –enable-libx264 –enable-libxvid –enable-x11grab

x264 –version
x264 0.94.1564 a927654
built on Apr 26 2010, gcc: 4.4.3

[/shell]

Et si je veux revenir avec les versions systèmes ?

Rien de plus simple, il suffit de saisir la commande suivante:

[shell]

sudo apt-get remove x264 ffmpeg build-essential subversion git-core checkinstall yasm texi2html libfaac-dev libfaad-dev libmp3lame-dev libsdl1.2-dev libtheora-dev libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev

[/shell]

Je suis preneur de tout retour/amélioration sur ces scripts…

Catégories
Gstreamer Open-source Video Web

Configuration pas à pas d’un serveur de streaming Flumotion

Flumotion est un projet de serveur de streaming vidéo open-source distribué sous licence GPL. Développé en Python et basé sur les frameworks Twisted et GStreamer, il permet de diffuser sur un réseau des vidéos venant de sources lives (caméra, tv…) ou stockées dans des fichiers (on parle alors de VoD pour Video à la demande) en proposant un interface utilisateur de type Web (vous pouvez voir une démo ici).

Catégories
Open-source Video

Comparer la qualité des vidéos par logiciel

Lors d’un dernier article (FFMPEg2Theora, guide par l’exemple), j’ai utilisé une méthode visuelle subjective pour comparer la qualité d’encodage de deux vidéos. En poussant un peu plus mes recherches sur le sujet, je suis tombé sur le projet Qpsnr qui propose une méthode analytique basée sur le calcul des mesures PSNR ou SSIM sur les vidéos. Nous allons donc voir comment installer le logiciel, puis l’utiliser sur des vidéos de test encodées avec des paramètres différents.

Catégories
Open-source Video

Compiler la dernière version de X.264 sous Ubuntu

Si vous avez besoin de la toute dernière version de X.264, l’encodeur libre H.264 du groupe de travail VideoLAN, voici une procédure « out-of-the-box ».

On commence par supprimer la version système si celle-ci existe, puis a installer quelques pré-requis:

[shell]
sudo aptitude purge gpac x264 libx264-dev
sudo apt-get install build-essential zlib1g-dev libglut-dev checkinstall
[/shell]

On compile GPAc (qui permet de gérer les fichiers au format .mp4):

[shell]
cd
wget http://superb-east.dl.sourceforge.net/sourceforge/gpac/gpac-0.4.5.tar.gz
wget http://voxel.dl.sourceforge.net/sourceforge/gpac/gpac_extra_libs-0.4.5.tar.gz

tar -zxf gpac-0.4.5.tar.gz
tar -zxf gpac_extra_libs-0.4.5.tar.gz
cd gpac_extra_libs
cp -r * ../gpac/extra_lib
cd ../gpac
chmod +x configure
./configure –disable-opengl –use-js=no –use-ft=no –use-jpeg=no –use-png=no –use-faad=no –use-mad=no –use-xvid=no –use-ffmpeg=no –use-ogg=no –use-vorbis=no –use-theora=no –use-openjpeg=no
make lib
make apps
sudo make install-lib
sudo make install
sudo rm -f /usr/lib/libgpac.so
sudo cp bin/gcc/libgpac.so /usr/lib
[/shell]

Puis on installe la dernière version (GIT) de X.264:

[shell]

cd
git clone git://git.videolan.org/x264.git
cd x264
./configure
make
sudo checkinstall –pkgname=x264 –pkgversion "1:0.svn`date +%Y%m%d`+`git rev-list HEAD -n 1 | head -c 7`" –backup=no –default
[/shell]

On teste pour voir si la version est bonne (release 1523 au moment de l’écriture de ce billet):

[shell]

x264 –help
x264 core:92 r1523 25ca5b0
Syntax: x264 [options] -o outfile infile [widthxheight]

[/shell]

Sources:

Catégories
Open-source Video Web

FFMpeg2Theora, guide par l’exemple

Une des évolution les plus discutée de la 5em version du langage HTML est le support des balises <video> et <audio>. Ces dernières permettent d’insérer et de jouer une vidéo et/ou une musique directement dans une page du navigateur, sans nécessité d’installer de logiciel ni de codec externes. Devant la non décision du W3C de ne pas imposer les codecs dans la norme HTML5, les éditeurs de navigateur internet on fait des choix stratégiques/techniques (OGG/Theora/Vorbis pour les codecs libres ou MP4/H.264/AAC pour les codecs propriétaires).

Video/Audio		FF	Opera	Chrome	Safari	iPhone	Android
OGG/Theora/Vorbis	✓	✓	✓	·	·	·
MP4/H.264/AAC   	·	·	✓	✓	✓	✓

Nous allons dans ce billet nous focalisé sur l’utilisation du logiciel ffmpeg2thera pour générer des vidéos au format libre OGG/Theora/Vorbis.

Catégories
Gstreamer Open-source Reseau Video

Streaming vidéo SD avec Gstreamer

Nous allons dans ce billet essayer d’optimiser le streaming d’un flux SD sur un réseau local (LAN de 100 Mbps) en utilisant le framework GStreamer.

Environnement des tests

Deux PC Ubuntu connectés sur un même switch (100 Mbps full-duplex).

  • PC serveur: Intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz / 2 Go RAM
  • PC client: Intel(R) Core(TM)2 Duo CPU E6750 @ 2.66GHz / 1 Go RAM

GStreamer version 0.10.25.

Vidéo source: Big Buck Bunny 480p

Tests avec le codec X.264

Ligne de commande sur la machine générant le streaming (serveur):

serveur> gst-launch -v \ filesrc location= »../Vidéos/big_buck_bunny_480p_stereo.ogg » \ ! queue ! decodebin \ ! queue ! videoscale method=1 ! video/x-raw-yuv,width=854,height=480 \ ! queue ! videorate ! video/x-raw-yuv,framerate=\(fraction\)24/1 \ ! queue ! x264enc byte-stream=true bitrate=2000 bframes=4 ref=4 me=hex subme=4 weightb=true threads=0 \ ! queue ! rtph264pay \ ! queue ! udpsink port=5000 host=192.168.29.150 sync=false async=false

Ligne de commande sur la machine recevant le streaming (client):

client> gst-launch -v udpsrc caps= »application/x-rtp, media=\(string\)video, clock-rate=\(int\)90000, encoding-name=\(string\)H264, payload=\(int\)96″ port=5000 \
! queue ! rtph264depay \
! queue ! ffdec_h264 ! xvimagesink

Résultat:
Visuel: vidéo saccadé (environ 2 img/sec)
Bande passante mesurée: entre 2 et 3 Mbps
Resource serveur: %CPU=135 / %MEM=5
Resource client: %CPU=10 / %MEM=2

On ajoute un buffer juste avant le depay et le décodage (au niveau du client):

client> gst-launch -v udpsrc caps= »application/x-rtp, media=\(string\)video, clock-rate=\(int\)90000, encoding-name=\(string\)H264, payload=\(int\)96″ port=5000 \
! queue ! gstrtpjitterbuffer latency=3000 \
! queue ! rtph264depay \
! queue ! ffdec_h264 ! xvimagesink

Résultat:
Visuel: vidéo beaucoup plus fluide mais variation de la gigue (accéleration de la video par moment). On a par contre un décalage de 3 secondes, donc inutilisable pour des flux lives.
Bande passante mesurée: entre 2 et 3 Mbps
Resource serveur: %CPU=140 / %MEM=6
Resource client: %CPU=14 / %MEM=2

On modifie ensuite les paramètres d’encodage X.264 (au niveau du serveur):

serveur> gst-launch -v –gst-debug-level=2 \
filesrc location= »../Vidéos/big_buck_bunny_480p_stereo.ogg » \
! queue ! decodebin \
! queue ! videoscale method=1 ! video/x-raw-yuv,width=720,height=480 \
! queue ! videorate ! video/x-raw-yuv,framerate=\(fraction\)24/1 \
! queue ! x264enc vbv-buf-capacity=3000 byte-stream=true bitrate=900 subme=4 ref=2 bframes=1 b-pyramid=true weightb=true \
! queue ! rtph264pay \
! queue ! udpsink port=5000 host=192.168.29.150 sync=false async=false

Résultat:
Visuel: Presque plus de sacade ni de variation de gigue. On a par contre un décalage de 3 secondes, donc inutilisable pour des flux lives.
Bande passante mesurée: entre 2 et 3 Mbps
Resource serveur: %CPU=120 / %MEM=4
Resource client: %CPU=10 / %MEM=2

Catégories
Gstreamer Open-source Video

Encodage de vidéo avec GStreamer

Si vous suivez régulièrement ce blog, vous savez que je m’intéresse au Framework multimédia GStreamer présent de base dans les systèmes d’exploitations GNU/Linux.  Nous allons dans ce billet voir comment encoder en ligne de commande une source vidéo vers des fichiers aux formats OGG (Theora/Vorbis) et/ou MP4 (H264/AAC).