logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 30-06-2022 13:22:24

Danklorix
Membre
Distrib. : Debian buster 10 stable
Noyau : Linux 4.19.0-20-amd64
(G)UI : XFCE 4.12.4
Inscription : 27-06-2022

ffmpeg : Conversion de videos mp4-mkv-avi vers le format DVD PAL mpeg2

À 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
Warlock0-5.jpg

Les résolutions du fomat DVD

Le 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- REDIMENTIONNEMENT
Bon 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 =436px

On 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
encode-0-5.jpg

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.

Hors ligne

#2 01-07-2022 12:46:54

phlinux
Membre
Distrib. : Buster
Noyau : 5.10
(G)UI : Openbox (+Rox+Feh)
Inscription : 09-05-2009

Re : ffmpeg : Conversion de videos mp4-mkv-avi vers le format DVD PAL mpeg2

Bjr,

D'accord pour comprendre au lieu de copier bêtement, mais encore faut-il avoir reçu des bases de manière compréhensible par le pékin lambda; il me semble que c'est le cas ici.
Merci pour ce "tuto", ça manquait.

Pages perso : feh, omegat, udisks, passerelle, schroot vraiment transparent

Hors ligne

#3 01-07-2022 13:06:09

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
Inscription : 16-12-2016

Re : ffmpeg : Conversion de videos mp4-mkv-avi vers le format DVD PAL mpeg2

Hello
j'ai mis en lien sur le wiki a ffmpeg sa pourra servir smile

-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<-- 
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

En ligne

#4 02-07-2022 06:40:42

Anonyme
Invité

Re : ffmpeg : Conversion de videos mp4-mkv-avi vers le format DVD PAL mpeg2

@Danklorix

Bonjour


@Danklorix a écrit :


ce fil https://debian-facile.org/post.php?acti … &tid=31827 mais devenu trop volumineux



En un seul post, tu nous bats en nombre de lignes big_smile cool

#5 02-07-2022 19:10:21

Danklorix
Membre
Distrib. : Debian buster 10 stable
Noyau : Linux 4.19.0-20-amd64
(G)UI : XFCE 4.12.4
Inscription : 27-06-2022

Re : ffmpeg : Conversion de videos mp4-mkv-avi vers le format DVD PAL mpeg2

Merci pour vos retours.
@phlinux
Oui, le format DVD,  est un format complexe parce qu'il a du faire la soudure entre les débuts du numérique et les TV du siècle dernier avec tubes à balayage de faisceaux d'électrons.
C'est de là que viennent ces résolutions bizarres (720x576....), les notions de SAR, et l'entrelacement, le télécinage etc...
ffmpeg n'est finalement qu'un outil. Un outil extrêmement puissant mais qui ne dispose que de fonctions élémentaires.
C'est seulement le chainage de ces fonctions qui permet cette infinité  d'utilisations possibles, mais aussi cette infinité de choix parmi toutes ces fonctions.
Sans savoir où on doit aller on peut pas s'en sortir dans des cas un peu complexe comme ces conversions de format.
Par ex DVD-PAL vers DVD-NTSC c'est aussi complexe.

Actuellement, je reconnais que c'est indigeste et peu motivant vu que ces formats sont voués à disparaitre.
Voici toutefois un autre exemple de  redimentionnement --> DVD
je l'avais écrit pour avisynth mais c'est ultra simple ( un petit calcul, on redimentionne et on ajoute des bordures)
http://www.pate15.eu/DVD_resolutions/resize_5.htm

Hors ligne

Pied de page des forums