web-dev-qa-db-fra.com

FFMPEG / libx264: Comment spécifier une cadence variable mais avec un maximum?

Au lieu de fournir une fréquence d'images fixe à FFMPEG/libx264 (-r/-framerate), j'aimerais spécifier une fréquence d'images variable avec une valeur MAXIMUM et permettre à libx264 de réduire la fréquence d'images à sa guise. L'idée ici est d'obtenir une compression supplémentaire lorsqu'il y a quelque chose comme une image fixe étendue (ce qui arrive BEAUCOUP dans mes vidéos sources).

Je me rends compte qu'une trame MPEG prédictive ou bidirectionnelle se compresse très bien, mais il est également possible que la cadence de la source soit inférieure à celle sur laquelle je compte effectuer le transcodage (ce qui peut entraîner un flux plus important!).

16
Mark Gerolimatos

Frustré de ne pas avoir trouvé de réponse non plus, j'allais au moins répondre aux questions d'autres personnes sur la manière d'activer la sortie VFR (et non V B R) de FFMPEG.

La réponse à cette question est l'option -vsync étrangement nommée. Vous pouvez définir différentes options, mais celle que vous voulez est "2" ou vfr. De la page de manuel:

- vsync paramètre
Méthode de synchronisation vidéo. Pour des raisons de compatibilité, les anciennes valeurs peuvent être spécifiées sous forme de nombres. Les valeurs nouvellement ajoutées devront toujours être spécifiées sous forme de chaînes.

  • 0, passthrough

    • Chaque image est transmise avec son horodatage du démultiplexeur au multiplexeur.
  • 1, cfr

    • Les images seront dupliquées et supprimées pour obtenir exactement la fréquence d'images constante requise.
  • 2, vfr

    • Les images sont passées avec leur horodatage ou supprimées afin d'éviter que 2 images aient le même horodatage.
  • drop

    • En tant que passthrough mais détruit tous les horodatages, le multiplexeur génère de nouveaux horodatages basés sur la fréquence d'images.
  • - 1, auto

    • Choisit entre 1 et 2 en fonction des capacités du multiplexeur. C'est la méthode par défaut.

Notez que les horodatages peuvent être modifiés ultérieurement par le multiplexeur, après cela. Par exemple, dans le cas où l'option de formatage Avoid_negative_ts est activée.

Avec -map, vous pouvez sélectionner à partir de quel flux les horodatages doivent être pris. Vous pouvez laisser la vidéo ou l'audio inchangés et synchroniser le (s) flux restant (s) avec celui (s) inchangé (s).

Cependant, je n'ai pas assez de réputation pour poster un commentaire et répondre à cette "question secondaire" que tout le monde semble avoir. Mais j’ai eu quelques idées pour lesquelles je n’étais pas très optimiste, mais j’ai essayé en premier . Alors.

Il vous suffit simplement de combiner l’option -vsync 2 avec l’option -r $maxfps, bien sûr, lorsque vous remplacez $maxfps par le nombre maximal d’images par seconde souhaitées! Et il fonctionne! Il ne duplique pas les images d'un fichier source, mais supprime les images qui font que le fichier dépasse le nombre d'images par seconde maximum!

Par défaut, il semble que -r $maxfps par lui-même provoque simplement la duplication/l’abandon d’images pour obtenir un framerate constant, et -vsync 2 lui-même l’oblige à extraire les images directement sans affecter réellement les valeurs PTS.

Je n'étais pas optimiste à ce sujet, car je savais déjà que -r $maxfps le mettait à un nombre d'images par seconde constant. Honnêtement, je m'attendais à une erreur ou à ce qu'elle obéisse simplement, que ce soit la première ou la dernière chose, ou quoi que ce soit. Le fait qu’il fasse exactement ce que je voulais me rend tout à fait satisfait des développeurs FFMPEG.

J'espère que cela vous aidera, ou à quelqu'un d'autre plus tard, si vous n'avez plus besoin de le savoir.

18
Tynach

Je voudrais spécifier une cadence d'images variable avec une valeur MAXIMUM et permettre à libx264 de réduire la cadence comme bon lui semble. L'idée ici est d'obtenir une compression supplémentaire lorsqu'il y a quelque chose comme une image fixe étendue

D'après ce que je comprends, cela peut être d'une manière assez maladroite, mais cela n'est pas souhaitable pour des raisons complexes et contre-intuitives.

Même si un flux x264 a un nombre d'images par seconde, la cadence de prise de vue est davantage un problème de niveau conteneur que de codec.

