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
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 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).

Catégories
Open-source Web

Le tag video dans HTML 5

La nouvelle révision du langage HTML apporte sont lot de nouvelles balises (voir le Wiki pour une liste exhaustive). Une de celles qui a fait couler le plus d’encre est la fonction permettant d’intégrer nativement des lecteurs vidéos dans les pages: <video>. Nous allons dans ce billet nous focaliser sur cette nouvelle balise et en détailler les options.

Introduction

Pour qu’un navigateur Web soit capable de lire directement une vidéo (c’est à dire un flux vidéo et audio), il faut qu’il possède les librairies de décodages (codecs) de ces flux. Dans sa grande sagesse, le W3C (l’organisme qui spécifie le langage HTML) avait décidé de normaliser ces codecs en choisissant les formats libres Theroa et Vorbis. Après un lobbying très actif d’Apple et de Nokia, le W3C a supprimer de ces spécifications le fait d’imposer un codec vidéo et audio commun. En clair on peut très bien se retrouver avec un Firefox qui permettra de lire des vidéos au format Theroa/Vorbis et un Safari qui décodera les vidéos au format H.264…

A l’heure actuelle, le navigateur Firefox est capable (dans sa version 3.5) de lire des vidéos utilisant le codec vidéo Theora et le format audio Vorbis. Bien lui en a pris… Nous allons donc utiliser ce Navigateur pour nos tests.

Hébergement des vidéos

Si vous souhaitez intégrer des vidéos dans votre site Web, la première chose à prendre en compte est l’hébergement des fichiers sources. En effet ces fichiers peuvent être volumineux et en cas de consultation simultanées le débit peut devenir très important. A moins de disposer d’une infrastructure d’hébergement professionnelle, je ne vous conseille pas d’héberger les fichiers vidéos sources sur votre serveur Web. De nombreux sites permettent un hébergement gratuit d’œuvres libres de droits. J’ai choisi Wikimedia pour héberger la vidéo qui va illustrer mes exemples.

Si vous souhaitez tout de même héberger vos vidéos sur votre serveur Web Apache, il faut vérifier que les type mime suivant sont pris en compte dans la configuration (fichier de configuration ou fichier .htaccess):

AddType video/ogg          .ogv
AddType application/ogg    .ogg

Exemples d’utilisation de la balise <video>

Affichage d’une vidéo

Nous allons dans ce premier exemple afficher sur une page Web une vidéo stocké sur le serveur Wikimedia à l’adresse suivante: http://upload.wikimedia.org/wikipedia/commons/6/67/Bigbuckbunnyextract.ogg

La vidéo va être téléchargé (ce n’est donc pas du streaming). Quand le navigateur estimera que le téléchargement est assez avancé, il commencera à jouer la vidéo.

Pour lancer la vidéo, il faut faire un click droit / Play.

On utilise le code suivant:

<video src= »http://upload.wikimedia.org/wikipedia/commons/6/67/Bigbuckbunnyextract.ogg »></video>

Voir l’exemple 01 en action.

Affichage d’une vidéo avec ses contrôleurs

On va améliorer l’exemple précédant en ajoutant des contrôleurs (Play/Pause, barre de progession et volume). On utilise pour cela le tag controls:

Voici le code:

<video src= »http://upload.wikimedia.org/wikipedia/commons/6/67/Bigbuckbunnyextract.ogg » controls></video>

Voir l’exemple 02 en action.

Redimensionnement de la vidéo

L’intégration de la vidéo dans le design de votre site Web nécessitera surement une redimensionnement de celle-ci. Attention, ce n’est pas parce-que la vidéo est plus petite que le temps de chargement va être plus cours. En effet, c’est la même source qui est utilisée.

Voici le code:

<video src= »http://upload.wikimedia.org/wikipedia/commons/6/67/Bigbuckbunnyextract.ogg » width= »427″ height= »240″ controls></video>

Voir l’exemple 03 en action.

Forcer la lecture de la vidéo

Une autre fonction intéressant est le fait de pouvoir forcer la lecture de la vidéo (sans aucune intervention de votre visiteur). On utilise le tag autoplay.

Voici le code:

<video src= »http://upload.wikimedia.org/wikipedia/commons/6/67/Bigbuckbunnyextract.ogg » width= »427″ height= »240″ controls autoplay></video>

Voir l’exemple 04 en action.

Ajouter des contrôleurs en JavaScript

C’est bien beau d’avoir les contrôleurs disponible sur la vidéo mais pour une intégration aux petits oignons dans votre site, il peut être utile de déporter ces fonctions sur des liens/boutons externes. Pour cela, la balise vidéo permet de fixer un tag id. Ce dernier pourra être utilisé dans un JavaScript:

 <script>
                function play() {
			video = document.getElementById("myvideo");
			video.play();
		}
		function pause() {
			video = document.getElementById("myvideo");
			video.pause();
		}
</script>
...
<video id="myvideo" src="http://upload.wikimedia.org/wikipedia/commons/6/67/Bigbuckbunnyextract.ogg" width="427" height="240" controls></video>

Voir l’exemple 05 en action.

Conclusion

Pour aller plus loin je vous conseille une lecture attentive du document de spécification du W3C.

Catégories
Image Open-source

Installation des OggVideoTools sous Ubuntu

Pour ceux qui ne connaissent pas, OggVideoTools est composé des logiciels suivants (en ligne de commande):

  • oggSplit: permet de séparer l’audio et la vidéo d’un fichier en deux fichiers distincts (un fichier par flux).
  • oggJoin: Prend en entré une liste de fichiers OGG (audio au format vorbis et/ou vidéo au format Theroa) et donne en sortie un seul fichier.
  • oggCut: permet de couper un fichier OGG.
  • oggCat: permet de coller les uns à la suite des autres des fichiers OGG.
  • oggDump: Affiche un fichier OGG sous la forme de paquets.
  • oggLength: Affiche la taille d’un fichier OGG (en ms).

Si vous voulez en plus disposer des deux autres utilitaires suivants, Il faut passer par une phase de compilation supplémentaire de la librairie Theora depuis les sources car le paquet Ubuntu (et aussi Debian) comporte un bug.:

  • oggResize: permet de changer les caractéristiques des flux audio/video d’un fichier OGG.
  • oggSilence: Permet de créer un fichier audio vide (silence) au format Vorbis d’une taille donnée.

En attendant que ces petits utilitaires pour manipuler les fichiers audio/video libre basés sur le format libre OGG soit disponibles dans les dépôts Ubuntu (ce qui ne devrait pas tarder…). Voici une petite procédure pour effectuer la compilation depuis les sources.

Compilation des OggVideoTools

Les sources sont hébergées sur le site Sourceforge.

On commence par récupérer les sources de la dernière version disponible (0.7b au moment de l’écriture de ce billet):

wget http://downloads.sourceforge.net/project/oggvideotools/oggvideotools/oggvideotools-0.7b/oggvideotools-0.7b.tar.gz

Puis on lance la compilation (il faut que votre machine dispose des outils de compilation standard: build-essential sous Ubuntu):

./configure
make
sudo make install

Et voili:

# oggLength bigbuckbunny.ogv
596467

# oggSplit bigbuckbunny.ogv
# ls -alF
total 326172
-rw-r–r– 1 labo labo 166825767 2009-08-21 11:26 bigbuckbunny.ogv
-rw-r–r– 1 labo labo 153622630 2009-08-21 16:26 theora_f0678e1.ogg
-rw-r–r– 1 labo labo  13203137 2009-08-21 16:26 vorbis_1fa82364.ogg