Comment créer un fichier vidéo MPEG2 avec la meilleure qualité possible en utilisant FFMPEG?

16

J'ai un fichier WMV (v9 (WMV3), 960x720, 30.000030 fps, planar 4: 2: 0 YUV, produit par PowerPoint 2010) et je dois le convertir en MPEG2 - le seul format que mon téléviseur peut lire à partir d'une clé USB (J'ai également essayé MP4 / h.264, AVI / XVID - rien que MPEG2 fonctionne).

J'ai réussi à faire le travail avec simple

ffmpeg -i "in.wmv" -c:v mpeg2video "out.mpg"

mais la qualité du résultat est épouvantable (des distorsions visuelles clairement visibles sont introduites) et la lecture n'est pas fluide (trop lente à certains moments).

J'ai aussi essayé

ffmpeg -i "in.wmv" -c:v mpeg2video -pix_fmt yuv420p -me_method epzs -threads 4 -r 30.000030 -g 45 -bf 2 -trellis 2 -cmp 2 -subcmp 2 -s 960x720 -b 2500k -bt 300k -async 1 -y "out.mpg"

(J'ai trouvé cela quelque part sur Internet et j'ai modifié un peu - changé la résolution, le taux de rafraîchissement et le format de sortie (de VOB à MPG nu)) avec succès mais la qualité est encore trop mauvaise.

Quels paramètres dois-je utiliser pour économiser autant de qualité que possible? Le taux de compression n'a pas d'importance du tout, même l'augmentation de la taille du fichier est acceptable.

Une autre chose dont j'ai réellement besoin (j'ai choisi de ne pas l'inclure dans le titre de la question pour éviter de le rendre trop spécifique mais j'apprécierais qu'il soit pris en compte dans les réponses) est d'ajouter du silence pur comme bande sonore - il n'y a pas de son dans le original mais le téléviseur s'en plaint et j'aimerais me débarrasser de cette plainte. J'ai généré un fichier OGG Vorbis de silence de même longueur (deuxième précision) à l'aide d'Audacity, mais je n'arrive pas à le fusionner avec la vidéo:

ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg

et même nu

ffmpeg -i in.mpg -c:v copy -out.mpg

donne des erreurs "buffer underflow" et "packet too large". (in.mpg sont les fichiers produits par le même binaire FFMPEG et le même fichier WMV source en utilisant les deux premières commandes de la question).

J'utilise une version Zeranoe FFMPEG sur Windows 7.

Ivan
la source
2
Quelqu'un va vous demander un journal de sortie complet.
dstob
Quel téléviseur exactement? Il pourrait lire H.264, juste un profil différent.
slhck
@slhck Le téléviseur est Philips 42PFL3606H/58, j'encode en H.264 avec ffmpeg -i "in.wmv" -sws_flags lanczos+accurate_rnd -c:v libx264 -crf 20 -preset slow -profile:v baseline -level 3.0 -pix_fmt yuv420p -tune fastdecode -x264-params keyint=240:min-keyint=20 "out.mp4"- le profil est le plus bas que je connaisse et encore plus de réglages sont utilisés pour faciliter la lecture du fichier résultant.
Ivan
1
Selon le manuel, le téléviseur prend en charge MPEG-4 Visual et H.264. Si le profil de base ne fonctionne pas, je ne sais pas ce qui fonctionne. Mais les téléviseurs sont très pointilleux.
slhck

Réponses:

16

Le problème est que le débit binaire par défaut du MPEG-2 est plutôt faible (comme avec la plupart des autres encodeurs vidéo de ffmpeg, le H.264 étant une exception). Le MPEG-2 n'est pas non plus le meilleur choix en tant que codec de nos jours.

Meilleure qualité pour MPEG-2

Vous avez quelques options si vous souhaitez vous en tenir à MPEG-2:

  • Augmentez le débit binaire. Vous utilisez maintenant -b:v 2500k. Si c'est de la vidéo HD, vous n'irez pas loin avec seulement 2,5 MBit / s. Vous avez besoin d'au moins le double ou même plus pour que le résultat soit beau. Par exemple, utilisez -b:v 6000k -target pal-dvd.

    Pour 720p, je pense que vous devriez toujours utiliser un débit binaire plus élevé. N'oubliez pas que les DVD utilisent MPEG-2 et fournissent environ 4,7 Go pour 2 heures de film, vous obtenez donc environ 5 à 8 Mo / s. MPEG-2 n'est vraiment pas très efficace en compression et fonctionne mieux à des débits plus élevés.

  • Utilisez un paramètre de qualité spécifique. Remplacez -b:v …par -qscale:v 2. Le nombre ici varie de 1 à 31 et plus signifie une qualité inférieure. Cela ne sert à rien d'aller au-delà de 4 ou 5. Si vous ne vous souciez pas du débit, commencez par 2 et voyez si cela fonctionne pour vous.

Jouer avec le nombre d'images B, la méthode d'estimation de mouvement ou la taille du GOP peut modifier légèrement la qualité mais n'entraînera pas de grands changements.

Audio silencieux

Utilisez -f lavfi -i aevalsrc=0pour générer un flux audio silencieux. Par exemple:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"

Vous devrez peut-être ajouter -target pal-dvdà la commande ci-dessus pour forcer une certaine taille de tampon.

J'ai choisi MP3 comme codec. Les fichiers MPEG ne peuvent pas contenir d'audio autre que l'audio MPEG Layer I et II ainsi que les flux PCM, donc l'utilisation d'un fichier Ogg Vorbis silencieux ne fonctionnera pas à moins que vous convertissiez également le flux audio (ce qui n'est pas ce que vous faites lorsque vous utilisez -c:a copy) .

