ffmpeg - Comment copier | extraire les paramètres d'encodage d'un fichier multimédia existant?

19

Je souhaitais pouvoir le faire plusieurs fois maintenant, alors je demande.

Si j'ai un fichier vidéo ou audio existant, ffmpeg, mplayeret d' autres lecteurs multimédias peuvent détecter au moins certains de ses « IMMEUBLES » comme conteneur, le codec et le débit utilisé, probablement différents et la qualité codant pour les paramètres spécifiques de, etc.

Comment puis-je extraire ces paramètres d'un fichier existant afin de les utiliser (directement) pour l'encodage avec ffmpeg?

Par exemple, j'ai obtenu une mkvvidéo encodée x264avec certains paramètres et un autre avifichier non compressé . Je voudrais "copier" les paramètres d'encodage utilisés pour le fichier mkv x264 pour transcoder l'avi avec les mêmes paramètres.

Remarque: je cherche un moyen qui ne devrait pas inclure de travail humain avec la "traduction" des paramètres d'un décodeur vers l'encodeur. C'est correct si je dois d'abord extraire les paramètres et les enregistrer quelque part, mais j'aimerais pouvoir simplement alimenter les options de lecture vers une ligne de commande ou un fichier de configuration prédéfini pour ffmpeg.

n611x007
la source
Eh bien, vous pourriez probablement trier la sortie ffprobe( en particulier avec les -show_streamset -show_formatoptions) et utiliser cette information pour l'écriture importante des choses
evilsoup
1
Souvent, l'utilisation des mêmes paramètres, tels que le débit binaire (tenter de copier le débit binaire exact semble être populaire parmi les utilisateurs), n'entraînera pas une qualité optimale. Bien sûr, je n'ai aucune idée de ce que votre entrée typique est, mais avec x264, l'utilisation de l' -crfoption est généralement recommandée. Voir le Guide d'encodage FFmpeg et x264 .
llogan
Je ne trouve rien sur les paramètres d'encodage dans la sortie de ffprobe :(
thelolcat
Il ne montre que le nombre de ReFrames, mais pas les autres paramètres comme le fait mediainfo
thelolcat
La syntaxe d'entrée avec ffmpeg est différente des champs de métadonnées. par exemple, vous pouvez lire channels:6un fichier vidéo, mais pour le coder, vous devez utiliser le commutateur -ch:6. Certains commutateurs utilisent 1 lettre, certains en utilisent deux, etc.
jiggunjer

Réponses:

10

Il n'y a aucun moyen automatique de le faire. Vous devez regarder les paramètres du fichier d'origine et les appliquer au fichier de sortie.

Dans la plupart des cas, ce seront les suivants:

  • Format conteneur (MP4, MKV,…)
  • Codec vidéo et audio (H.264, H.265,…)
  • Spécifique à l'audio:
    • Nombre de canaux audio
    • Taux d'échantillonnage audio
    • Bitrate audio
  • Spécifique à la vidéo:
    • Profil et niveau (pour assurer la compatibilité, voir ici )
    • Limitations de débit binaire maximum (par exemple pour H.264 )
    • Résolution vidéo maximale, modification via -filter:v scaleou-s:v
    • Framerate, changement via -filter:v fps -r
    • Sous-échantillonnage de chrominance, modification via -pix_fmt(par exemple, -pix_fmt yuv420pdevrait vous offrir la meilleure compatibilité)
    • Taille du GOP (distance entre les cadres IDR), définie via -g
    • Autres paramètres d'encodage spécifiques

Mais même si cela vous convient, certains appareils peuvent nécessiter des informations propriétaires spécifiques intégrées dans le flux binaire.


Quant à la tâche spécifique de l'utilisation x264, cela ne va pas être trivial. Je ne connais pas un seul script qui s'occuperait de ces tâches, qui sont généralement effectuées manuellement. Pour la plupart des informations sur les paramètres d'encodage, sur Unix / Linux ou OS X, vous pouvez utiliser mediainfoavec quelques astuces Bash.

Par exemple, pour une vidéo encodée x264 dans un fichier MP4:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

Cela affichera une liste d'options x264:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…

Vous pouvez ensuite transmettre manuellement ces options au binaire x264.

Si vous passez par FFmpeg, c'est un peu plus compliqué, car toutes les options de x264 ne peuvent pas ou ne devraient pas être mappées comme ça. Notez que souvent une simple présélection, un réglage et une spécification de profil feront aussi bien (comme vu dans x264 --fullhelpet le guide d'encodage x264 ), et spécifier le niveau CRF est suffisant.

Et cela ne prend même pas en compte l'audio, où heureusement, il n'y a pas beaucoup d'options.

slhck
la source
Ce n'est donc pas possible avec ffprobe ou ffmpeg?
thelolcat
Non, ce n'est pas directement possible de le faire avec ffprobe / ffmpeg. Dans le cas d'une vidéo encodée x264, j'utiliserais la mediainfosortie et mapperais ces options avec ffmpeg -x264-params. (Voir également le guide d'encodage x264 ). Mais si vous voulez une solution générale pour toutes sortes de codecs / encodeurs ou formats de conteneurs, alors vous devrez écrire un script modérément sophistiqué qui effectue la conversion.
slhck