Artisan Numérique

/système/vidéo/matroska/mpeg/ Changer la bande son d'une vidéo

Le monde libre est d'une extrême richesse en général, et plus particulièrement s'agissant d'outil pour manipuler des sources audio ou vidéo. Cas d'école s'il en est, il y a quelques jours un ami nous a envoyé un petit film que nous allions visionner pendant le réveillon.

Je lui avait demandé de produire un fichier MPEG2 de sorte à pouvoir l'injecter tranquillement sur la freebox. Et son montage, un bêtisier des arts martiaux, était d'une telle drôlerie qu'il m'a donné envie de jouer avec Audacity pour y ajouter une bande son. L'occasion de mettre pour la première fois la main dans ce merveilleux outil et de voir comment faire pour remplacer l'audio sans toucher à la vidéo.

Dé-multiplexage

Pour faire simple, un fichier vidéo (MPEG, VOB, AVI, MKV, etc...) est un conteneur de flux, par exemple un flux MP3 pour le son et DIVX pour la vidéo. Chaque technologie de conteneur est caractérisé par le nombre et le type de flux qu'il peut intégrer. Ainsi un conteneur AVI ne peut (au plus simple) n'intégrer qu'un flux vidéo et un flux audio tandis qu'un conteneur matroska (MKV) peut contenir un nombre arbitraire de flux audio, vidéo et sous-titre. Et généralement les conteneurs se moquent de la manière dont sont encodés ces flux.