Utilisez un codec vidéo différent

Je suis surpris qu'un téléviseur qui lit des fichiers vidéo lira MPEG-2 mais pas autre chose. Au moins la vidéo MPEG-4 Part II devrait être prise en charge (c'est ce que vous appelez "DivX" - un encodeur MPEG-4 Part II). Vous pouvez donc essayer:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"

Votre téléviseur peut également prendre en charge H.264, mais seulement un certain profil. Essayez d'utiliser le baselineprofil, par exemple:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libx264 -profile:v baseline -crf 23 -c:a aac -strict experimental "out.mp4"

Dans l'exemple ci-dessus, j'ai utilisé l'option CRF pour définir la qualité au lieu de qscale. Consultez le guide de codage H.264 pour en savoir plus.

slhck
la source
"Jouer avec le nombre d'images B, la méthode d'estimation de mouvement ou la taille du GOP peut modifier un peu la qualité mais n'entraînera pas de grands changements." - puis-je faire de chaque image une image B et ne pas utiliser d'estimation de mouvement avec MPEG2? La vidéo a beaucoup de parties TRÈS dynamiques.
Ivan
J'ai essayé la première ligne de commande que vous proposez ( ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4") - elle code environ 100 images, puis commence à inonder l'écran avec des erreurs comme [mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761et [mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it.
Ivan
@Ivan Vous changez le bitrate avec -b:v. Je l'ai ajouté à ma réponse. Concernant les paramètres de l'encodeur: vous ne pouvez pas faire de chaque image une image B. De plus, vous avez besoin d'une estimation de mouvement - plus la méthode est exhaustive, meilleure est la compression. Mais s'il s'agit d'une vidéo dynamique, la première chose que vous voudrez est d'augmenter considérablement le débit binaire. Les paramètres d'encodage n'ont vraiment pas beaucoup d'impact. Quant à votre erreur, êtes-vous sûr que c'est l'erreur de la commande correcte? Une [mpeg]erreur ne peut se produire que si votre fichier de sortie l'est .mpg, pas quand il l'est .mp4.
slhck
J'ai copié = collé une mauvaise partie, @slhck, j'utilise ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"bien sûr.
Ivan
1
-target pal-dvdrésout le problème, -bufsizene fonctionne pas (j'ai essayé -b:v 7M -bufsize 7M -maxrate 7M).
Ivan
0

Je dirais immédiatement que si la taille du fichier n'a pas vraiment d'importance, essayez simplement d'augmenter le débit binaire.

Pour l'audio silencieux que vous voudrez peut-être simplement utiliser ffmpeg, je ne connais pas suffisamment Audacity pour donner une sorte de commentaire. Je l'ai déjà utilisé auparavant.

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.aac

Cela ne fonctionnera pas pour vous, car vous utilisez un conteneur mpg, vous pouvez donc essayer. (Conteneur mp3)

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.mp3

Cela a semblé fonctionner pour moi.

dstob
la source
La définition de la durée n'est pas nécessaire, car ffmpeg utilisera simplement tout ce qui est nécessaire pour la vidéo.
slhck
J'ai gardé les choses en deux étapes comme l'avait fait Ivan. Si vous omettez la durée dans ma commande, je ne sais pas combien de temps ffmpeg fonctionnerait (probablement plus longtemps que vous ne le souhaiteriez).
dstob