Le HFR est une techno qui sera sûrement de plus en plus utilisée au cinéma dans les années à venir. Aujourd’hui beaucoup de télévisions récentes permettent d’obtenir un résultat similaire via une technique que l’on appelle « Motion Interpolation ». Ne possèdant pas de télé je me suis mis en quête de réaliser la même chose sur mon ordinateur.

Pour ceux qui ne savent pas ce qu’est le HFR et qui n’ont pas cliqué sur le lien précédent (les relous quoi), voici une explication simpliste.
Traditionnellement une œuvre cinématographique est composée de 24 images par secondes (24 FPS), c’est à dire qu’en une seconde 24 images défilent devant vos yeux.
Le HFR permet d’aller au-delà de cette limite de 24. Un exemple concret est la trilogie du Hobbit qui a été filmée en 48 FPS, mais pour en profiter il faut que votre salle de cinéma soit equipée pour, ce qui est encore rare.
Mais concrètement qu’est ce que ça change ? Les mouvements et les ralentis paraissent beaucoup plus fluides, l’effet de flou (motion blur) est beaucoup moins important.

La technique dite de Motion Interpolation (ou Frame Interpolation) consiste à augmenter logiciellement le nombre de frames d’une vidéo, évidemment le résultat final n’est pas aussi bien qu’une vidéo filmée en HFR. La manière la plus naïve de faire c’est de calculer la différence entre deux frames et de l’interposer, dans la pratique les algorithmes sont beaucoup plus complexes (prise en compte des mouvements, par exemple)…

Source: https://www.cnet.com/tech/home-entertainment/what-is-refresh-rate/
Source: https://www.cnet.com/tech/home-entertainment/what-is-refresh-rate/

Pour illustrer cet article j’ai téléchargé le trailer de Mad Max 4 sur trailers.apple.com. (Pour ceux qui se demandent comment, youtube-dl)

Pour réaliser tout ça il faut installer pleins d’outils (tous gratuits). J’utilise un Mac donc je vais décrire le process d’installation uniquement pour OS X. Pour Linux les outils sont les mêmes, il faut juste adapter les commandes. Bien sûr tout se passe dans le Terminal…

Xcode

On commence par installer les outils de devs, soit on passe par cette daube de Mac App Store et on télécharge Xcode, soit on utilise le Terminal.

xcode-select --install

Homebrew

La plupart des outils sont disponibles via Homebrew, donc on l’installe.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

x264 & ffmpeg

On commence par installer x264 et ffmpeg.

brew install x264 --with-mp4=l-smash ffmpeg --with-libass

ffms2

Pour VapourSynth on aura besoin de ffms2

git clone https://github.com/FFMS/ffms2.git
cd ffms2
./configure
make
sudo make install

VapourSynth

D’abord on installe Python 3 et cython.

brew install python3
sudo pip3.4 install cython

Ensuite, soit on télécharge la dernière version stable (fichier .zip) et on la décompresse, soit on prend la version de dev.

git clone https://github.com/vapoursynth/vapoursynth.git
cd vapoursynth
./autogen.sh
./configure
make
sudo make install
python3 setup.py build
sudo python3 setup.py install

MVTools

Lui il est un peu relou, pas réussi à le compiler avec clang, du coup faut installer gcc…

brew install gcc fftw
git clone https://github.com/dubhater/vapoursynth-mvtools.git
cd vapoursynth-mvtools
export CC=/usr/local/bin/gcc-4.9
export CXX=/usr/local/bin/g++-4.9
./autogen.sh
./configure
make
sudo make install

Et voilà on a tout, maintenant on peut passer aux choses sérieuses. Pour ça on va avoir besoin du script suivant.

import vapoursynth as vs
core = vs.get_core()

core.std.LoadPlugin("/usr/local/lib/libffms2.dylib")
core.std.LoadPlugin("/usr/local/lib/libmvtools.dylib")

clip = core.ffms2.Source(source="mm.mov")
clip = core.std.AssumeFPS(clip, fpsnum=24000, fpsden=1001) # Currently has to be hard-coded

sup = core.mv.Super(clip, pel=2, hpad=0, vpad=0)
bvec = core.mv.Analyse(sup, blksize=8, isb=True, chroma=True, search=3, searchparam=1)
fvec = core.mv.Analyse(sup, blksize=8, isb=False, chroma=True, search=3, searchparam=1)

clip = core.mv.FlowFPS(clip, sup, bvec, fvec, num=0, den=0, mask=2)

clip.set_output()

N’oubliez pas de changer le nom du fichier vidéo source au début du script (mm.mov)… Ensuite on sauvegarde le fichier sous le nom mi.vpy par exemple.

Finalement il ne reste plus qu’à lancer l’encodage, pour ça la ligne suivante fera l’affaire.

vspipe mi.vpy - --y4m | x264 --crf 18 --profile high --level 4.1 --ref 4 --colormatrix bt709 --output "mm-48.mkv" --demuxer y4m --stdin y4m -

Vous pouvez moduler les options de x264 comme bon vous semble, c’est juste un exemple… Le résultat final est visible ci-dessous (sans piste audio).

Bizarre quand on n’est pas habitué…

Si vous utilisez mpv comme lecteur vidéo il est possible d’utiliser le bridge VapourSynth pour le faire à la volée, à condition d’avoir une machine suffisament puissante.
Cette technique est différente de l’option smoothmotion déjà présente dans mpv.

On commence par modifier le script.

import vapoursynth as vs
core = vs.get_core()

core.std.LoadPlugin("/usr/local/lib/libffms2.dylib")
core.std.LoadPlugin("/usr/local/lib/libmvtools.dylib")

clip = video_in

if not (clip.width > 1920 or clip.height > 1080 or container_fps > 59):
    clip = core.std.AssumeFPS(clip, fpsnum = int(container_fps * 1e8), fpsden = int(1e8))
    sup  = core.mv.Super(clip, pel=2, hpad=0, vpad=0)
    bvec = core.mv.Analyse(sup, blksize=16, isb=True , chroma=True, search=3, searchparam=1)
    fvec = core.mv.Analyse(sup, blksize=16, isb=False, chroma=True, search=3, searchparam=1)
    clip = core.mv.BlockFPS(clip, sup, bvec, fvec, num=60000, den=1001, mode=3, thscd2=12)

clip.set_output()

Ensuite on édite le input.conf de mpv.

nano ~/.mpv/input.conf

Et on rajoute la ligne suivante (mettez la touche que vous voulez…)

N vf toggle vapoursynth=/chemin/vers/mi.vpy

Finalement on recompile mpv pour activer le support de VS.

git clone https://github.com/mpv-player/mpv.git
cd mpv
./bootstrap.py
PKG_CONFIG_PATH=/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/pkgconfig/ ./waf configure
./waf build
sudo ./waf install

Voilà maintenant y a plus qu’à presser la touche que vous avez choisi et profiter.

Alors bien sûr c’est moins pratique qu’une télévision déjà equipée mais pour les geeks comme moi (sans TV mais avec pleins d’ordinateurs) c’est viable, et en plus ça m’amuse beaucoup \o/