Changement du nombre d'images par seconde d'un film avec interpolation des mouvements

Qu'est-ce donc ?

Ce logigiel permet de changer le nombre d'images par seconde d'un flux video progressif. Il fait appel aux mjpegtools  ( http://mjpeg.sf.net ). A l'inverse de yuvfps, qui ne fait qu'ajouter ou enlever des trames, yuvmotionfps calcule les trames intermédiaires en interpolant le mouvement des objets entre les trames, en utilisant un algorithme ressemblant à celui de compensation des mouvements du standard MPEG.

Mise à jour (14 Avril 2005)

Nouvelle version 1.6 qui corrige plein de bugs.
Grosse améliorations aux bords de l'image, détection des changements de scènes, calcul exact du nombre d'images par seconde en sortie, et plein de paramêtres a bidouiller.
Tous les formats 4:2:0 ainsi que 4:1:1 sont pris en compte; je recherche toujours des testeurs, si il y a encore un bug,  dites le moi 
  Vous pouvez le recupérer ici: yuvmotionfps-1.6.tgz !!!!
Pour installer :
./configure && make && make install

Comment ca marche ?

Ca sera plus facile à comprendre avec un exemple.
Disons qu'on veut convertir un film à 2 images/seconde en film à 3 images/seconde.
Le film en entrée resemble à ça:

Input film frame 1 Input film frame 2 Input film frame 3

Si on utilise yuvfps pour changer les nombre d'images/seconde, ça va simplement copier certaines trames, ce qui rend le mouvement saccadé, comme ci-dessous:

Input film frame 1 Input film frame 1 Input film frame 2 Input film frame 3

En fait, si on regarde ce qui doit se passer réellement (en fonction du temps) ca donne quelque chose comme ca:

Time = 0 Time = 1 Time = 2
Input film frame 1 Input film frame 2 Input film frame 3
Time = 0 Time = 2/3 Time = 1+1/3 Time = 2
Output Frame 1 = Input Frame 1 Unknown Frame 2 (Interpolated) Unknown Frame 3 (Interpolated) Output Frame 4 = Input Frame 3

C'est ici qu'on fait le tour de magie: yuvmotionfps va calculer le mouvement des différents objets dans l'image, et interpoler les trames correspondantes.
Par exemple, au temps = 2/3, la trame de sortie sera un mélange de la trame 1 et de la trame 2 comme ci-dessous:

Time = 0 Time = 2/3 Time = 1
Input film frame 1 Intermediate Calculation Input film frame 2

Le mouvement du ballon (le point rouge) entre le moment t=0 et t=1 est calculé (flèche verte). Pour calculer la position du ballon au temps t=2/3, on interpole simplement: position(t=2/3)=position(t=0)+2/3*mouvement(0->1).

Le résultat final est une approximation très propre de la trame telle qu'elle aurait été prise, comme ci-dessous:

Time = 0 Time = 1 Time = 2
Input film frame 1 Input film frame 2 Input film frame 3
Time = 0 Time = 2/3 Time = 1+1/3 Time = 2
Output Frame 1 = Input Frame 1 Output Frame 2 (Interpolated) Output Frame 3 (Interpolated) Output Frame 4 = Input Frame 3

Voila ! on a maintenant un mouvement très fluide. Alors sortez vos vieilles vidéos super 8 à 18 images/secondes et convertissez les en film a 24 images/secondes!

Non, il doit y avoir un truc !

OK, il y a quelques trucs à savoir... Tout d'abord, c'est du code plutôt recent, donc il peut y avoir quelques bugs. Deuxièmement, il ne faut pas espérer avoir la même qualité que si le film avait été filmé directement au nombre d'images/seconde de sortie. Il peut y avoir des artefacts (des carrés), et/ou des blocs mal mélanges, ce qui peut rendre les parties en mouvement un peu floues; je vous rassure, c'est quand même très rare en utilisant les bons paramètres. L'estimation des mouvement est vraiment lente.

Je veux l'utiliser pour convertir des films (24fps) en NTSC-video (29.97fps)  ? (FILM<->NTSC)

Nooooon ! Pour cela, il vaut mieux utiliser Téléciné ou 3:2 pulldown. C'est fait pour ça, et en plus c'est un processus réversible: le lecteur de DVD "progressive scan" sera capable de reconstruire le film original à 23.97 fps en utilisant le processus d'"Inverse Telecine".

Puis-je utiliser ca pour faire de la conversion Film (24fps) vers PAL (25fps) ? (FILM<->PAL)

Je serais tempté de répondre non à cette question, parce que yuvmotionfps va interpoler la plupart des trames, ce qui revient à perdre la plupart des trames originales (plutot mauvais). Les 2 méthodes classiques sont d'accélerer le film par un facteur 25/24, c'est à dire environ 4%; evidemment, il faut accélerer la piste son aussi. L'autre méthode est de répliquer une trame sur 24, ce qui peut donner des sacades (en particulier durant un travelling), mais qui passe inaperçu la plupart du temps (c'est comme ca que font les DVDs). Franchement, faites comme vous voulez.

Je veux convertir des films 8mm ou Super 8 (18fps) en film (24fps) 

C'est l'outil ideal pour ca. Une fois de plus, ça n'est pas  génial pour archiver les films (à cause de l'interpolation), mais pour les visionner sur des systèmes conventionnels, c'est super.

Je veux convertir mes videos PAL en NTSC ou vice-versa ? (NTSC<->PAL)

Ca marche bien, à un detail près: il faut faire attention a l'entrelacement. yuvmotionfps ne traite que les flux videos progressifs, donc pour les videos entrelacées, je suggère d'utiliser yuvdeinterlace avant. Vous trouverez yuvdeinterlace dans le CVS des mjpegtools, ou la version 1.7.0 quand elle sera sortie.

Super, je peux le télécharger où ?

Je fournis un paquet tar.gz, il faut aussi un version récente des mjpegtools (CVS ou 1.7.0 quand elle sera sortie)

Les paquets se trouvent ici

Mais ça ne fait pas <blah_blah>

C'est distribué sous licence GPL, alors vous pouvez le faire vous-même !


Jerome Cornet

Valid XHTML 1.0! Last modified: Thu Apr 16 19:10:44 EDT 2005