Dans un encodage VFR pas à pas, il y aura essentiellement un fichier texte détaillant la fréquence d'images par rapport à chaque image/heure, et dans l'encodage d'une source, une fonction comme tcfile-in ou tcfile-out transmettra l'horodatage à l'encodage. , pour cartographier les emplacements de taux et garder la vidéo subjectivement cohérente à partir de la source.

L'idée des basses fréquences d'images est logique, mais ne fonctionne pas pour plusieurs raisons. Bien que x264 soit compatible VFR avec certaines fonctionnalités, je ne pense pas qu’il existe une fonction d’analyse permettant de faire varier le nombre d’images par seconde en fonction du mouvement afin de réduire la taille du fichier (de manière analogue aux nombreux contrôles de débit).

La source pose également un problème: les sources VFR conservent par défaut leur variabilité de trame, mais le codage apparent d’un fichier CFR à débit variable (une bonne idée parfois, en particulier lorsqu’un télécinéma est nécessaire) produira simplement le même CFR.

Cela signifie que vous devrez probablement réécrire manuellement le débit (par exemple, les horodatages des scènes lentes multiplexées dans le fichier), ou recourir à un algorithme de décimation de trame tel que dup, dédu et exactDedup pour avisynth . Si votre vidéo a très peu de mouvement, certaines images (même la moitié?) Seront projetées. Le problème est que ces algorithmes ne sont pas avancés et ne font pas de bons choix avec des séquences "réelles" quant à ce qui contribuera au meilleur encodage.

En outre, la suppression des images contenant des éléments tels que les images I et B réduit la quantité de détails disponibles au fil du temps, ce qui donne au mouvement une apparence "steppy", peut interférer avec les autres paramètres vidéo de base et provoquer des artefacts tels que le crénelage.

Et à cause de la façon dont les quantificateurs fonctionnent, x264 diminuera le débit de manière disproportionnée dans ces scènes de faible mouvement. À moins que vous n'ayez un diaporama d'images identiques, il y aura du mouvement (si ce n'est que du grain et d'autres artefacts) et il y aura une perte de qualité qui ne serait pas visible sans changements radicaux du débit.

Enfin, si vous n'avez pas beaucoup d'options pour faire ce que vous voulez, c'est que x264 est vraiment efficace pour gérer le débit tout en utilisant une compression temporelle (enregistrement des modifications dans des images partielles). Aller à 1/2 framerate ne réduira pas la taille du fichier de moitié; 10% est probablement un gain réaliste à attendre d'un faible mouvement ou d'une animation.

En bref, abandonner le débit de vos scènes statiques ne fera que très peu pour la taille de votre fichier, mais ajoutera une foule de problèmes de qualité et de synchronisation, sans parler de l'incompatibilité avec le logiciel de montage vidéo.

Si vous voulez essayer un décimateur, vous pourrez peut-être limiter la nouvelle cadence d'images en utilisant les options de niveaux , chacune d'elles possédant une résolution maximale et une régression d'images par seconde. Malheureusement, vous devrez probablement travailler à très basse résolution pour obtenir le type de fréquence d'images souhaité à l'aide de profils. Cela revient à éditer les débits à la main, soit entièrement, soit à corriger les cadences que vous jugez trop élevées. Dans les deux cas, il faudra jongler pour que le son reste synchronisé avec le nouveau nombre d'images par seconde si des modifications sont apportées après le processus de codage lorsque le fichier tc est conservé.

En conclusion, consacrer du temps à l'optimisation des nombreux paramètres de débit rapportera beaucoup plus en termes de gestion de la taille du fichier et améliorera la qualité de votre vidéo plutôt que de causer des complications pour un gain minime. Préserver le FPS d'origine est probablement la meilleure idée, sauf si vous visez des normes de diffusion ou de médias. Les lecteurs sont bien capables de lire des débits binaires variables (contrairement aux éditeurs), et plus il y a d'images dans votre vidéo, plus la lecture est fluide et peut-être aussi la taille du fichier est petite, à cause des changements de mouvement moins importants d'une image à l'autre.

Voici une collection de liens vers des informations sur les normes et des discussions de forum qui devraient vous aider avec cet aspect déroutant de l'encodage:

- outils de décimation d'avisynth

- fps et -r commutateurs
- x264 Général (tcfile, fps)
- Normes de fichier de code temporel
- Niveaux et profils
- Résumé succinct des réglages CFR/VFR (section "framerate")

Doom9, videohelp, & c discussions théoriques
1234567

1
chronometric