ASYNC – Synchronisation des vidéos sur FFMPEG

Assez facile, vous me direz, de faire une synchronisation des prises de plusieurs caméras en ayant les waveforms affichés sur la timeline d’un logiciel de montage. Mais si jamais, dans le cas de la captation en 360°, où les images doivent être parfaitement synchronisé AVANT le stitching, vous passez par un logiciel de montage, cela s’avère inutile, ça peut même compromettre la qualité (ré-encodage, re-export…etc.) et alourdir le travail déjà bien chargé en post-production du 360°.

FFMPEG peut nous faciliter la tâche, notamment en utilisant la fonction -ss, qui va enlever ou rajouter en millisecondes les images inutiles/manquantes. Malheureusement aucune fonction n’est prévue pour faire la synchronisation, d’où l’idée d’en créer une.

Si vous voulez apprendre plus sur ffmpeg, suivez ce tutoriel : ffmpeg : Installation MacOS / Windows + Tutoriel

En se basant sur un filtre déjà existant, le AMIX qui, à la base, mixe plusieurs inputs en un seul output, le professeur Sébastien Roy a mis au point un filtre qui permet de créer une enveloppe sur chaque stream audio, de comparer les résultats entre les inputs et d’afficher les offsets qui peut y avoir par rapport à un fichier de référence, avec une précision de 0ms (c’est à dire parfaite !). Une fois les offsets définis, il suffit d’appliquer les valeurs avec ffmpeg en ajoutant l’option -ss.

Il est aussi possible de rajouter en input des fichiers .wav, par exemple un enregistrement provenant du Zoom H2N en mode Spatial Audio.

Bien que cette solution existe déjà avec un logiciel payant comme Plural Eyes (300$), les alternatives “libres” n’existent pratiquement pas. l’utilité de l’intégrer directement dans ffmpeg va grandement faciliter le workflow, la rapidité, l’amélioration du code (open source !). Au lieu d’avoir des logiciels pour faire plusieurs opérations, on peut centraliser la chaîne de production avec un seul logiciel, ffmpeg, telles que la synchro, le stitching et le rendu final pour le logiciel de montage.

Comme dans n’importe quel filtre, il y a évidement des limites ; notamment comparer un bruit de fond seulement ou des sources audios légèrement différentes vu la direction des micros. C’est pour cela qu’il faut toujours compter sur la bonne vieille technique du clap ! un son qu’on va produire au début de la prise, un son pour les unir tous ! Finalement, il vaut mieux protéger les micros avec du windscreen pour avoir un son avec le moins possible de bruit.

 

ASYNC

Ouvrez le terminal et tapez ces commandes :

git clone https://github.com/blobule/FFmpeg.git ffmpeg

(ceci va copier ffmpeg 3.4 sur votre machine dans le dossier ffmpeg)

si le répertoire existe déjà, choisir un autre nom.

cd ffmpeg

(accéder au dossier en question)

git merge origin/async

(appliquer les changements)

Si vous voulez aussi appliquer les modifications du filtre remap pour la déformation 4K 16/9 Superview au 4K 4:3 vu précédemment, faites :

git merge origin/remap

Il vous reste à configurer ffmpeg et faire un make. Suivre ce guide afin de compiler ffmpeg sur votre machine.

 

Guide d’utilisation

Comme pour tout filtre ffmpeg, ça prends des options pour configurer correctement la synchronisation.
Dans ASYNC, les options sont la précision (exprimée en hz), le nombre de sample et enfin déterminer le fichier référence.

les inputs peuvent être de n’importe quel format, que cela soit vidéo ou audio, 48Mhz ou 44.1Mhz.

Exemple (tout les calculs en 48 000Hz) :
ffmpeg -i video1.mp4 -i video2.mp4 -vn -filter_complex "[0:a][1:a] async=inputs=2:precision=1:duration=20.0:ref=0[out]" -map "[out]" -f null -
Explication :

-vn = enlever le stream vidéo, ceci va accélérer le traitement.
[0:a][1:a] = choisir le stream audio de chaque input.
precision=1 = une précision de l’ordre de 1ms. plus le chiffre est grand, plus cela sera moins précis. 1ms correspond à 48 Hz.
duration=20 = l’analyse va se faire sur 20 secondes, soit 20000 samples de 48 (précision de 1ms). Divisez par 48 000Hz, on trouve un total de 12 secondes. (20000×48/48000=20s) attention à ne pas dépasser les 20 000 samples, sinon la mémoire alloué pour le traitement va être dépassé et le programme n’affichera aucun résultat. Par exemple, pour 12 000 samples, la mémoire alloué est de 1125000 kbytes (1.12 GB).
ref=0 = on prends comme référence le premier input, 1 le deuxième …etc.
-f null – = la sortie est null, c’est plus le résultat sur l’écran qui compte. Pour les utilisateurs de Windows, remplacer par NUL

Si les 20 premières secondes de la vidéo ne matchent pas ou que la deuxième caméra se déclenche bien après les 20 secondes, il suffit de corriger avec un -ss avant l’input, c’est à dire avancer l’analyse d’un nombre de seconde choisit en -ss.

Résultat :
solution for input 0 and 1 : delta= 5654 = 220506 +/- 19 samples
histo 0- 1 5649 ( 4995ms +/- 0ms) : 3 
histo 0- 1 5650 ( 4996ms +/- 0ms) : 2 
histo 0- 1 5651 ( 4997ms +/- 0ms) : 5 
histo 0- 1 5652 ( 4998ms +/- 0ms) : 29 
histo 0- 1 5653 ( 4999ms +/- 0ms) : 1753 
histo 0- 1 5654 ( 5000ms +/- 0ms) : 13942 <====
histo 0- 1 5655 ( 5001ms +/- 0ms) : 110 
histo 0- 1 5656 ( 5001ms +/- 0ms) : 8 
histo 0- 1 5657 ( 5002ms +/- 0ms) : 0 
histo 0- 1 5658 ( 5003ms +/- 0ms) : 0 
histo 0- 1 5659 ( 5004ms +/- 0ms) : 0 
SYNC source 0 : 0.0 ms, use -ss 5.0001
SYNC source 1 : 5000.1 ms, use -ss 0.0000

Il y a donc exactement 5 secondes de différence entre le fichier référence et le deuxième fichier.
le 0ms représente la précision au millième de seconde prêt. Dans cet exemple, la précision est parfaite.
plus le chiffre à droite du tableau est haut, plus le match est parfait.

Synchroniser avec -ss

Tout ce qu’il nous reste à faire, c’est appliqué un -ss au deuxième input avec un + (rajouter 5 secondes) ou l’appliquer sur la vidéo référence pour enlever 5 secondes.

Le filtre nous suggère à la fin de l’analyse les différentes valeurs à appliquer en -ss pour chaque input, pratique quand on synchronise plus que 2 sources.

Vu que la fonction -ss n’est pas un filtre, il est possible d’accélérer le traitement en copiant tout simplement les streams audio et vidéo avec -c:v copy et -c:a copy, pour avoir des résultats quasi-instantanément.

ffmpeg -ss 5.000 -i video1.mp4 -c:a copy -c:v copy video1sync.mp4

 

 

n’hésitez pas à partager votre expérience par rapport à l’utilisation de ce filtre en vue de son amélioration.

Si jamais vous avez besoin d’aide, vous pouvez laisser un commentaire en bas de l’article avec, idéalement, une copie des messages générés par ffmpeg suite à l’exécution du filtre.

Emir C. Écrit par :

Soyez le premier à commenter

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *