Concaténation de fichiers .avi

Je me suis trouvé aujourd’hui confronté au problème suivant : créer un unique fichier vidéo à partir de trois fichiers distincts, tous encodés avec le même codec vidéo mais possédant des caractéristiques audio différentes en termes d’échantillonnage, de bitrate et de volume sonore. Le tout sans transcoder la vidéo et donc sans perte de qualité de ce côté. Voici une procédure simple à suivre pour qui se trouverait dans une situation similaire.

Extraction et normalisation de la piste audio

Le premier problème à résoudre est l’harmonisation du volume des trois fichiers. En effet, si l’on concatène des fichiers contenant des pistes audio à des volumes différents, le fichier résultant présentera des sautes de volume (nul n’a envie de sauter sur sa télécommande pendant un visionnage lorsque le volume augmente brutalement, n’est-ce pas ?). Nous allons donc extraire la piste audio de chacun des trois clips afin de pouvoir en régler le volume, ce qui nous permettra au passage de modifier l’échantillonnage à la même valeur pour toutes les pistes.

ffmpeg -y -i fichier1.avi -vn -acodec pcm_s16le -ac 2 -ar 48000 fichier1.wav
wavegain --apply fichier1.wav

Ici, nous utilisons la commande ffmpeg pour extraire la piste audio de fichier1.avi au format WAV, avec un taux d’échantillonnage de 48 kHz et en stéréo (2 canaux). Puis nous normalisons le volume de cette piste à l’aide de la commande wavegain, qui implémente l’algorithme ReplayGain (en gros, ça consiste à augmenter le volume autant que possible sans atteindre la saturation).

Réintégration de la piste audio dans les clips

ffmpeg -y -i fichier1.avi -vcodec copy -an fichier1-nosound.avi ffmpeg -y -i fichier1-nosound.avi -i fichier1.wav -acodec copy -vcodec copy fichier1-wav.avi

La première commande crée un fichier ne contenant que la piste vidéo du clip. La seconde fusionne ce dernier avec la piste audio normalisée créée à l’étape précédente.

Concaténation des fichiers .avi

Après avoir procédé de même avec les autres clips, on les fusionne avec les commandes suivantes :

cat fichier1-wav.avi fichier2-wav.avi fichier3-wav.avi > tmp.avi
ffmpeg -i tmp.avi -vcodec copy -acodec libmp3lame -ar 48000 -ab 128k -ac 2 fichier-final.avi

Cela appelle quelques commentaires :

  • La première ligne ne fait que mettre bout à bout les 3 fichiers. Même si le format AVI supporte assez bien cette opération, il y aurait encore quelques manipulations à effectuer pour en faire un .avi correct, notamment au niveau de l’indexation. Ici on s’en passe car ffmpeg le fera automatiquement par la suite.
  • Les 3 clips initiaux contiennent des pistes audio au format WAV qui n’est pas compressé et est donc très lourd.
  • La seconde ligne va donc transcoder la piste audio du format WAV au format MP3 en stéréo, avec un bitrate de 128k et en conservant le taux d’échantillonnage de 48 kHz. Au passage, elle crée en sortie un fichier .avi correct.

On notera qu’à chaque étape de la procédure, la partie vidéo est traitée avec l’option -vcodec copy de ffmpeg, ce qui signifie que cette piste est simplement copiée et non transcodée. Il n’y a donc aucune perte de qualité par rapport à l’original.

Notes

Une autre façon de procéder peut venir à l’esprit : concaténer les fichiers audio, puis les fichiers vidéo et enfin fusionner les deux fichiers résultants. Mauvaise idée, car les fichiers audio ré-échantillonnés peuvent être plus courts ou plus longs de quelques dixièmes de secondes par rapport à leur vidéo d’origine (une histoire d’arrondi). Mis bout à bout, on peut arriver à une désynchronisation sensible entre audio et vidéo. En procédant comme ci-dessus on repart d’une synchronisation correcte à chaque début de clip.

Les valeurs de bitrate et de taux d’échantillonnage (ici 128k et 48kHz) doivent correspondre aux valeurs maximales de l’ensemble des clips. Inférieures, certains clips perdraient en qualité. Supérieures, cela alourdirait la taille des fichiers et le temps de traitement sans aucun gain en qualité finale.

Les commentaires sont clos.