Journal Mettre ses parties en ligne !

Posté par  (site web personnel) . Licence CC By‑SA.
40
17
avr.
2017

Sommaire

Cher journal

Je suis venu te conter une histoire. Cette histoire est issue d'un désir coupable de frimer un peu.
Non, je n'ai pas réussi à faire quelque chose d'exceptionnel ou d'impossible comme inventer une ampoule qui dure 10 fois plus longtemps que toutes les autres.
Je souhaite juste montrer comment GNU/Linux, le système D et la philosophie OpenSource/libre/DIY peuvent permettre d'automatiser un processus de production vidéo.

Contexte:

Je suis développeur de Rolisteam. J'avais besoin de faire un peu la promotion du logiciel. De plus, en tant que maître de jeu, j'avais envie de garder une trace de ma campagne, histoire
d'en faire profiter d'autres gens.
L'enregistrement des parties en vidéo et audio nous a semblé la meilleure solution pour atteindre ces objectifs.

Le choix des outils:

Après une phase de recherche, mon choix s’est porté sur:

SimpleScreenRecorder (SSR)

Il est pratique, simple et la qualité vidéo est plutôt bonne. Le seul problème c'est l'enregistrement audio. Impossible d'enregistrer en même temps mon micro et
les voix de mes camarades à moins de configurer pulseaudio ou l'usage de Jack. Je n'avais pas envie de changer toute la configuration son de ma bécane. C’est peut-être facile à faire mais j’avais pas envie de me lancer la dedans. De plus, la qualité audio de SSR est moins bonne que Teamspeak (je trouve en tout cas).

Teamspeak:

Ok, ce n'est pas libre mais pour des raisons de qualité et d'habitude des joueurs, on est resté sur cette solution pour l'audio.

Les fruits de l’enregistrement

Grâce à ces outils, j'ai réalisé les enregistrements.
J'avais donc un fichier son et une vidéo par partie. Dans un premier temps, j'ai fusionné les deux fichiers avec ffmpeg pour obtenir la vidéo de la partie (avec le son).

ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4

Améliorer l’expérience visuelle

Souhaitant offrir une meilleure expérience pour les éventuels spectateurs, j'ai codé un plugin à teamspeak qui envoie sur dbus le statut de la voix de chaque joueur.

J'ai crée une application qui écoute ces messages dbus, quand le joueur parle, le portrait de son personnage s'affiche en couleur. Quand il est silencieux le portrait du personnage s'affiche en niveau de gris. Il m'a fallu plusieurs tests et étapes pour arriver à ce fonctionnel final.
Les joueurs ne voulant pas montrer leur visage par webcam. Cela semblait la meilleur solution de suivre facilement les conversations.

Vous trouverez le code ici: https://github.com/obiwankennedy/GameVisulisationHelper/tree/cops/display

Cette application a apporté une contrainte supplémentaire sur les vidéos. Le son et l'image doivent être synchronisés avec précision. Ce n’était pas le cas avant car les éléments de l’écran pouvait être en avance ou en retard par rapport à la voix, il n’y avait aucun repère visuel pour le remarquer.

Caler le son et l’image

J'ai d'abord pensé merger les deux fichiers dans un éditeur vidéo.
J'ai essayé PitiVi, OpenShot et Kdenlive. Les deux premiers agonisent dans d'atroces souffrances après le chargement de fichiers supérieurs à 3h. Kdenlive s'en sort mieux. Il n'agonise qu'une fois sur deux. J’ai installé les versions de ma distribution et j’ai fait de report de bug mais je pouvais pas attendre la résolution des problèmes.

Dans ce contexte, trouver le bon timing pour synchroniser l'audio sur l'image, c'est compliqué. Le drag and drop de fichier de 3h fait assez mal aux logiciels d'édition vidéo. Sans parler de la précision pour les déplacements. Bref, pas pratique.

Je me suis dit "c'est idiot, il faudrait synchroniser le début de l'enregistrement de l'audio et la vidéo".
Je n'ai pas le code source de Teamspeak mais il est possible de créer un plugin (ou de modifier celui que j'ai créé) et j'ai le code source de SimpleScreenRecorder (SSR).