Pour stocker ces flux, en interne, le conteneur est découpé en frames, disons 25 par secondes ce qui fait qu'une frame dure 40ms. Dans chacune de ces frames se trouvent, à la queue leu leu, 40ms de chacun des flux que le conteneur contient. S'agissant du VOB d'un DVD, il y aura ainsi 40ms de vidéo, plusieurs bouts de 40ms d'audio (un par langue et type d'encodage) et une série de bouts de sous-titrage. Cette manière d'enchevêtrer l'information par frame s'appelle le multiplexage.

Pour remplacer la bande son de la vidéo d'origine, il va donc falloir dé-multiplexer les flux du conteneur. Chaque conteneur à son outil spécifique pour faire ce travail, s'agissant de la norme MPEG, nous pouvons utiliser mpeg2desc. Pour Mandriva, cet utilitaire est contenu dans le paquet dvdauthor. Son utilisation pour un fichier source.mpeg est la suivante :

Démultiplexage du flux vidéo
gastonmpeg2desc -s -v 0 -o source.m2v < source.mpeg > /dev/null

Démultiplexage du flux audio
gastonmpeg2desc -s -a 0 -o source.mp2 < source.mpeg > /dev/null
démultiplexage de l'audio et de la vidéo

Le chiffre 0 utilisé en paramètre indique à la commande de prendre le premier flux audio (puis vidéo) qu'elle trouvera dans le conteneur. Après un certain temps, vous obtenez vous deux fichiers, ou flux, dé-multiplexés.

Création de la bande son

L'idée est d'exploiter avec audacity la bande son originale que nous venons de dé-multiplexée. Pour cela il suffit de lancer l'outil et d'y faire un simple glisser-déposer du fichier source.mp2. Parallèlement, nous allons ouvrir la vidéo avec kino pour avoir une visualisation des calages temporels.

Tout le jeu consiste ensuite à repérer avec kino la position temporelle des scènes à sonoriser, de choisir un morceau de musique, de l'ajouter en tant que nouvelle piste dans audacity par glisser-déposer, de positionner sur cette piste le curseur à la position temporelle de la scène, et d'utiliser l'option Pistes/Aligner les pistes/Aligner sur le curseur pour caler le démarrage de la musique à cette position. Après il est possible d'ajouter des effets à la nouvelle piste ainsi que de baisser le volume ou de réduire au silence la portion équivalente sur la piste de l'audio d'origine.

Régulièrement il est possible de tester la nouvelle piste son avec la vidéo, en utilisant l'export en WAV d'audacity, puis en allant dans la section "effets" de kino pour, sur les effets audio, sélectionner un "doublage" et choisir le fichier wav généré. La fenêtre de pré-visualisation de l'effet permet alors de se déplacer dans la vidéo et de vérifier que vos calages sont bons.

Une fois que la sonorisation est terminée, il suffit de générer une dernière fois le fichier WAV au même endroit que source.mp2, par exemple sous le nom nouvelle-bande-son.wav.

Compression de l'audio

Une fois le fichier WAV généré, il nous faut le compresser, par exemple en MP2 :

gastonmp2enc -o nouvelle-bande-son.mp2 < nouvelle-bande-son.wav
INFO: [mp2enc] Opened WAV file, freq = 48000 Hz, channels = 2, bits = 16
INFO: [mp2enc] format = 0x1, audio length = 387294328 bytes
INFO: [mp2enc] SpF=672, frac SpF=0.000, bitrate=224 kbps, sfreq=48.0 kHz
INFO: [mp2enc] System is little endian
INFO: [mp2enc] Num frames 84048 Avg slots/frame = 672.000; b/smp = 4.67; br = 224.000 kbps
INFO: [mp2enc] Encoding to layer 2 with psychoacoustic model 2 is finished
INFO: [mp2enc] The MPEG encoded output file name is "nouvelle-bande-son.mp2"
Compression de la bande son

Nous voilà donc avec une nouvelle bande son qui doit normalement être à peu prés de la même taille que celle d'origine (source.mp2).

Re-multiplexage

Pour ne rien perdre en qualité d'image, nous n'allons évidemment pas ré-encoder le flux vidéo d'origine mais simplement le re-multiplexer avec la nouvelle bande son :

gastonmplex -M -V -f 8 -O 0 source.m2v nouvelle-bande-son.mp2 -o nouvelle-video.mpeg
INFO: [mplex] mplex version 1.9.0 (2.2.7 $Date: 2006/02/01 22:23:01 $)
INFO: [mplex] File source.m2v looks like an MPEG Video stream.
...
INFO: [mplex] VIDEO STREAM: e0
INFO: [mplex] Frame width     : 720
INFO: [mplex] Frame height    : 576
INFO: [mplex] Aspect ratio    : 4:3 display
INFO: [mplex] Picture rate    : 25.000 frames/sec
INFO: [mplex] Bit rate        : 7500000 bits/sec
INFO: [mplex] Vbv buffer size : 229376 bytes
INFO: [mplex] CSPF            : 0
INFO: [mplex] Scanning for header info: Audio stream c0 (nouvelle-bande-son.mp2)
INFO: [mplex] MPEG AUDIO STREAM: c0
INFO: [mplex] Audio version  : 1.0
INFO: [mplex] Layer          :        2
INFO: [mplex] CRC checksums  :       no
INFO: [mplex] Bit rate       :    28672 bytes/sec (224 kbit/sec)
INFO: [mplex] Frequency      :     48000 Hz
INFO: [mplex] Mode           :        0 stereo
INFO: [mplex] Mode extension :        0
INFO: [mplex] Copyright bit  :        0 no copyright
INFO: [mplex] Original/Copy  :        0 copy
INFO: [mplex] Emphasis       :        0 none
...
INFO: [mplex] MUX STATUS: no under-runs detected.

Conclusion

Et voilà, c'est terminé, notre nouvelle vidéo est prête à l'usage sans perte de qualité et ni de temps de ré-encodage. Cette approche a beau être illustrée par l'exploitation d'un conteneur spécifique (MPEG2), la logique en elle-même, en utilisant les bons outils de dé-multiplexage/encodage/r-multiplexage, est reproductible pour tous les autres. Il est même possible de mixer les genres en dé-multiplexant par exemple du MPEG2 et en re-multiplexant les flux dans un conteneur matroska.