Bon, après les déboires lié aux features mkv pas pris en charge par la plupart des lecteurs et notamment par handbrake lors d'un transcod, je me suis tourné à nouveau vers ffmpeg.
Je suis tombé sur une image docker très bien foutu et j'ai fait un petit batch de transcod pour voir quel niveau de CRF était acceptable avec differents preset.
Code:
for crf in 20 24 28 32; do
for speed in ultrafast fast medium slow; do
time docker run --cpuset-cpus="0,2,4,6" --cpus="4" -v$(pwd):/temp/ jrottenberg/ffmpeg -loglevel panic -i /temp/Violet.Evergarden.01.mkv -map 0 -c:0:1 copy -c:0:2 copy -c:0:v libx265 -preset $speed -crf ${crf} /temp/out_${crf}_${speed}.mkv
done
done
Globalement seul CRF 20 donne un résultat "indetectable", à CRF 24 on vois quelques petits artefact par ci par là, au dessus c'est dégueulasse.
De même le preset est très important pour le rendu final de l'image. Pour tout les CRF le preset ultrafast rend la video "blocky" du au "motion search method" utilisé pour ce preset. Le preset fast quant à lui souffre d'un taux de compression bien plus mauvais que les autres preset, vu que je vise un transcodage pour archiver les videos à long terme ce preset est inutile pour moi.
Reste donc medium et slow en CRF 20/24.
Temps d'encodage (minutes):
Code:
CRF 20 24
medium 104 94 90.38%
slow 243 213 87.65%
233.65% 226.60%
Un coût de ~220% en temps d'encodage pour une faible difference de qualité
~10% de temps d'encodage en moins avec un CRF plus haut
Taille des fichiers (Mo):
Code:
CRF 20 24
medium 248 156 62.90%
slow 243 154 63.37%
97.98% 98.72%
Un gain quasi nul entre medium et slow niveau taille, et logiquement la taille varie beaucoup en fonction du CRF.
A voir si la difference de qualité entre medium crf 20 et slow crf 24 justifierai le temps d'encodage en plus.
Après avoir encodé 16x la même video je me suis dit qu'il serait de bon ton de les comparer avec un outil fait pour ça. Je suis tombé encore une fois sur un conteneur docker incluant vqmt pour faire ça!
Pour utiliser cet outil il faut d'abord extraire la video en format brut (non compressé). Convertis ainsi le fichier fait une taille monstrueuse (220mo pour 3s) il faut donc travailler avec des morceaux de fichier video, pour les extraires:
Code:
for debut in "05" "10" "20"; do
for crf in 20 24; do
for preset in medium slow; do
docker run -v $(pwd):/temp/ jrottenberg/ffmpeg -ss 00:${debut}:00 -i /temp/out_${crf}_${preset}.mkv -t 00:00:03 -c:v rawvideo -pix_fmt yuv420p /temp/out_${crf}_${preset}_${debut}m_3s.yuv
done
done
docker run -v $(pwd):/temp/ jrottenberg/ffmpeg -ss 00:${debut}:00 -i /temp/Violet.Evergarden.01.mkv -t 00:00:03 -c:v rawvideo -pix_fmt yuv420p /temp/out_source_${debut}m_3s.yuv
done
#On génère les morceaux de fichiers bruts de 3s aux timestamp à 5 10 et 20 minutes. On génère les même pour le fichier source.
Pour avoir l'image vqmt:
Ensuite on lance les tests:
Code:
for debut in "05" "10" "20"; do
for crf in 20 24; do
for preset in medium slow; do
for test in PSNR SSIM MSSIM VIFP PSNRHVS PSNRHVSM ; do
docker run -v $(pwd):/videos -w /videos vqmt vqmt out_source_${debut}m_3s.yuv out_${crf}_${preset}_${debut}m_3s.yuv 1080 1920 60 1 ${crf}_${preset}_${test} ${test}
done
done
done
done
(je renvois vers la documentation des differents outils pour savoir a quoi correspond tout )
Bon j'ai pas de résultat pour le comparatif de qualité parce que j'ai choisi les morceaux au pif et je suis tombé sur des séquences statiques (merci les mangas), c'est donc pas super intéressant comme résultat.
Et c'est à ce moment là que je me suis rendu compte d'un truc, libx265 avait plusieurs version de retard dans le build de ffmpeg par defaut! (2.3 vs 3.0).
J'ai donc rebuild l'image ffmpeg avec la version 3.0 comme cible. Et là j'ai eu une petite surprise... La version 3.0 est beaucoup plus lente! (250% sur les deux encod qui ont terminé pour l'instant)
En conséquence je vais lancer un batch de transcod en utilisant une video source plus courte (big buck bunny) et tester les differentes version de libx265 pour le temps d'encodage et la qualité.
J'ai un autre batch de transcod que je vais lancer avec la version "officielle" en limitant les preset à medium/slow et crf à 19/20/21/22.
bref, plus de données bientôt.
tips bonus, pour générer les commandes ffmpeg de transcod permettant de garder toutes les pistes audio et tout les sous-titres:
Code:
# commande de base (limitation cpu, volumes...) et le fichier source
echo -n 'docker run --cpuset-cpus="0,2,4,6" --cpus="4" -v$(pwd):/temp/ jrottenberg/ffmpeg -i /temp/Violet.Evergarden.01.mkv -map 0 ';
# on utilise ffmpeg pour lire les stream et on filtre pour n'avoir que le "numero" des stream qui ne sont pas de la video
for i in $(docker run -v$(pwd):/temp/ jrottenberg/ffmpeg -i /temp/Violet.Evergarden.01.mkv 2>&1 |grep -v "Video" |grep "Stream #"| grep -o -e "#.:[0-9]*"); do
# pour tout les stream
echo -n " -c:0:${i:1} copy "
done
# commande pour le transcod video
echo -n '-c:v libx265 -preset veryfast -crf 20 /temp/outtest2.mkv'
echo ""
C'est assez basique et je ne suis pas certains que ça marche dans 100% des cas mais c'est une bonne base pour lancer un gros batch de transcod dans un dossier sans se poser de question