À l'origine, ce message était prévu pour être une réponse dans ce fil
https://debian-facile.org/post.php?acti … &tid=31827 mais devenu trop volumineux j'ai préféré en faire un sujet à part.
Je tiens également à préciser que je ne suis pas du tout habitué à ffmpeg mais que je maitrise bien cette conversion dans l'environnement
avisynth et cette connaissance m'a permis d'aller chercher directement et simplement tout ce dont j'ai besoin dans "la jungle"
des flags ffmpeg.
Dans le cas d'une conversion mp4 --> mpeg2 DVD PAL on a affaire à une conversion de format ( pas seulement à un transcodage mp4->mpg) et il est fondamental d'avoir bien compris en quoi consiste le format video DVD PAL pour réussir cette conversion.
Une fois assimilé les différentes étapes nécessaires à la conversion, cela peut se faire tout simplement avec ffmpeg.
Voici un workflow simple en mode manuel qui détaille toutes les opérations élémentaires indispensables de cette conversion.
Un utilisateur ffmpeg avancé (pas moi) pourra bien sûr créer des automatismes ou toutes sortes de script.
Comme exemple, je vais partir d'une video mkv 1280x546 DAR 2.35:1 (cinemascope année 50) en 23,96 fps
Les résolutions du fomat DVDLe format DVD PAL nous impose des résolutions d'encodage fixe. On peut comparer cela à des conteneurs de pixels.
Les résolutions imposées en PAL sont:
720x576 ; 704x576 ; 480x576 ; 352x576 et le format VCD 352x288 en mpeg1
On choisira le conteneur dans laquelle notre vidéo source passe en rognant le moins de pixels ou celui dans laquelle on devra en interpoler (upscaling) le moins.
Dans le premier cas on évite de perdre trop d'information, dans le second on évite de créer trop de nouveaux pixels ( qui ne contiennent pas d'info,simple zoom) mais qui seront gourmants en bitrate final.
En pratique on choisira le 720x576 voire le 704x576 pour les vieux divx en résolution SD.
Le peu de différence entre 720 et 704 fait que choisir de facon standart le 720x576 n'est pas un mauvais choix.
Il faudra également encoder en 16/9 vu que actuellement tous les écrans sont au moins dans cette résolution.--> sinon vilaines bandes noires latérales.
Seul le 4/3 et les geométries de visualisation (DAR) inférieures ( ex: 1.25:1 vieux films NB début des années 30) seront encodés en 4/3
Enfin, chaque résolution d'encodage est ammenée à être étirée latéralement à la diffusion.
La valeur de cet étirement est appelée SAR (sample aspect ratio) ou aussi PAR (pixel aspect ratio)
Chaque résolution d'encodage à de plus un SAR différent.
La résolution 720x576 en 16/9 à un SAR de 64/45.
Au vu de ces infos, on devine que la première opération va être un travail de géométrie
La deuxième opération sera la mise à 25 images/s, opération qui peut s'avérer de loin la plus complexe.
1- REDIMENTIONNEMENTBon nous avons choisi notre conteneur de résolution 720x576 en 16/9 maintenant, comment faire rentrer dedans la video du dessus.
largeur DAR
La formule: ------- = ----- va nous permettre de calculer les dimensions d'insertion de notre video.
hauteur SAR
Une video de DAR 2.35 ramenée à la largeur de notre boite de 720px dans un environnement 16/9 (donc SAR =64/45=1.4222) doit avoir une hauteur = largeur*SAR/DAR soit 720*1,4222/2.35 =
436pxOn arrondit toujours à une valeur paire et de préference mod4
Pour finir il faudra remplir l'espace vide par du noir.
ici (576-436)/2 = 70px en haut et en bas. ( ici aussi, s'arranger pour avoir des valeurs au moins mod2.)
Plus la video est allongée, plus il y aura des bandes noires.
Pour une video de DAR 1,777 ( 16/9 pur) il n'y aura plus de bandes noires et on peut s'économiser ce calcul.(720*1,4222/1,777 = 576)
Voici ce que ça donne pour notre video
Transposition dans ffmpeg
Dans ffmpeg on utilisera la chaine de préprocessing pour préparer les frames avant de les envoyer dans la partie encodage.
_________ ______________
| | | |
| decoded | | encoded data |
| frames |\ _ | packets |
|_________| \ /||______________|
\ __________ /
simple _\|| | / encoder
filtergraph | filtered |/
| frames |
|__________|
ffmpeg -i input.mkv -vf "scale=720:436,pad=720:576:0:70".....
La video en sortie filtrage est maintenant de 720x576 et la source entrée (720x436) est placé aus coordonées 0,70. le reste est rempli par le noir.
2 - FRAMERATE
Le DVD-PAL impose 25fps.
-si la source est déjà à 25 fps on laisse ainsi
-Si la source est à 23,976 voire 24 ( cas des rip issus des DVD/BR ) il faudra ramener le framerate à 25 fps
-Si la source est à 30fps (APN smartphone) ffmpeg n'est pas capable de convertir le framerate à 25 sans de gros dégats.
Il vaut mieux oublier la conversion DVD PAL ou alors utiliser un autre environnement pour la conversion ( avisynth, aussi libre et openSource) mais même là, ce ne sera pas exempt d'artefacts.
pour la conversion,2 méthodes.
-La simple et bourrine
Dupliquation d'une frame toute les 24. Ainsi il y en aura bien 25/s, mais à chaque seconde une petite pause qui est bien visible dans les traveling ou autres déplacements.
L'avantage est que le/les audios restent synchro.
on rajoute dans la chaine de filtrage fps=25
ffmpeg -i input.mkv -vf "scale=720:436,pad=720:576:0:70,fps=25".....
-La plus complexe mais élégante et TOP
La méthode avancée (et officielle) consiste à accélérer la video. Chaque image sera affichée un temps plus court, et la vidéo raccourcie en temps de ~ 4%.
Évidemment il faudra resynchroniser l'audio en conservant le pitch ( la tonalitée).
on rajoute setpts=23.976/25*PTS dans la chaine de préprocessing; 23.976/25 étant le rapport de notre accélération.
etatempo=25/23.976 dans une chaine audio. Le rapport des fps étant ici inversé
ffmpeg -i input.mkv -vf "scale=720:436,pad=720:576:0:70,setpts=23.976/25*PTS" -af "atempo=25/23.976" .....
2 - ENCODAGE
Pour la suite du code, il suffit de s'appuyer simplement sur le preset target pal-dvd et aspect 16:9 de ffmpeg
target pal-dvd peut en revanche être affiné car, par défaut, le bitrate video est de 6000 kbps - relativement haut et le bitrate video ac3 448kbps
pal:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x576 -pix_fmt yuv420p -r 25
-codec:v mpeg2video -g 15 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k
Dans mon exemple, en une passe je pourrais descendre la video à 4000kbps et l'audio 2:0 en mp2 160kbps ou ac3 184kbps
Code final une passe
source 25 fps
ffmpeg -i input.mkv -vf "scale=720:436,pad=720:576:0:70" -target pal-dvd -aspect 16:9 -b:v 4000k -c:a mp2 -b:a 160k output.mpg
source 23.976 fps
a- duplication de frame
ffmpeg -i input.mkv -vf "scale=720:436,pad=720:576:0:70,fps=25" -target pal-dvd -aspect 16:9 -b:v 4000k -c:a mp2 -b:a 160k output.mpg
b- accélération video
ffmpeg -i input.mkv -vf "scale=720:436,pad=720:576:0:70,setpts=23.976/25*PTS" -af "atempo=25/23.976" -target pal-dvd -aspect 16:9 -b:v 4000k -c:a mp2 -b:a 160k output.mpg
Voilà, fini, rien de bien compliqué si on comprend la procédure.
3 ENCODAGE 2 PASSES
L'encodage en 2 passes va permettre de tenter de réduire encore le bitrate (donc la taille finale).
Ici, je tente 3000kbps
Je ne reviens pas la-dessus mais la première passe crée un fichier log qui sera lu par l'encodeur lors de la passe 2 lequel répartira au mieux le bitrate vu qu'il connaitra maintenant à l'avance les zones complexes ( fort bitrate) et les zones tranquilles ( faible bitrate)
si la source est à 25 FPS
ffmpeg -i input.mkv -an -vf "scale=720:436,pad=720:576:0:70" -pass 1 -target pal-dvd -aspect 16:9 -f null /dev/null && \
ffmpeg -i input.mkv -vf "scale=720:436,pad=720:576:0:70" -pass 2 -target pal-dvd -aspect 16:9 -b:v 3000k -c:a mp2 -b:a 160k output.mpg
La première passe ne crée pas de fichier video (lequel serait de taille énorme) flag = -f null /dev/null
&&\ permet de chainer les 2 passes, la seconde ne se lançant que lorsque la première a aboutie
-an = no audio ( inutile pour la pass 1)
et les flag bitrate audio et vidéo peuvent être supprimés, ils ne seront pas utilisés.
La passe 2 reste identique par contre
Source à 23.976 fps
-conversion fps "barbare" par duplication
ffmpeg -i input.mkv -an -vf "scale=720:436,pad=720:576:0:70,fps=25" -pass 1 -target pal-dvd -aspect 16:9 -f null /dev/null && \
ffmpeg -i input.mkv -vf "scale=720:436,pad=720:576:0:70,fps=25" -pass 2 -target pal-dvd -aspect 16:9 -b:v 3000k -c:a mp2 -b:a 160k output.mpg
-conversion fps par accélération
ffmpeg -i input.mkv -an -vf "scale=720:436,pad=720:576:0:70,setpts=23.976/25*PTS" -pass 1 -target pal-dvd -aspect 16:9 -f null /dev/null && \
ffmpeg -i input.mkv -vf "scale=720:436,pad=720:576:0:70,setpts=23.976/25*PTS" -af "atempo=25/23.976" -pass 2 -target pal-dvd -aspect 16:9 -b:v 3000k -c:a mp2 -b:a 160k output.mpg
Ici, Bizarement, ffmpeg refuse l'encodage de sources mkv avec cette commande.
Par contre aucun pb avec les sources mp4.
[mpeg2video @ 0x55a80face880
] Invalid pts
(20) <= last
(20)
Video encoding failed
Conversion failed
!
Les valeurs de modification PTS de la ligne de commande sont de 0.9 et de plus, aucun problèmes avec une source mp4 ni même mkv en une seule passe ( voire au dessus)
Le problème vient du flag setpts=23.976/25*PTS dans la pass 1 et seulement en mkv.
Une solution consiste à le supprimer simplement de la passe 1. Effectivement, pour l'analyse, la vitesse de défilement (PTS presentation timestamp) ne joue aucun rôle, idem présence audio ou non.
Autre solution trouvée sur le net, rajouter l'option -vsync vfr dans la passe 1.
Celle-ci est surement moins bourrine
Ces modifs fonctionnent sans problèmes aussi avec les mp4 donc on peut je pense les garder en standart.
commande finale
ffmpeg -i input.mkv -an -vsync vfr -vf "scale=720:436,pad=720:576:0:70,setpts=23.976/25*PTS" -pass 1 -target pal-dvd -aspect 16:9 -f null /dev/null && \
ffmpeg -i input.mkv -vf "scale=720:436,pad=720:576:0:70,setpts=23.976/25*PTS" -af "atempo=25/23.976" -pass 2 -target pal-dvd -aspect 16:9 -b:v 3000k -c:a mp2 -b:a 160k output.mpg
ou
ffmpeg -i input.mkv -an -vf "scale=720:436,pad=720:576:0:70" -pass 1 -target pal-dvd -aspect 16:9 -f null /dev/null && \
ffmpeg -i input.mkv -vf "scale=720:436,pad=720:576:0:70,setpts=23.976/25*PTS" -af "atempo=25/23.976" -pass 2 -target pal-dvd -aspect 16:9 -b:v 3000k -c:a mp2 -b:a 160k output.mpg
Pour finir
- Si le logiciel d'authoring DVD demande des stream élémentaires, il faudra alors ne pas muxer *.mpg en sortie et exporter en *.m2v ; *.mp2 ; *.ac3
- un lien vers une calculatrice de bitrate pour remplir au mieux ses DVD
https://dvd-hq.info/bitrate_calculator.php
conclusion:
avant:
Complete name : /media/Movies/Western/USA/Warlock.1959.720p.mkv
Format : Matroska
Format version : Version 4
File size : 868 MiB
Duration : 2 h 1 min
Overall bit rate : 999 kb/s
après
omplete name : /media/Movies/Western/USA/Warlock.mpg
Format : MPEG-PS
File size : 2.64 GiB
Duration : 1 h 56 min
Overall bit rate mode : Variable
Overall bit rate : 3 241 kb/s
120mn en 2,64GB c'est très correct.
En 25 fps, le film est maintenant 5 mn plus rapide
-----------------------------------------------
Il encore des cas en suspend.
Sources mp4/mkv anamorphiques ; conversion vers le format DVD NTSC etc...
mais ce ne sont finalement que des adaptations de la même logique, dont faciles une fois celle-ci est assimilée.