Poursuite dans ce thème dvd anime → upscale + passage en codec av1
Comme prévu la gestion des fichiers c’est chaud et assez monstrueux, pour une heure c’est 25x60x60 fichiers si je me contente d’un deinterlace sans doublement du framerate, donc 90 000 frames .png en 720x576 et 90 000 entre 8 et 12mo en taille d’upscale X4, du 90go/heure rien que le dossier output à la grosse louche
J’ai donc baissé la voilure , un upscale X3 passage du 720x576 entrelacé en un truc assez bâtard 2160x1728 25img/s
Mais même un episode anime c’est 34701 fichiers png upscale (+la même chose en taille 576)
Bref j’ai concocté une usine à gaz pour soulager mon matos : tous les png restent en memoire et ne touchent pas mes ssd
Prend 20secondes de video
-> met les 500 frames format « dvd » dans un dossier input dans un « ram drive »
-> upscale x3 de ces frames et ils vont dans un dossier output du ramdrive
-> compression en av1 dans un fichier sur ssd → donne 20secondes de video (dans les 10 à 12mo pour 20sec)
→ suppression du contenu des dossiers input et output sur le ramdrive
-> on prend les 20secondes suivante et on recommence tant que l’obtiens 500frames
Quand moins de 500, on est au bout → concatenation de tous les morceaux (sans recompression)
A ce moment j’ai juste la video upscale av1 en mp4 sans audio
Détection des pistes du dvd → on essaye de prendre que l’audio en japonais et francais et les sous-titres FR, ajout/direct copie de tout cela dans un conteneur .mkv avec direct copie du contenu video du mp4
Franchement j’étais pessimiste sur les chances de ne rien voir en sortie avec ce découpage/collage sauvage des morceaux de 20sec, les fichiers dvd et codecs récents ce n’est pas vraiment prevu pour de la précision à la frame près
Au final ce qui m’a pris le plus de temps c’est ce fichu soustitres fr venant du dvd → il apparaissait genre en position 250x520 (en partant du coin supérieur gauche) et sur une video 2160x1728 c’est pas glop 
J’ai mis bien 3heures pour avoir enfin une reponse utilsable (je suis partie dans tous les sens (vlc (il sait les monter et descendre) / mediaplayer (mais le gui est minimaliste sur linux) / handbrake (qui m’a fait que des sous-titres totalement noir au lieu de blanc)
Je ne sais pas si je gagne qq choses en temps en passant par un ramdrive, j’ai essayé d’optimiser un peu l’encodage av1 (sur gpu amd on utilise + vaapi (comme sur gpu intel) que l’amf (qui n’a rien voulu savoir (sur manjaro faudrait prendre un pilote/truc sur le AUR) , sur nvidia faudra reprendre le code avec du codec « NV »
Coté perf : pour 23min08 de video source cela met 37min20 de calcul
(pour du x3 avec 10threads cpu/gpu)
Le passage du vob 1.3go (4pistes audio et 4 sous-titres) donne un mp4 (purement video) de 422mo, l’ajout des 2 pistes audio et du fr ajoute 80mo
Sur mes 3 premiers épisodes, vob de 1.3Go la taille de sortie est vraiment variable 623->726->502
Pour le 3ieme : à l’assemblage final (annonce moins en taille que ce que j’ai sur le disque)

Vla l’usine à gaz
Avertissements :
- fait un paquet de temps que j’ai pas fait sans le ramdisk, il faut le faire avant pour l’utiliser
- le script se lance via
./upvaapi /run/media/feunoir/Data/savevob/Dvd1/3-DVD01.vob, cela fera un dossier reptemp dans l’endroit ou on lance le script, tout le contenu de reptemp sera effacé, si pas de ramdisk cela devrait faire un input ou output dans le dossier du lancement du script aussi (je lance a partir de /run/media/feunoir/Data/test qui contient ce script en dessous le fichier .vob qui se trouve ailleurs )
- J’ai perdu pas mal de cheveux sur les pistes audio et soustitres : le code 0x80 0x81 et 0x20 semble efficace avec mes dvd actuels (ne sais pas si ce sera valable sur mon prochain dvd alors sur d’autres a voir
)
- le
rm reptemp/* en toute fin de fichier efface les bouts de video de taille « intervale », la mettre en commentaire permet de les garder sous le coude si besoin
- la compression vaapi c’est probalement prevu sur du gpu amd et intel, voir nvenc pour du nvidia
- il y a des « echo » utile dans le tas
echo "# files.txt" > $helperconcat et echo "file '"$sortie"'" >> $helperconcat
#!/bin/bash
# condition pour ram disk: sa creation prealable
# sudo mkdir /tmp/ramdisk
# puis on donne le droit dessus a tout utilisateur (pas besoin?, pas testé sans)
# sudo chmod 777 /tmp/ramdisk
# la monte avec la taille de 10Go (cela a besoin de bien moins en 3x pour 20sec)
# sudo mount -t tmpfs -o size=10G myramdisk /tmp/ramdisk
ramdiskconfigure="/tmp/ramdisk"
if [ -d "$ramdiskconfigure" ]; then
mkdir $ramdiskconfigure/input
repinput=$ramdiskconfigure"/input"
mkdir $ramdiskconfigure/output
repoutput=$ramdiskconfigure"/output"
else
mkdir input
repinput=input
mkdir output
repoutput=output
fi
mkdir reptemp
video=$1
nomvideo="$(basename "${video%.*}")"
conteneursorti=".mp4"
helperconcat="liste.txt"
echo "# files.txt" > $helperconcat
echo $video
echo $nomvideo
echo $sortie
framerate=25
compteurfichiers=0
index=0
periode=20
framesprocessees=0
debutcapture=0
rm $repinput/*
rm $repoutput/*
before=$SECONDS
while [ 1==1 ]
do
echo "*****debut boucle **************"
ffmpeg -hide_banner -i $video -ss $debutcapture -t $periode -vf "bwdif=mode=0:parity=0:deint=0" -y "$repinput/frame_%04d.png"
debutcapture=$(($debutcapture + $periode))
#echo $debutcapture
#echo "index=" $index
nb_de_frames=$(ls $repinput/* | wc -l)
#echo "nb_de_frames=" $nb_de_frames
framesprocessees=$((framesprocessees + nb_de_frames))
echo "****./realesrgan-ncnn-vulkan*************./realesrgan-ncnn-vulkan************************./realesrgan-ncnn-vulkan******************************************************************************************************************************************"
#echo "position capture en cours" $debutcapture
#echo "index upscale=" $index
#echo "framesprocessees = " $framesprocessees
#echo "nb_de_frames=" $nb_de_frames
#echo $(ls $repinput)
#sleep 10
./realesrgan-ncnn-vulkan -i $repinput -o $repoutput -j 10:10:10 -s 3 -v -f png
sortie=reptemp/$nomvideo"_"$index".mp4"
echo "file '"$sortie"'" >> $helperconcat
echo "******************statut avancement boucle $index **************"
echo "******************statut avancement boucle $index **************"
echo "******************statut avancement boucle $index **************"
echo "nb_de_frames en cours = " $nb_de_frames
echo "framesprocessees depuis debut = " $framesprocessees
echo "temps de video processés = " $(($framesprocessees / framerate))
echo "temps video processés en minutes= " $(($framesprocessees / ($framerate * 60)))
echo "****************** encodage des $nb_de_frames frames du bloc de $periode"sec" en av1 **************"
echo "****************** encodage des $nb_de_frames frames du bloc de $periode"sec" en av1 **************"
echo "****************** encodage des $nb_de_frames frames du bloc de $periode"sec" en av1 **************"
#sleep 5
ffmpeg -hide_banner -init_hw_device vaapi=foo:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device foo -framerate $framerate -pattern_type glob -i "$repoutput/*.png" -c:v av1_vaapi -q 100 -filter_hw_device foo -vf 'format=nv12|vaapi,hwupload' -y $sortie
if [ $nb_de_frames -lt 500 ]; then
break
else
((index++))
fi
echo "*****fin boucle $index **************"
rm $repinput/*
rm $repoutput/*
done
echo "************concatenation des bouts de videos via un fichiers liste **************************"
echo "************direct copie sans recompression**************************"
ffmpeg -hide_banner -f concat -safe 0 -i $helperconcat -c copy -y $nomvideo$conteneursorti
#ajout des pistes audio du fichier source et passage en conteneur mkv
echo "************detection piste audio fr/jap et soustitre fr**************************"
env "FFREPORT=file=vob.log:level=32" ffprobe -hide_banner -fflags +genpts -report -analyzeduration 100M -probesize 100M -i $video
capture=$(grep -oE ':{1}.\[0x80' vob.log)
audiojaponais="${capture:1:1}"
capture=$(grep -oE ':{1}.\[0x81' vob.log)
audiofrancais="${capture:1:1}"
capture=$(grep -oE ':{1}.\[0x20' vob.log)
subtitlefr="${capture:1:1}"
ffmpeg -hide_banner -fflags +genpts -i $nomvideo$conteneursorti -analyzeduration 100M -probesize 100M -canvas_size 720x576 -i $video -map 0:0 -map 1:$audiojaponais -map 1:$audiofrancais -map 1:$subtitlefr -metadata:s:a:0 language=jap -metadata:s:a:0 title="Japonais" -metadata:s:a:1 language=fra -metadata:s:a:1 title="Francais" -metadata:s:s:0 language=fra -metadata:s:s:0 title="Francais" -codec:v copy -codec:a copy -c:s dvdsub $nomvideo".mkv"
tempsupscale=$SECONDS
echo "Temps upscale real-esrgan +ffmpeg = " $(($tempsupscale - $before))
echo "Nombre de frames video processées= "$framesprocessees
echo "temps de video processés = " $(($framesprocessees / $framerate))
rm reptemp/*
Pour la taille du ramdisk , sur mon dvd en cours vers 3go les 500 images upscalées et vers 300mo les 20sec de 720x576p (j’ai dû mettre 11go cette fois ci ) lors d’un test en x4 j’avais dans les 5.6go me semble, donc prevoir + de 6go en 4x
qq explications sur le monstre
ffmpeg -hide_banner -fflags +genpts -i $nomvideo$conteneursorti -analyzeduration 100M -probesize 100M -canvas_size 720x576 -i $video -map 0:0 -map 1:$audiojaponais -map 1:$audiofrancais -map 1:$subtitlefr -metadata:s:a:0 language=jap -metadata:s:a:0 title="Japonais" -metadata:s:a:1 language=fra -metadata:s:a:1 title="Francais" -metadata:s:s:0 language=fra -metadata:s:s:0 title="Francais" -codec:v copy -codec:a copy -c:s dvdsub $nomvideo".mkv"
-hide_banner
inutile coté video, cela planque la liste des codecs/filtres qu’affiche ffmpeg a chaque lancement
-fflags +genpts
Je comprends pas trop mais cela semblait bien 
Parlant de syncho audio : « flag asks FFmpeg to generate presentation timestamps where they’re missing, which often repairs the alignment without any re-encoding »
A mettre avant les sources
-analyzeduration 100M -probesize 100M
C’est pour pouvoir voir les sous-titres qui commence genre à 90sec du début, ffmpeg teste que le début et ne voit que l’audio et vidéo, on l’envoie explorer plus loin dans le fichiers, donc s’ils ne sont pas vu avec 100M faudra augmenter ces valeurs
-canvas_size 720x576
canvas_size c’est l’outil magique qui m’a remis les sous-titres en bas, le mettre avant le .vob pour que les sous titres sache la taille de depart et s’adapte à la nouvelle ensuite
-map 0:0
prendra la piste video (la 0 pour mon .mp4) , c’est le fichier du premier -i donc le sens est important
-map 1:$audiojaponais -map 1:$audiofrancais -map 1:$subtitlefr
en gros ce sera du
-map 1:4 -map 1:5 -map 1:7
pareil que la « map 0 » mais ici c’est le deuxieme fichiers source (le1) et les pistes 4, 5, et 7 → la position varie sur les dvd, donc faut le bon numero des pistes du .vob
-metadata:s:a:0 language=jap -metadata:s:a:0 title="Japonais" -metadata:s:a:1 language=fra -metadata:s:a:1 title="Francais" -metadata:s:s:0 language=fra -metadata:s:s:0 title="Francais"
Donne au mkv le contenu des pistes, « s:a » c’est audio « s:s » c’est le sous-titre, un vlc donnera le « title » indiqué plutot que piste 1 et 2 quand on veut choisir un autre audio
codec:v copy -codec:a copy -c:s dvdsub
De la direct copie → cela ne prend que qq secondes
Pour le sport, mon contenu famille de test ultime
(a suivi surement un parcours vhs-c → vhs → dvd via graveur dvd de salon avant que je mette les mains dessus en .vob)
On voit bien mieux la date quand même 
C’est peut être + géneraliste que juste l’anime en fait ce truc, c’est direct du script au dessus, juste arreté en cours sans aller au bout