J'ai donc décidé d'exposer l'API de SSR sur DBUS et mon plugin teamspeak envoie des commandes dbus. Vive Dbus !
En gros, j'ai étudié le code de SSR pour identifier la fonction qui démarre l'enregistrement. J'ai créé la petite tambouille pour l'exposer (ainsi que la fonction pour mettre l'enregistrement en pause) sur dbus.

Si vous voulez voir comment faire cela: http://renaudguezennec.eu/index.php/2011/03/10/introduction-a-dbus-avec-qt4/

Pour le coup, après quelques essais et des modifications sur l'ensemble des participants à l'affaire. J'ai une solution qui tourne bien. Je peux utiliser ffmpeg pour fusionner mes fichiers vidéos avec le son et cela correspond parfaitement.

ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4

Une étape d’accomplie

J'ai fait un pull request à l’auteur de SSR. Mon but était de montrer comment faire car l'auteur de SSR n'est pas formé à Dbus. Il est très intéressé mais clairement je n’ai pas le temps de généraliser l’usage de Dbus dans SSR, ni lui d’ailleurs.

Ma version est accessible ici : https://github.com/obiwankennedy/ssr
Ma pull request : https://github.com/MaartenBaert/ssr/pull/399

Montage des génériques

Après ces étapes, j'ai des vidéos de mes parties assez brutes. Idéalement, il me reste à ajouter un générique de début et de fin.

Pour le faire, j'ai fait un programme en QML avec deux animations qui se courent après. C'est pas jolie mais cela fait le job. Le générique dure ~10 secondes, je l’ai enregistré avec SSR aussi.
J'ai utilisé Kdenlive pour caler une musique libre dessus.

A la fin de cette étape, j'ai ma petite vidéo de générique de début, idem pour le générique de fin et mes épisodes (plus de 75).
Vous l'avez compris, l'étape ici est de créer des vidéos contenant les génériques.
J'ai cherché un peu dans ffmpeg pour arriver à cela. C'est une simple fonction de concaténation des vidéos.
J'ai écrit ma petite commande, ça marche.

cd /racine/des/videos/
OPENING=/chemin/vers/generique/debut.mp4
ENDING=/chemin/vers/generique/fin.mp4
video=/chemin/vers/videos.mp4
LIST_FILE=/tmp/mylist.txt
videoExtLess=\`echo $video | awk -F '.' '{print $1}'\`
echo "file '$OPENING'" > $LIST_FILE                                                                       
echo "file '$video'" >> $LIST_FILE                                                                        
echo "file '$ENDING'" >> $LIST_FILE
ffmpeg -safe 0 -f concat -i /tmp/mylist.txt ${videoExtLess}_avec_generiques.mp4

Du moins, je croyais que cela marchait. En vérité, cela cassait la synchronisation son/image. Ce fut très embêtant.
Je retourne à la case départ "logiciel de montage vidéo" (Kdenlive). Il y a un peu moins de manipulation précise à faire. Je colle les trois fichiers: générique de début, l’épisode, générique de fin et c'est parti.
Ça a fonctionné un temps.

Extraction du son et traitement

Une fois la vidéo complète avec les génériques. J'en extrait le son pour la diffusion en podcast, vraiment facile avec ffmpeg.

ffmpeg -i videos.mp4 -codec:a libmp3lame -qscale:a 2 output.mp3

Avant de sortir l'épisode en podcast, je le re-travaille un peu avec audacity pour supprimer les silences et pour normaliser le son (avec le filtre compresseur du logiciel).
Cela raccourcit l’épisode d’environ 30 mins et le son est bien meilleur.

Traitement sur la vidéo

Je souhaite effectuer les mêmes traitements sur les vidéos. J'ai bien lutté pour trouver une solution.

Normalisation

Pour la normalisation, j'ai trouvé un petit script python: ffmpeg-normalize.

ffmpeg-normalize -vu -p normalized-episode40.mp4 Episode_40.mp4

Supprimer les moments inutiles

Couper la vidéo quand il y a du silence fut bien plus complexe. Aucun logiciel de montage vidéo n'offre de filtre pour cela (je n'ai pas trouvé en tout cas) et j’allais pas le faire à la main. Cela m'aurait pris trop de temps.

J'ai donc cherché à droite à gauche et c'est Ryzz (Merci à lui) sur Linuxfr.org qui m'a envoyé vers une bonne piste: MoviePy

Un module python pour faire de l'édition vidéo. Il y a même un exemple utilisant MoviePy pour créer le résumé d'un match de foot grâce au son des supporters.

J'ai donc créé un script python pour couper les silences. J'en ai profité également ajouter les génériques avec MoviePy.
Quand mon script fut prêt j'avais déjà sorti 20 épisodes. J'en avais donc 40 en stock à refaire. J'ai donc lancer le script sur les 40 restant. Après 3 jours d’exécution. J'avais
tous mes épisodes prêts.

Si vous souhaitez voir le code du script et des explications techniques:
http://renaudguezennec.eu/index.php/2017/03/03/montage-video-en-python/

La réduction des silences est moins efficace qu’audacity mais il y a un gain indéniable.

Voilà, le degrés maximum que j’ai atteins dans l'automatisation.

Aller encore plus loin

Dans tout ce processus, il me manque encore des choses pour vraiment automatiser toute la chaîne.

Le premier point, c'est audacity. Il n'est pas possible d'utiliser audacity en ligne de commande. Je me suis un peu renseigné, il y a eu des tentatives mais c'est très complexe à mettre en place.
J'ai regardé un peu le code, espérant trouver un moyen d’appliquer les deux filtres dont j’ai besoin. Le code est peu lisible avec des define partout pour différencier les OS. Bref, un cauchemar à maintenir. Du coup, j’hésite à mis mettre vraiment ou rester en édition manuelle.

Ensuite, il me reste à automatiser la partie “mise en ligne” sur youtube et sur le wordpress.
Je suis certains que c’est possible mais pour l’instant, je n’ai pas pris le temps de le faire.

Si vous voulez voir le résultat:

Le wordpress pour écouter les épisodes: http://blog.rolisteam.org/
La playlist youtube des épisodes : https://www.youtube.com/playlist?list=PLBSt0cCTFfS5fi3v1LtB9sfeA8opY-Ge1
Les premiers n’ont pas bénéficié de tous les outils. Il y a clairement une marque de progression dans les épisodes jusqu’à l’épisode 20 environ.

  • # Ce Titre

    Posté par  . Évalué à 10.

    "Mettre ses parties en ligne !"

    Je te préviens aimablement mais à la lecture de ce titre, je ne suis pas allé au delà. Tu es libre d'étaler ton intimité sur des sites spécialisés, mais ici ce n'est pas l'esprit.
    Les modérateurs devraient s'activer un peu.

    • [^] # Re: Ce Titre

      Posté par  . Évalué à -8. Dernière modification le 18 avril 2017 à 10:33.

      Oups, désolé, trompé de fenêtre.
      Vous pouvez moinsser à tout va.

    • [^] # Re: Ce Titre

      Posté par  . Évalué à 2.

      "Cachez ce sein que je ne saurais voir."
      "Vous me troublez dans mon être le plus intime, très chère."

      Signé, votre vierge éffarouchÉ.

  • # Mumble > Teamspeak

    Posté par  . Évalué à 7.

    C'est dommage mumble fait à mon avis mieux le taff que teamspeak… Et surtout il est libre.

    • [^] # Re: Mumble > Teamspeak

      Posté par  . Évalué à 3.

      Pour utiliser les deux, la qualité audio de teamspeak est bien meilleur. En particulier sur la gestion de l'écho.

      • [^] # Re: Mumble > Teamspeak

        Posté par  . Évalué à 2.

        Bizarre c'est pas mon ressenti. Après pour la gestion de l’écho je sais pas mes compagnons de jeux et moi même évitons d'utiliser des haut-parleurs quand on joue :-)

  • # OBS Studio

    Posté par  (site web personnel) . Évalué à 2.

    Sinon, il y a OBS Studio qui fait bien le job !
    Il est possible de configurer l'affichage de l'écran, et 2 entrées son (le micro et la carte son), du coup, plus de manipulations et tu as le son du micro et du jeu :)
    https://obsproject.com/

    • [^] # Re: OBS Studio

      Posté par  (site web personnel) . Évalué à 3.

      Cela aide pour le problème de synchro mais ce n’est pas le seul obstacle que j’ai franchi.

      Cela ne règle pas le problème de merge avec le générique, d’afficher des avatars en couleur quand les personnes parlent, et il faut quand même monter la vidéo pour couper les silences automatiquement.

      Je t’invite à faire un journal ou tu fournis le code pour faire tout cela avec OBS Studio. Cela fera avancer la cause.

    • [^] # Re: OBS Studio

      Posté par  (site web personnel) . Évalué à 1.

      J'ai testé OBS. Il y a des trucs vraiment sympa.
      L'aspect de configuration du visuel est vraiment sympa. Cependant le réglage audio est plus ardu pour rendre rien entendre niveau du micro.

      L'autre élément, un peu anecdotique c'est que les autres joueurs ne savent quand l'enregistrement commence. Cela n'est pas du tout le même rituel.
      Sur teamspeak, le logiciel prévient les autres "Enregistrement démarré". Cela semble anodin mais cela marque le début de la partie. Un peu comme les coups au théâtre, ou un lever de rideau.
      Après 5 heures d'enregistrement, l'ihm de OBS était toute figé. J'ai réussi a arrêté les enregistrements. Je n'ai pas pu ajuster les volumes en cours de parties.

  • # Audacity -> SoX ?

    Posté par  . Évalué à 3.

    Audacity en ligne de commande, c'est SoX non?

    Ca permet sûrement de normaliser et ça permet de découper en morceaux de 1 seconde (par exemple) dont le niveau sonore peut être analysé pour savoir s'il doit être considéré comme un silence.

    • [^] # Re: Audacity -> SoX ?

      Posté par  (site web personnel) . Évalué à 4.

      Oui, j'ai vu que cela existé mais je n'ai pas trouvé facilement de solution pour faire tous les traitements. C'est probablement possible mais un peu dur à trouver. Après j'y ai clairement pas passer des heures non plus.

      Audacity est vraiment sympa, il détecte tous les silences plus long que 0.2 secondes et les coupes pour faire 0.2 secondes.
      C'est bien pratique car le silence existe encore et on le recent mais c'est super court.

      Effectivement c'est à voir.

  • # cinelerra

    Posté par  . Évalué à 2.

    Pour le montage vidéo, tu peux utiliser cinelerra. C'est actuellement le meilleur logiciel libre de montage vidéo sous Linux.
    Il ne supporte pas beaucoup de format de sortie, aussi j'exporte en YUV non compressé, et j'encode en mp4 avec kdenlive. Mais apparemment la version 6, corrige ce problème.

    • [^] # Re: cinelerra

      Posté par  (Mastodon) . Évalué à 6.

      Le problème du montage vidéo sous linux c'est que c'est dur de trouver le logiciel qui combine ces 4 choses pour les gens qui n'ont qu'une utilisation sporadique (genre vidéo de mariage ou de vacances une fois ou 2 par an) :
      -courbe d'apprentissage pas trop pentue (exit blender)
      -qui ne crashe pas de façon aléatoire
      -qui offre plus de possibilité qu'un truc basique comme Windows Movie Player
      -qui importe/exporte dans les formats que tu veux (en gros un truc aussi versatile que ne l'est vlc dans les lecteurs vidéos).

      Je n'ai toujours pas trouvé.

      Bon je dis ça et il y'a aussi des gros projets commerciaux dont j'ai testé les démos et qui crashent parfois de façon aléatoire (hello Sony Vegas ou Corel Video Studio) mais j'imagine que les leaders du marché comme Adobe Première ou Final Cut Pro te permettent de bosser sans devoir reprendre ton travail x fois après autant de crash et d'exporter du premier coup ta vidéo dans ton format préféré.

      Au final j'ai toujours réussi à faire ce que je voulais mais au prix d'un grand nombre de frustrations et le test de x programmes différents dont aucun ne répondait entièrement à mes attentes finalement pas très poussées.

      • [^] # Re: cinelerra

        Posté par  . Évalué à 1.

        Je ne suis pas d'accord. Je pense que l'éditeur Vidéo de Blender est assez facile à prendre en main. C'est bien sûr une autre paire de manche si on veut utiliser l'ensemble des outils de Blender…
        De plus, on peut scripter en python pour automatiser certaines tâches ce qui pourrait rendre service dans le cas présenté plus haut.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.