Comment puis-je réduire la taille d'une vidéo avec ffmpeg?

202

Comment puis-je utiliser ffmpegpour réduire la taille d'une vidéo en diminuant la qualité (le moins possible, naturellement, mais il faut que je l'exécute sur un appareil mobile qui n'a pas beaucoup d'espace disponible)?

J'ai oublié d'écrire une chose pour le moment. Lorsque la vidéo peut utiliser des sous-titres (* .srt ou * .sub), je souhaite également les convertir pour les adapter aux paramètres du fichier vidéo converti.

Xralf
la source
4
Je ne l'ai pas utilisé, mais la ffmpegpage de manuel affiche une -fsoption permettant de limiter la taille de la sortie. Est-ce que quelque chose comme ça ffmpeg -i in.avi -fs 100M out.avimarche?
Kevin
1
Je ne vous redirigerai pas vers la page de manuel:man ffmpeg | wc -l --> 5254
3
Ce .avin'est pas le principal problème .. aviest juste un conteneur. Le problème principal est de savoir quels codecs vous utilisez. Beaucoup (la plupart?) De .avivids utilisent des codecs de style plus anciens (XviD, par exemple). codage étroit en utilisant le H.264standard de compression vidéo (par exemple, codec x264) et aaccompression pour l'audio. Le conteneur et les codecs que vous utilisez dépendent de vous et de votre téléphone ... Le .mp4conteneur est bien accepté .. (mais votre téléphone peut-il le gérer: voir ce lien
Peter.O
@ Kevin Cela veut plus de paramètres pour la conversion.
xralf
@hesse Qu'est-ce que cela signifie?
xralf

Réponses:

277

Voir cette réponse. Cité ci-dessous pour plus de commodité:

Calculez le débit dont vous avez besoin en divisant 1 Go par la longueur de la vidéo en secondes. Donc, pour une vidéo de 16h40 (1000 secondes), utilisez un débit de 1000000 octets / s:

ffmpeg -i input.mp4 -b 1000000 output.mp4

Parmi les autres options à considérer, vous pouvez définir le facteur de débit constant, qui réduit le débit moyen, mais conserve une meilleure qualité. Varier le CRF entre environ 18 et 24 - le plus bas, plus le débit est élevé.

ffmpeg -i input.mp4 -vcodec libx265 -crf 20 output.mp4

Modifiez le codec selon vos besoins - libx264 peut être disponible si libx265 ne l'est pas, au prix d'une taille de fichier résultante légèrement plus grande.

Vicky Chijwani
la source
La vidéo de taille 338 Mo a été réduite à une taille de 130 Mo. La qualité a rapidement baissé. Y a-t-il une explication à ce processus? L'auteur original n'explique pas sa ligne directrice.
xralf
13
La deuxième commande, using a -crf 24pris une vidéo de 255,3MB que j'ai eue et l'a réduite à 72,7MB sans abaisser sensiblement la qualité. Avoir un vote positif!
Patrick Roberts
2
Réduit de manière impressionnante une vidéo ~ 2G à 14 Mo, a toujours l’air superbe, c’était le premier résultat de recherche et c’est exactement ce que je cherchais, merci!
Sinisterstuf
5
Il serait bon de noter que vous pouvez maintenant utiliser libx265pour encore plus de réduction de taille.
ZN13
6
Utilisé ffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi. Il a réduit une vidéo de 100 Mo à 9 Mo. Très peu de changement de la qualité vidéo. Je vous remercie!
alpha_989
32

À moins que vous ne recherchiez un débit spécifique, je vous recommande cette -crfoption. C'est le plus couramment utilisé pour l' x264encodage: http://slhck.info/articles/crf

En bref: un CRF de 23 produirait un film de qualité "DVD" (~ 700 Mo - 1 Go) et des valeurs de CRF plus basses donneraient une qualité supérieure (fichiers plus volumineux).

Tom Kelly
la source
3
S'il vous plaît, donnez des exemples de la commande complète au lieu de vous connecter à un site Web externe (qui pourrait casser un jour :)
Jake Berger
1
@Vicky Chijwani fournit le code dans l'exemple ci-dessus. Cela convient mieux à un commentaire mais c’était ma première activité sur ce site. Le lien contient plus d'explications sur l'option crf mais n'est pas nécessaire pour que le code fonctionne.
Tom Kelly
27

Vous avez mentionné vouloir réduire la taille du fichier pour adapter davantage de vidéos sur un appareil mobile, ce qui est également mon cas d'utilisation. Toutes les réponses ici visent à réduire la qualité de la compression, mais personne n’a mentionné la réduction de la taille de la trame vidéo. C'est beaucoup plus rapide, environ 3 à 5 fois plus rapide que de recompresser selon mon expérience. Voir la documentation ffmpeg sur la mise à l' échelle pour plus d'informations.

ffmpeg -i input.mkv -vf "scale=iw/2:ih/2" half_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/3:ih/3" a_third_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/4:ih/4" a_fourth_the_frame_size.mkv
georgiecasey
la source
20

J'ai testé la plupart des autres réponses proposées à cette question. Les conclusions des données de test sont ci-dessous. Voici les réponses proposées que j'ai testées:

(BR) Modifiez le débit en utilisant:

ffmpeg -i $infile -b $bitrate $newoutfile 

(CR) Faites varier le facteur de taux constant en utilisant:

ffmpeg -i $infile -vcodec libx264 -crf 23 $outfile

(SZ) Modifiez la taille de l'écran vidéo (par exemple, la moitié de sa taille en pixels) à l'aide de:

ffmpeg -i $infile -vf "scale=iw/2:ih/2" $outfile

(BL) Changez le profil H.264 en "baseline" en utilisant:

ffmpeg -i $infile -profile:v baseline $outfile

(DF) Utilisez le traitement par défaut de ffmpeg, en utilisant:

ffmpeg -i $infile $outfile

LES DONNÉES

  • "taille" - taille en pixels de la vidéo convertie par rapport à l'original.
  • "bitrate" - débit des vidéos originales et converties.
  • "définition" - taille en pixels des vidéos.
  • "convertir" - le temps de convertir la vidéo en secondes.

J'ai calculé le débit cible pour (BL) en utilisant la méthode proposée.

=== Fichier A - Comment le noeud aide à propulser Angular-Fnbixa7Ts6M.mkv ===

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        64152 kb    214%       76%        40%        83%        76%
bitrate     411 kb/s    883        313        165        342        313
definition  1920x1080   1920x1080  1920x1080  960x540    1920x1080  1920x1080
convert     --          648        509        225        427        510

=== Fichier B - Utilisation de GraphQL avec Angular _ By - Lee Costello-OGyFxqt5INw.mkv ===

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        410301 kb   33%        109%       28%        143%       109%
bitrate     2687 kb/s   880        2920       764        3843       2920
definition  3840x2160   3840x2160  3840x2160  1920x1080  3840x2160  3840x2160   
convert     --           2307       3188       1116       2646       3278

CONCLUSIONS

  • La méthode (SZ) est certainement la méthode la plus rapide. C'était 2X à 4X plus rapide. Cela peut être très problématique pour les vidéos haute définition, car la conversion de toutes les autres méthodes a été plus longue que la durée réelle de la vidéo! Par exemple, la méthode (CR) prenait 53 minutes pour convertir la vidéo de 21 minutes.

  • La méthode (SZ) est certainement la meilleure méthode si la définition de la vidéo est plus grande que celle de l'écran qui l'affichera. Par exemple, si votre téléphone ne peut afficher qu'une image 1080p, il est inutile de lui envoyer une vidéo au format 3840x2160. Il serait préférable de réduire de moitié sa taille en 1080p.

  • Certaines des réponses proposées ont en réalité augmenté la taille de certaines vidéos. Par exemple, la méthode (BR) a plus que doublé la taille de l'échantillon 1080p. Il a cependant fait la taille 2160p un tiers. Pour l'échantillon haute définition, les méthodes (CR), (BL) et (DF) ont toutes AUGMENTÉ la taille de la vidéo.

Réponse correcte (ou meilleure)

Il est toujours préférable de réduire d’abord la résolution au maximum pris en charge par votre écran cible.

Si vous souhaitez réduire davantage la taille du fichier, cela dépendra des choix personnels. Vous pouvez réduire le contenu de l'information ou augmenter la compression.

  • Vous pouvez baisser davantage la résolution si cela ne vous concerne pas.

  • Si la vidéo n'inclut pas de scènes d'action rapides, vous souhaiterez peut-être réduire la fréquence d'images.

  • Si vous avez un processeur puissant et que l'espace est le seul problème, vous pouvez augmenter le taux de compression.

  • Le débit binaire est une combinaison de plusieurs facteurs. Il suffit donc de demander à ffmpeg de réduire le débit binaire pour ne pas obtenir les résultats souhaités.

  • Un autre moyen de réduire le contenu d'information consiste à réduire la profondeur de couleur. Comment faire cela n'a pas encore été discuté.

John Pankowicz
la source
13

Notez qu'il semble que ffmpeg déjà effectue une optimisation lorsqu'il est lancé sans options, avant d' essayer d'utiliser les paramètres que vous ne comprenez pas ou décider de perdre explicitement des informations, donner un essai à une conversion par défaut:

ffmpeg -i input.mp4 output.mp4

Dans mon cas, cela réduisait le débit de la vidéo et de l'audio (vous pouvez vérifier et comparer le fichier d'entrée et de sortie en l'exécutant ffprobe), transformant une vidéo de 700 Mo en une vidéo de 60 Mo d'une qualité apparemment similaire.

Skippy le Grand Gourou
la source
1
Passé de 4 Go à 2 Go avec cela, merci !!
Sam Hosseini
1
(de 10Mo à 1,2Mo, ffmpeg a automatiquement converti ma vidéo qui était en VP8 en VP9 )
sodimel
Cela a augmenté la taille de ma vidéo de 10,8 Mo à 14
Mo
3

J'ai une recette que je m'étais forgée à l'origine pour convertir les vidéos Motion JPEG que mon ancien appareil photo génère (ce sont de très grandes vidéos, chaque image étant une image JPEG complète) en h264. Voici une adaptation pour d'autres types de vidéos (cours, etc.).

Je n'utilise pas ffmpeg , mais mplayer et mencoder . Tout d'abord, nous devons démultiplier l'audio avec mplayer:

mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video>
  • Les paramètres -vo nullet -ao nullindiquent à mplayer de ne pas extraire de vidéo.

Dans les prochaines étapes, nous effectuerons une compression en 3 passes avec mencoder. Lors du premier passage, nous choisirons une compression appropriée en mode qualité constante ( paramètre crf ):

mencoder <video> -ovc x264 \ 
         -x264encopts ratetol=100:preset=veryslow:crf=<value>:pass=1 \
         -nosound -o video1.h264
  • Vous pouvez ajouter le paramètre slow_firstpass à l' option -x264encopts si vous êtes paranoïaque avec la qualité finale de la vidéo. Le manuel de Mencoder indique que cette option désactive certains paramètres qui «améliorent considérablement la vitesse de codage tout en n’ayant que peu ou pas d’impact sur la qualité de la passe finale». Alors, utilisez-le seulement à la dernière étape.

  • Vous devez essayer plusieurs valeurs pour crf . Essayez à partir de 25 et continuez à l'augmenter jusqu'à ce que vous remarquiez des artefacts dans la vidéo résultante (des valeurs plus élevées en compriment davantage). N'oubliez pas que les passes d'encodage suivantes amélioreront la qualité que vous avez choisie pour crf .

  • Les alternatives pour le preset veryslow sont plus lentes , lentes , moyennes, etc. Voir le manuel de mencoder pour la liste complète.

  • ratetol contrôle la variation de débit - Je ne suis pas sûr de bien faire les choses, mais je l’ai réglé sur la valeur maximale afin de laisser une liberté totale au mencoder de choisir le bon débit pour chaque scène.

Après la première passe, vous remarquerez que la dernière ligne vous donne le débit moyen que vous utiliserez aux étapes suivantes:

(...)
x264 [info]: kb/s:526.43

Modifiez le paramètre crf , recommandé lors du premier passage, en débit , requis lors des passages suivants:

mencoder <video> -ovc x264 \
       -x264encopts slow_firstpass:ratetol=100:preset=veryslow:bitrate=526:pass=3 \
       -nosound -o video2.h264

Ce deuxième codage lira les statistiques générées lors du premier passage ( divx2pass.loget divx2pass.log.mbtree) afin d’optimiser la compression.

  • Notez que vous utiliserez la même entrée vidéo et non la vidéo générée par le premier passage - le premier passage n'est utile que pour vérifier la qualité initiale.

  • Notez également que pass=3( non pass=2 ) générera un nouveau fichier de statistiques, vous permettant ainsi de répéter la dernière étape autant de fois que vous le souhaitez. Je fais habituellement pass=3deux fois, en faisant toujours attention au résultat.

En attendant, vous pouvez aussi compresser l'audio en utilisant lameou oggenc:

oggenc -q<n> <audio_pcm.wav>

Enfin, nous allons remux audio et vidéo

mencoder -audiofile <audio>.ogg video2.h264 -oac copy -ovc copy \
         -of lavf -lavfopts format=mp4 -o <video>.mp4
  • Le format de fichier -of lavf -lavfopts format=mp4généré mp4à l’aide des lavopts muxers.
Juliano B. Nequirito
la source
3

J'ai compressé une présentation vidéo HD de 40 minutes de 505 Mo à 183 Mo, ce
qui revient à passer de 100 Mo à 36 Mo.
La vidéo originale était HD et la sortie était presque nulle différence notable.
C'est un fichier vidéo "Je voudrais garder, mais la HD est excessive."
Voici la commande que j'ai utilisée avec des raisons:

ffmpeg -n -loglevel error -i inputfile.mp4 -vcodec libx264 -crf 28 -preset faster -tune film outputfilename.mp4

  • -n: éviter d’ écraser les fichiers de sortie (plus sûr pour les tests puis le traitement en lots)
  • -loglevel error : afficher les erreurs et masquer les lignes et les lignes de progression
  • -i inputfile.mp4 : nom du fichier d'entrée
  • -vcodec libx264: glissé de la réponse en haut ci-dessus
  • -crf 28: Compression à un seul passage avec une différence notable mineure ( "0 = sans perte, 23 = défaut, 51 = le moins bon; gamme subjectivement sain est 17- 28 " ) ref docs
  • -preset faster: Semble 2x plus rapide que l' encodage par défaut du temps de « moyen » ref docs
  • -tune film: Indiquer l' entrée est une vidéo HQ (autres options incluent 'dessin animé', 'StillImage' ..) ref docs
  • outputfilename.mp4 : nom du fichier de sortie

Pour un répertoire de fichiers vidéo:

for i in *.{avi,flv,m4v,mov,wmv,mp4,MP4,TS,mkv}; do ffmpeg -n -loglevel error -i "$i" -vcodec libx264 -crf 28 -preset faster -tune film "cc${i}"; done

Problèmes:

  • une manière plus propre de collecter "tous les fichiers vidéo" sans avoir toutes les extensions dans la commande
  • une manière plus propre de produire le nom de fichier sans le préfixe "cc" ET de pouvoir confirmer la vidéo avant de la supprimer
  • .webmles fichiers ne fonctionnent pas avec la commande. Dû échanger "cc${i}""${i%.*}.mp4"

Handbrake est une alternative open source avec une interface utilisateur

Jake Berger
la source
Ça marche. mais cela prend trop de temps. Y a-t-il une amélioration pour un temps d'exécution
réduit?
1

J'ai écrit un script bash pour réduire la taille de la vidéo et essayer automatiquement différentes valeurs de crf.

Fondamentalement, vous

  • choisissez une plage de valeurs crf
  • lancer le script
  • vérifiez la taille des vidéos générées et choisissez celle que vous voulez

Ceci est très pratique lorsque vous souhaitez atteindre une taille limite et que vous ne savez pas quelle est la valeur crf qui vous permettra de le faire.

J'espère que cela aidera quelqu'un. J'ai partagé avec mes collègues et tout le monde a trouvé utile.

#!/bin/bash

# bigger values of crf will lead to a bigger compression (smaller video size)
#for i in 1 2 3 4 5
for i in {25..28}
do
# you can remove the option -y if you want to be asked if to overwrite a file with the same name (leave the -y only if you understand what you are doing, otherwise you might rewrite an important file)
   ffmpeg -y -i NAMEOFTHEVIDEOTOCOMPRESS.mp4 -c:v libx264 -crf $i -preset veryfast -profile:v baseline -level 3.0 -strict -2 out_$i.mp4
   printf "\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Done compression at crf=$i \n\n"
done
kalmanIsAGameChanger
la source