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
  • Pingback: uberVU - social comments()

  • goom

    J’aime beaucoup le résultat notamment avec les effets 3D et le zoom qui ouvre pas mal de possibilité, je m’empresse de voir si ça fonctionne également avec Mandriva !

  • http://blog.nicolargo.com NicoLargo

    @goom: tiens moi aucourant si le script marche en l’état, sinon je suis preneur des modifs pour faire une version mandriva dans le SVN.

  • http://ofaurax.free.fr/ Olivier FAURAX

    Merci pour l’astuce, ça donne envie de faire un vrai truc en utilisant le wrapper python.

    Sinon, y a beaucoup de pubs sur ton blog.
    J’ai cliqué pour être sympa, mais y en a un bon paquet…

  • http://blog.nicolargo.com NicoLargo

    @Olivier: l’idée de faire un développement Python est bonne, reste à trouver les développeurs :)

    Pour la pub, il faut que je fasse le ménage, effectivement. Mais je suis en pleine refonte du blog avec un nouveau théme…

  • http://tweekers.free.fr/blog Mathieu

    Pas mal tout ça :)
    Maintenant la question que je me pose depuis un petit moment est : comment faire un livecast sans avoir a faire de configuration particulière sur un routeur ?
    J’avais publié il y a un moment sur mon blog un billet sur la manière de diffuser un livecast avec VLC mais s’il y a des ports à ouvrir et à rediriger, c’est n’est pas très pratique…
    Pour le boulot je suis amené a utiliser un serveur Red5 qui pourrais faire ça; le problème étant qu’il utilise le protocole rtmp et nécessite un client en Flash, pas génial donc. Ceci dit, si c’est la seule solution qui marche je suis preneur, seul le résultat compte et Red5 reste un outil Open Source.

  • http://blog.nicolargo.com NicoLargo

    @Mathieu: pour faire un livecast, tout dépend de ton infrastructure réseau. Un solution envisageable est d’utiliser la combo suivante:

    GSTREAMER -> ICECAST -> FLUMOTION

    GSTREAMER sur la machine devant faire le screencast live (attention, comme il faut un encodage en temps réel il faut une machine puissante et/ou réduire le nombre d’image par seconde ou la résolution).

    ICECAST sur la machine faisant le screencast ou directement sur le serveur FLUMOTION. En utilisant un pipeline du type:
    … ! shout2send ip=@serveuricecast port=8000 password=monpass mount=screencast.ogv

    FLUMOTION sur un serveur accessible depuis Internet (sur un seul port TCP/80 par exemple) qui va diffuser le livecast vers les utilisateurs.

  • http://tweekers.free.fr/blog Mathieu

    Merci, je vais essayer ces outils :)
    J’avais jamais encore testé Icecast, sinon comme serveur pour diffuser des flux j’ai essayé Glovesoap qui est pas mal.

  • http://www.cynapsys.de Hamadi MESSOUD

    Bonjour,
    je travaille actuellement sur un projet qui utilise la bibliothèque Gstreamer, donc je suis en train d’ecrire un programme en C qui demultiplixé uf flux mpegts en utilisant gstreamer pour demultiplixer le flux et afficher l’image et le son d’un programme TV qui se trouve dans le flux. J’ai un probleme lorsque je vai augmenter ou deminuer le volume il faut que la partie d’affichage reste en etat Playing alors que je doit modifier uniquement la proprieté volume de l’element VOLUME. Est ce que on peut modifier une proprieté d’un elemnt en etat d’exécution dans une pipeline Gstreamer? c’est un projet IPTV donc le volume doit etre modifier en utilisant une telécommande qui envoi un signal asynchrone au recepteur et puis mon programme prend cette interruption je pense en charge.

    Merci beacoup :)

  • http://blog.nicolargo.com NicoLargo

    @Hamadi: la réponse est oui, le volume est un des éléments de configuration que l’on peut modifier dynamiquement même quand la pipeline est en état PLAYING.

    Quelques pistes:
    http://ooboontoo.blogspot.com/2008/03/gstreamer-with-python-in-qt-learning-by.html
    http://www.jonobacon.org/2006/08/28/getting-started-with-gstreamer-with-python/

  • http://www.cynapsys.de Hamadi MESSOUD

    @Nicolargo: Merci beaucoup pour ta reponse et je vai chercher dans ces lien. Et merci beacoup une autre fois pour ce blog :)

  • http://www.cynapsys.de Hamadi MESSOUD

    Bonjour, je reussi à ecrire un programme C qui implemente une interface avec GTK qui pelmet de lancer le pipeline (play), fermer le pipeline( stop), augmenter ou diminuer le volume pour un flus mppegts.
    mon 2eme etape est d’afficher le subtitle ‘un programme qui se trouve dans le flux ( puisque un flux mpegts peu comprenne video, audio et texte)
    est ce que gstreamer peut prendre en compte le texte(subtitle) et l’afficher ?

  • http://sylvain.naud.in Sylvain

    Je viens de tester très rapidement sous Fedora, il est super ton script !!

    Bon je pense que je ne vais pas laisser forcément le retour webcam à chaque fois par contre :P

    J’y verrai bien l’ajout du lancement de key-mon (http://code.google.com/p/key-mon/) projet assez actif en ce moment.

    Librement,
    Sylvain

  • http://blog.nicolargo.com NicoLargo

    @Sylvain, je viens d’ajouter la fonction dans la version 0.8 du script. Pour activer key-mon lors du screencast, il faut lancer le script avec l’option -k.

    A+ et merci pour l’info !

  • http://www.cynapsys.de Hamadi MESSOUD

    bon soir
    je veux savoir quelle est le plugin necessaire dans gstreamer qui permet d’afficher le teletext et le sous-titre d’une chaine TV.
    est ce que c’est possible ou nn avec gstreamer d’afficher le sous titre et le teletext?

  • http://blog.nicolargo.com NicoLargo

    @Haladi MESSO: à ma connaissance, il n’y a pas de plugin gstreamer prenant en compte le télétext. Mais il existre déjà des plugins permettant d’afficher du texte en sur-impression d’une vidéo. Donc il ne reste plus qu’a poser la question sur la mailing list gstreamer-dev…

  • http://www.cynapsys.de Hamadi MESSOUD

    bonjour,

    plugin gstreamer pour le decodage et l’affichage du sous-titre?

  • http://blog.nicolargo.com NicoLargo
  • http://www.cynapsys.de Hamadi

    Bonjour

    je veu savoir est ce que les proprietés d’un element gstreamer est modifiables dynamiquement? (udpsrc pour modifier le groupe multicast par exemple, mpegtsdemux pour modifier le program-number…)

    Merci

  • http://blog.nicolargo.com NicoLargo

    @Hamadi: certains oui, d’autres non… Il suffit de lire la documentation de l’élément en question:

    http://www.gstreamer.net/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-udpsrc.html

  • http://www.cynapsys.de Hamadi MESSOUD

    @nicola :
    voilà ma pipeline:
    gst-launch udpsrc uri=udp://239.100.0.0:1234 ! mpegtsdemux name=demux program-number=12060 ! queue ! mpeg2dec ! ffmpegcolorspace ! xvimagesink demux. ! queue ! mad ! audioconvert ! audioresample ! volume volume=4 ! alsasink

    je codé cette pipeline dans un programme C et je définie uri, volume et program-number comme variables globales qui peuvent être modifié à partir d’un autre programme C. pour le volume je trouve pas de problème le pipline en état PLAYING et je peux augmenter ou diminuer le volume par contre lorsque je veu quitter un groupe multicast pour joindre un autre en modifiant l’adresse IP du groupe et le program-number du chaine je me trouve dans le cas où il faut arreté la pipline (set_state_NULL) et le redemarrer avec les nouveaux valeurs. Donc est ce que c’est possible de modifier ce 2 valeurs lorsque la pipeline en etat PLAYING?
    Merci Nicola.

  • http://blog.nicolargo.com NicoLargo

    @Hamadi: si tu veux joindre un autre groupe multicast il faut automatiquement arrêter la pipeline et la redémarrer. En effet, il faut que le plugin udpsrc reface un “join” multicast sur le nouveau groupe. Ce n’est pas une limitation de gstreler mais des couches réseaux qui sont en dessous…

  • http://www.cynapsys.de Hamadi MESSOUD

    @Nicola:

    Merci beacoup :)

  • vincent

    Salut,

    Super le script, et bonne idée la fenêtre vidéo + screencast!

    Je voulais te demander si tu connais un plugin gstreamer capable de mettre côte à côte deux vidéos? à l’image de “adder” qui permet de superposer deux sons.

    Merci bien, et keep up the good work :)

  • http://www.nicolargo.com NicoLargo

    @vincent: tu peux regarder du coté du plugin videomixer (il y a un exmple dans ce billet: http://blog.nicolargo.com/2009/04/gstreamer-aime-les-cameras-ip-axis.html)

  • vincent

    Salut,

    Merci pour ta réponse. C’est nickel!

    Bonne journée.

  • Nicolas Martin

    Salut,
    merci pour cet article

    3 ans après ? ce fameux super logiciel existe t’il ?