MyScreenCast, comment faire du screencast avec GStreamer

Date: 29/04/2010 | Catégories: Gstreamer,Open-source,Video,Web | Tags: ,,,,,,,,

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