Dernière mise à jour : 02/02/2008

Remarque : si vous souhaitez simplement faire des vidéos d'écran sans vous compliquer la vie avec la compilation de ffmpeg, vous pouvez aussi consulter le billet plus récent Istambul et recordMyDesktop : les vidéos d'écran sans se fatiguer.

Pourquoi une vidéo en format Flash ?

Voilà une question pertinente ! Il existe un nombre impressionnant de formats vidéos alors pourquoi Flash ? Tout simplement parce que chaque plate-forme propriétaire (Mac OS et Windows® principalement) privilégie ses propres formats vidéo. Ainsi sur un système installé par défaut, on trouve généralement très peu de formats vidéos reconnus et, bien sûr, ce ne sont pas les mêmes d'une plate-forme à l'autre ! Il faudrait alors savoir quels sont les formats qui sont facilement accessibles à l'utilisateur sans s'arracher les cheveux entre lecteur, codec, plugin...

Le format Flash remet un peu tout le monde d'accord puisque Flash n'est généralement pas installé avec le système mais est très facile à installer[1] : il n'y a pas d'histoire de codec ou de plugin. En plus il est multi plate-forme Linux, Mac OS, Windows®, et le format FLV est très compressé. Curieusement c'est le format choisi par Youtube et par d'autres sites de plus en plus nombreux, signe des temps ?

Installer ffmpeg dans la bonne configuration

Le logiciel ffmpeg gère un nombre faramineux de formats vidéos et ne peut évidemment pas faire l'impasse sur les formats Flash SWF et FLV. Bien sûr ffmpeg est un paquet standard des distributions Linux Debian et Ubuntu. Néanmoins, bien que la documentation de ffmpeg mentionne explicitement dans sa section exemples :

« FFmpeg can grab the X11 display.[2]

ffmpeg -f x11grab -i :0.0 /tmp/out.mpg »

l'exécution de la commande d'exemple se solde par une erreur parce que ffmpeg n'est pas compilé par défaut avec l'option --enable-x11grab. Donc l'enregistrement de l'écran dans une vidéo ne marche pas d'emblée. Or sous Linux on ne vous livre jamais de logiciels bridés, il faut en revanche de temps en temps avoir le courage de refaire les choses soi-même... Dans ce cas il y a quelques opérations - simples - à réaliser pour remettre les choses en fonctionnement :

  1. récupérer les sources de ffmpeg
  2. activer l'option --enable-x11grab
  3. renommer le paquet ffmpeg
  4. recompiler
  5. installer les nouveaux paquets

Tout ceci est expliqué dans le billet Rebuilding ffmpeg to create screencast in Ubuntu à ceci près qu'il n'y a plus besoin de patcher le code source puisque le support de x11grab est devenu standard dans ffmpeg. On suppose par la suite que l'on travaille avec la très récente version de ffmpeg fournie par le dépôt de logiciels http://debian.multimedia.org/. On a donc un des sites miroir dans le fichier /etc/apt/sources.list et en particulier celui des paquets de code source :

deb http://debian-multimedia.informatik.uni-erlangen.de/ etch main
deb-src http://debian-multimedia.informatik.uni-erlangen.de/ etch main
Reconfigurer ffmpeg

Il faut d'abord récupérer le code source de ffmpeg :

# apt-get update
# apt-get source ffmpeg

Ces deux commandes suffisent ! Ensuite il faut ajouter l'option --enable-x11grab dans le fichier debian/changelog :

# cd ffmpegcvs-20070329/
# nano debian/rules

On recherche alors la section suivante :

configure: configure-stamp
configure-stamp: patch-stamp

pour y ajouter l'option manquante dans une des lignes d'options, par exemple :

       --enable-libogg --enable-libgsm --enable-x264 --enable-liba52 --enable-x11grab \

Il s'agit maintenant de modifier le nom du paquet afin qu'on ne le confonde pas avec le paquet d'origine et qu'il ne se fasse pas écraser lors des futures mises à jour du système. Pour cela il faut éditer debian/changelog :

# nano debian/changelog

et ajouter au début en respectant les espaces :

ffmpegcvs (3:20070329-0.0.x11grab) unstable; urgency=low

  * Build with --enable-x11grab

 -- votre nom <votre.nom@fai.fr>  Fri, 04 May 2007 21:50:00 +0200
Recompiler et installer ffmpeg

On peut alors recompiler après avoir installé les paquets nécessaires à la compilation[3] :

# cd ..
# apt-get install liblame-dev libimlib2-dev libfaad-dev libsdl1.2-dev libfaac-dev libdts-dev libxvidcore4-dev texi2html dpatch libx264-dev libtheora-dev liba52-dev libgsm1-dev ccache libxvmc-dev
# apt-get -b source ffmpegcvs

La compilation peut durer 5 à 10 minutes. Il n'y a alors plus qu'à installer tous ces nouveaux paquets :

