Comment limiter la taille des fichiers avec ffmpeg?

10

Je veux encoder une vidéo, qui a une longueur de 60 secondes, à une cible ou taille maximale de 10 Mo .

Je connais deux approches. L'un est expliqué dans le FFMPEG-Wiki, et l'autre que j'ai trouvé dans la documentation. Malheureusement, je n'ai pas trouvé d'explication sur le moment d'utiliser quelle méthode.

L'une de ces méthodes est-elle recommandée? Sinon, quels sont les avantages / inconvénients de chaque méthode?

1) Calculez et réglez le débit binaire pour qu'il corresponde à la longueur de la vidéo comme expliqué dans le ffmpeg-wiki

(10 Mo * 8192 [convertit les Mo en kilobits)) / 60 secondes = ~ 1365 kbits / s débit total 1365k - 128k (débit audio souhaité) = 1237k débit vidéo

ffmpeg -y -i input -c:v copy -preset medium -b:v 1237k -pass 1 -c:a copy -b:a 128k -f mp4 /dev/null && \
ffmpeg -i input -c:v libx264 -preset medium -b:v 1237k -pass 2 -c:a libfdk_aac -b:a 128k output.mp4

2) Utilisez le -fs paramètre et laissez ffmpeg le comprendre.

ffmpeg -i input -c:v copy -c:a copy -preset medium -crf 23 -fs 10485760 output.mp4
Daniel
la source
1
Dans votre 1er exemple, la première étape doit également utiliser libx264as c:v. Dans l' fsexemple, vous ne transcodez pas la vidéo, car -c:v copyest utilisé. Ainsi, le presetet crfn'a également aucun effet.
Gyan
Cela m'a été utile: stackoverflow.com/a/34547102/470749
Ryan

Réponses:

11

Le fsparamètre arrêtera l'encodage une fois qu'il aura atteint sa valeur. Donc, si la sortie atteint la 10MBmarque lors de l'encodage de la 15e seconde, c'est la durée de votre fichier de sortie.

Si vous voulez vous assurer que le fichier entier est codé mais qu'il ne dépasse pas la taille cible définie, utilisez la méthode du débit binaire. Pour prendre en charge les frais généraux de multiplexage et d'autres données dans la taille cible, réglez votre débit binaire vidéo légèrement plus bas de, disons, 1-2%

Gyan
la source