# dpkg -i ffmpeg_20070329-0.0.x11grab_i386.deb libavcodeccvs51_20070329-0.0.x11grab_i386.deb libavformatcvs51_20070329-0.0.x11grab_i386.deb libavutilcvs49_20070329-0.0.x11grab_i386.deb libpostproccvs51_20070329-0.0.x11grab_i386.deb libswscalecvs0_20070329-0.0.x11grab_i386.deb

Créer la vidéo en format FLV

La commande d'exemple de ffmpeg ne marche toujours pas, mais cette fois c'est parce qu'il faut spécifier les dimensions de l'écran ! Pour capturer l'intégralité de mon écran, il me faut exécuter :

$ ffmpeg -s 1152x864 -f x11grab -i :0.0 test.flv

où l'option -i indique quel serveur X et quel bureau utiliser (premier et deuxième zéro respectivement). On peut rejouer ensuite la vidéo avec ffplay ou tout lecteur de vidéo récent (mplayer bien sûr, mais aussi vlc, totem, etc.).

Pour afficher la vidéo dans une page web comme dans l'introduction de ce billet, le plus simple est d'utiliser un lecteur de FLV en format Flash SWF ! Il y a par exemple Fash Video Player et FlowPlayer. Le principe est que l'on déclare dans la page web un objet Flash, le lecteur, avec comme argument le nom du fichier FLV à jouer. Le lecteur s'occupe de gérer les boutons de lecture, arrêt, avance, etc.

Le code Html à ajouter dans la page web pour FlowPlayer par exemple est de ce type :

<object type="application/x-shockwave-flash" data="FlowPlayer.swf" 
	width="320" height="262" id="FlowPlayer">
	<param name="allowScriptAccess" value="sameDomain" />
	<param name="movie" value="FlowPlayer.swf" />
	<param name="quality" value="high" />
	<param name="scale" value="noScale" />
	<param name="wmode" value="transparent" />
	<param name="flashvars" value="config={videoFile: 'my-screencast.flv'}" />
</object>

Il faut bien sûr rendre le lecteur Flash FlowPlayer.swf accessible au même titre que la vidéo my-screencast.flv. Enfin, voilà qui ne surprendra pas les développeurs de pages web, il faut savoir que Internet Explorer de Microsoft ne reconnaît pas le code ci-dessus pourtant conforme aux standards du web ! On consultera How to correctly insert a Flash into XHTML sur ce sujet.

Note pour les utilisateurs de DotClear : pour insérer le code Html nécessaire dans un billet en gardant la syntaxe wiki si pratique, il faut utiliser la macro Html.

Enregistrer une fenêtre uniquement

Pour un tutoriel on n'a généralement pas besoin d'enregistrer tout l'écran mais seulement une fenêtre. Il faut pour cela connaître les coordonnées de la fenêtre que l'on souhaite enregistrer. L'article Screencasting with Linux nous indique que l'outil xwininfo nous permet d'accéder à ces informations en cliquant simplement dans la fenêtre d'intérêt :

$ xwininfo -frame
[...]
 Absolute upper-left X:  304
 Absolute upper-left Y:  29
[...]
 Corners:  +304+29  -0+29  -0-263  +304-263
 -geometry 848x572-0+29

On peut alors passer ces arguments à ffmpeg :

$ ffmpeg -s 848x572 -f x11grab -i :0.0+304,29 test.flv

On peut bien sûr mettre tout ceci dans un script screencast.sh que vous pouvez télécharger librement bien entendu. Une subtilité gênante de ffmpeg est qu'il faut que les largeur et hauteur de la zone à capturer soient des nombres pairs ! Il y a donc des tests qui ont dû être ajoutés dans le script.

Enregistrer le son

Cerise sur le gâteau, on peut aussi enregistrer le son avec l'image ! C'est encore une affaire d'options, par exemple pour enregistrer en stéréo :

$ ffmpeg -s 848x572 -f x11grab -i :0.0+304,29 -f audio_device -ac 2 -i /dev/dsp test.flv

Il faut toutefois que la carte audio accepte la fréquence d'échantillonnage et la résolution demandée par défaut par ffmpeg et qui doit être de 16 bits / 48 kHz. Dans le cas contraire, il faut ajouter des options pour spécifier des valeurs qui marchent (consulter la documentation de ffmpeg !).

Notez bien aussi que le périphérique audio spécifié (/dev/dsp) suppose que des pilotes audio type OSS[4] sont disponibles. Comme la plupart des Linux récents utilisent ALSA à la place, il faudra certainement ajouter les couches de compatibilité nécessaire. Sous Debian Etch il y a le paquet oss-compat et le paquet alsa-oss.

Autres méthodes

Il existe d'autres logiciels pour réaliser ce genre de vidéos, citons par exemple :

Notes

[1] il faut une version 7 ou supérieure de Flash pour lire les FLV

[2] ffmpeg peut capturer l'affichage de X11 (ndlr : c'est la version du serveur X)

[3] si ce n'était pas fait, la commande de compilation se plaindrait explicitement de ne pas avoir ces paquets-là

[4] l'ancien système audio Linux