Wie kann ich ein Video mit ffmpeg verkleinern?

201

Wie kann ich ffmpegdie Größe eines Videos durch Verringern der Qualität verringern (natürlich so gering wie möglich, aber ich muss es auf einem Mobilgerät ausführen, auf dem nicht viel Speicherplatz verfügbar ist)?

Ich habe vergessen, noch etwas zu schreiben. Wenn das Video Untertitel (* .srt oder * .sub) verwenden kann, möchte ich sie auch konvertieren, um sie an die Parameter der konvertierten Videodatei anzupassen.

xralf
quelle
4
Ich habe es nicht benutzt, aber die ffmpegManpage zeigt eine -fsOption zur Begrenzung der Ausgabegröße. Funktioniert so etwas ffmpeg -i in.avi -fs 100M out.avi?
Kevin
1
Ich werde Sie nicht auf die Manpage man ffmpeg | wc -l --> 5254
3
Das .aviist nicht das Hauptproblem .. aviist nur ein Container. Das Hauptproblem ist, welche Codecs Sie verwenden. Viele (die meisten?) .aviVids verwenden Codecs älteren Stils (z. B. XviD), die in Ordnung sind, aber im Vergleich zur späteren Codec-Generation bei gleicher Qualität größer sind Enge Codierung durch Verwendung des H.264Videokomprimierungsstandards (z. B. Codec x264) und aacKomprimierung für Audio. Der Container und die Codecs, die Sie verwenden, liegen bei Ihnen und Ihrem Telefon. Der .mp4Container wird gut angenommen. siehe diesen Link
Peter.O
@ Kevin Dies will mehr Parameter für die Konvertierung.
Xralf
@hesse Was bedeutet das?
Xralf

Antworten:

277

Siehe diese Antwort. Der Einfachheit halber unten angegeben:

Berechnen Sie die benötigte Bitrate, indem Sie 1 GB durch die Videolänge in Sekunden dividieren. Verwenden Sie für ein Video mit einer Länge von 16:40 (1000 Sekunden) eine Bitrate von 1000000 Bytes / Sek .:

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

Weitere erwägenswerte Optionen sind das Einstellen des Konstantratenfaktors, der die durchschnittliche Bitrate senkt, aber eine bessere Qualität beibehält. Variieren Sie die CRF zwischen 18 und 24 - je niedriger, desto höher die Bitrate.

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

Variieren Sie den Codec je nach Bedarf - libx264 ist möglicherweise verfügbar, wenn libx265 nicht verfügbar ist, was zu einer geringfügig größeren resultierenden Datei führt.

Vicky Chijwani
quelle
Das Video mit einer Größe von 338 MB wurde auf eine Größe von 130 MB reduziert. Die Qualität nahm schnell ab. Gibt es eine Erklärung für diesen Prozess? Der ursprüngliche Autor erklärt seine Richtlinie nicht.
Xralf
13
Der zweite Befehl, bei dem -crf 24ich ein 255,3 MB großes Video verwendete, reduzierte es auf 72,7 MB, ohne die Qualität merklich zu beeinträchtigen. Habe ein positives Votum!
Patrick Roberts
2
Ein ~ 2G-Video auf beeindruckende Weise auf 14 MB reduziert, sieht immer noch gut aus. Dies war das erste Suchergebnis und genau das, wonach ich gesucht habe. Danke!
Sinisterstuf
5
Gut zu wissen, dass Sie jetzt die libx265Größe noch weiter reduzieren können.
ZN13
6
Gebraucht ffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi. Ein 100-MB-Video wurde auf 9 MB reduziert. Sehr geringe Änderung der Videoqualität. Danke!
Alpha_989
32

Sofern Sie nicht nach einer bestimmten Bitrate suchen, würde ich die -crfOption empfehlen . Dies ist die am häufigsten verwendete x264Kodierung: http://slhck.info/articles/crf

Kurz gesagt: Eine CRF von 23 würde einen Film in "DVD" -Qualität (~ 700 MB-1 GB) erzeugen, und niedrigere CRF-Werte würden eine höhere Qualität (größere Dateien) ergeben.

Tom Kelly
quelle
3
Bitte geben Sie Beispiele für den vollständigen Befehl an, anstatt auf eine externe Website zu verlinken (die eines Tages kaputt gehen könnte :)
Jake Berger,
1
@ Vicky Chijwani liefert den Code im obigen Beispiel. Dies ist besser für einen Kommentar geeignet, aber es war meine erste Aktivität auf dieser Site. Der Link enthält weitere Erklärungen zur Option crf, ist jedoch nicht erforderlich, damit der Code funktioniert.
Tom Kelly
27

Sie haben erwähnt, dass Sie die Dateigröße reduzieren möchten, um mehr Videos auf einem mobilen Gerät unterzubringen. Dies ist auch mein Anwendungsfall. Alle Antworten hier beziehen sich auf die Reduzierung der Komprimierungsqualität, aber niemand hat die Reduzierung der Videobildgröße erwähnt. Es ist viel schneller, etwa drei- bis fünfmal schneller als das erneute Komprimieren. Weitere Informationen finden Sie in den ffmpeg-Dokumenten zur Skalierung .

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
quelle
20

Ich habe die meisten anderen vorgeschlagenen Antworten auf diese Frage getestet. Die Testdaten Schlussfolgerungen sind unten. Dies sind die vorgeschlagenen Antworten, die ich getestet habe:

(BR) Ändern Sie die Bitrate mit:

ffmpeg -i $infile -b $bitrate $newoutfile 

(CR) Variieren Sie den Constant Rate Factor mit:

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

(SZ) Ändern Sie die Bildschirmgröße des Videos (z. B. auf die Hälfte seiner Pixelgröße), indem Sie Folgendes verwenden:

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

(BL) Ändern Sie das H.264-Profil in "Baseline", indem Sie Folgendes verwenden:

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

(DF) Verwenden Sie die Standard-ffmpeg-Verarbeitung unter Verwendung von:

ffmpeg -i $infile $outfile

DATEN

  • "Größe" - Prozent Pixelgröße des konvertierten Videos im Verhältnis zum Original.
  • "Bitrate" - Bitraten von Original- und konvertierten Videos.
  • "Definition" - Pixelgröße von Videos.
  • "convert" - Zeit zum Konvertieren des Videos in Sekunden.

Ich habe die Ziel-Bitrate für (BL) mit der vorgeschlagenen Methode berechnet.

=== Datei A - Wie der Knoten dabei hilft, Angular-Fnbixa7Ts6M.mkv voranzutreiben ===

            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

=== Datei B - Verwenden von GraphQL mit 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

SCHLUSSFOLGERUNGEN

  • Die (SZ) Methode ist definitiv die schnellste Methode. Es war 2X bis 4X schneller. Dies kann bei HD-Videos sehr problematisch sein, da die Konvertierung aller anderen Methoden länger dauerte als die tatsächliche Länge des Videos! Die (CR) -Methode benötigte beispielsweise 53 Minuten, um das 21-minütige Video zu konvertieren.

  • Die (SZ) -Methode ist definitiv die beste Methode, wenn die Definition des Videos größer ist als die Definition des Bildschirms, auf dem es angezeigt wird. Wenn Ihr Telefon beispielsweise nur ein 1080p-Bild anzeigen kann, ist das Senden eines 3840x2160-Videos eine reine Verschwendung. Es wäre am besten, die Hälfte seiner Größe auf 1080p.

  • Einige der vorgeschlagenen Antworten haben die Größe einiger Videos sogar ERHÖHT. Beispielsweise hat die (BR) -Methode die Größe des 1080p-Samples mehr als verdoppelt. Die 2160p-Größe hat es jedoch auf ein Drittel gebracht. Für das hochauflösende Sample haben die Methoden (CR), (BL) und (DF) die Größe des Videos erhöht.

Richtige (oder beste) Antwort

Es ist immer am besten, zuerst die Auflösung auf das von Ihrer Zielanzeige unterstützte Maximum zu verringern.

Wenn Sie die Dateigröße weiter reduzieren möchten, hängt dies von den persönlichen Entscheidungen ab. Sie können entweder den Informationsgehalt reduzieren oder die Komprimierung erhöhen.

  • Sie können die Auflösung weiter verringern, wenn Sie das nicht interessiert.

  • Wenn das Video keine schnellen Actionszenen enthält, können Sie die Bildrate verringern.

  • Wenn Sie einen leistungsstarken Prozessor haben und nur Speicherplatz zur Verfügung steht, können Sie die Komprimierungsrate erhöhen.

  • Die Bitrate ist eine Kombination mehrerer Faktoren. Wenn Sie ffmpeg also nur zum Verringern der Bitrate auffordern, erhalten Sie möglicherweise nicht die gewünschten Ergebnisse.

  • Eine andere Möglichkeit, den Informationsgehalt zu verringern, besteht darin, die Farbtiefe zu verringern. Wie das geht, wurde noch nicht besprochen.

John Pankowicz
quelle
13

Beachten Sie, dass bei Ausführung ohne Optionen anscheinend ffmpeg bereits einige Optimierungen vorgenommen wurden. Bevor Sie also versuchen, Einstellungen zu verwenden, die Sie nicht verstehen oder die Sie nicht explizit für den Verlust von Informationen entscheiden, sollten Sie eine Standardkonvertierung ausprobieren:

ffmpeg -i input.mp4 output.mp4

In meinem Fall wurde die Bitrate von Video und Audio reduziert (Sie können die Eingabe- und Ausgabedatei überprüfen und vergleichen, indem Sie sie ffprobeausführen), wodurch ein 700-MB-Video in ein 60-MB-Video mit scheinbar ähnlicher Qualität umgewandelt wurde.

Skippy le Grand Gourou
quelle
1
Ging von 4 GB auf 2 GB mit diesem, danke!
Sam Hosseini
1
(von 10Mo auf 1,2Mb konvertierte ffmpeg automatisch mein Video, das sich in VP8 auf VP9 befand )
Sodimel
Dies erhöhte die Größe meines Videos von 10,8 MB auf
14
3

Ich habe ein Rezept, das ich ursprünglich für mich selbst geschmiedet habe, um die Motion JPEG-Videos, die meine alte Kamera erzeugt (es handelt sich um sehr große Videos, da jedes Bild ein gesamtes JPEG-Bild ist), in h264 umzuwandeln. Hier ist eine Anpassung für andere Arten von Videos (Kurse usw.).

Ich benutze nicht ffmpeg , sondern mplayer und mencoder . Zuerst müssen wir das Audio mit mplayer demuxen:

mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video>
  • Der Parameter -vo nullund -ao nullweist mplayer an, kein Video zu extrahieren.

In den nächsten Schritten führen wir eine 3-Pass-Komprimierung mit dem Mencoder durch. Beim ersten Durchgang wählen wir eine geeignete Komprimierung im konstanten Qualitätsmodus ( crf- Parameter) als Startpunkt:

mencoder <video> -ovc x264 \ 
         -x264encopts ratetol=100:preset=veryslow:crf=<value>:pass=1 \
         -nosound -o video1.h264
  • Sie können den -x264encopts den Parameter slow_firstpass hinzufügen, wenn Sie mit der endgültigen Qualität des Videos nicht einverstanden sind. Das Mencoder-Handbuch besagt, dass diese Option einige Parameter deaktiviert, die "die Codierungsgeschwindigkeit erheblich verbessern, ohne die Qualität des endgültigen Durchgangs zu beeinträchtigen". Verwenden Sie es also nur im letzten Schritt.

  • Sie sollten mehrere Werte für crf ausprobieren - versuchen Sie es ab 25 und erhöhen Sie sie weiter, bis Sie Artefakte im resultierenden Video bemerken (höhere Werte komprimieren mehr). Denken Sie daran, dass nachfolgende Codierungsdurchläufe die für crf ausgewählte Qualität verbessern .

  • Alternativen für die sehr langsame Voreinstellung sind Langsam , Langsam , Mittel usw. Die vollständige Liste finden Sie im Handbuch des Mencoders.

  • ratetol steuert die Bitratenvariation - Ich bin nicht sicher, ob ich hier das Richtige tue, aber ich stelle den Maximalwert ein, damit der Mencoder die volle Freiheit hat, die richtige Bitrate für jede Szene zu wählen.

Nach dem ersten Durchgang werden Sie feststellen, dass die letzte Zeile die durchschnittliche Bitrate angibt, die Sie in den nächsten Schritten verwenden werden:

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

Ändern Sie den im ersten Durchgang empfohlenen Parameter crf in Bitrate , der in den folgenden Durchgängen erforderlich ist:

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

Diese Codierung für den zweiten Durchgang liest die Statistiken, die beim ersten Durchgang ( divx2pass.logund divx2pass.log.mbtree) generiert wurden , um die Komprimierung zu optimieren.

  • Beachten Sie, dass Sie denselben Videoeingang verwenden, nicht den, der beim ersten Durchgang generiert wurde. Das Ausgangsvideo des ersten Durchgangs ist nur nützlich, um die ursprüngliche Qualität zu überprüfen.

  • Beachten Sie auch, dass das pass=3( nicht pass=2 ) eine neue Statistikdatei generiert, sodass Sie den letzten Schritt so oft wiederholen können, wie Sie möchten. Normalerweise mache ich das pass=3zweimal und achte dabei immer auf die Bitrate des Ergebnisses.

In der Zwischenzeit können Sie das Audio auch mit lameoder komprimieren oggenc:

oggenc -q<n> <audio_pcm.wav>

Zum Schluss werden wir Audio und Video remuxen

mencoder -audiofile <audio>.ogg video2.h264 -oac copy -ovc copy \
         -of lavf -lavfopts format=mp4 -o <video>.mp4
  • Das -of lavf -lavfopts format=mp4erzeugt das mp4Dateiformat mit den Lavopts-Muxern.
Juliano B. Nequirito
quelle
3

Ich habe eine 40-minütige HD-Videopräsentation von 505 MB auf 183
MB komprimiert.
Das Originalvideo war HD und die Ausgabe war fast ohne wahrnehmbaren Unterschied.
Es ist eine Videodatei "Ich würde gerne bleiben, aber HD ist übertrieben."
Hier ist der Befehl, den ich mit Gründen verwendet habe:

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

  • -n: Überschreiben von Ausgabedateien vermeiden (sicherer zum Testen als zum Stapeln)
  • -loglevel error : Zeige Fehler und verstecke die Zeilen und Zeilen des Fortschritts
  • -i inputfile.mp4 : Name der Eingabedatei
  • -vcodec libx264: wischte von der oberen Antwort
  • -crf 28: Single-Pass-Komprimierung mit geringfügigen spürbaren Unterschieden ( "0 = verlustfrei, 23 = Standard, 51 = am schlechtesten; subjektiv vernünftiger Bereich liegt zwischen 17 und 28 " ) ref docs
  • -preset faster: Sieht 2x schneller aus als die Standardcodierungszeit von "mittleren" Referenzdokumenten
  • -tune film: Eingabe angeben ist ein HQ-Video (andere Optionen umfassen 'Cartoon', 'Standbild' ..) ref docs
  • outputfilename.mp4 : Name der Ausgabedatei

Für ein Verzeichnis von Videodateien:

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

Probleme:

  • Eine sauberere Methode, um "alle Videodateien" zu sammeln, ohne alle Erweiterungen im Befehl zu haben
  • Eine einfachere Möglichkeit, den Dateinamen ohne das Präfix "cc" auszugeben UND das Video vor dem Löschen zu bestätigen
  • .webmDateien funktionieren nicht mit dem Befehl. Musste tauschen "cc${i}""${i%.*}.mp4"

Handbremse ist eine Open-Source-Alternative mit einer Benutzeroberfläche

Jake Berger
quelle
Es klappt. aber es dauert zu lange. Gibt es eine Verbesserung für weniger Ausführungszeit
Nirali
1

Ich habe ein Bash-Skript geschrieben, um die Größe des Videos zu reduzieren und automatisch verschiedene crf-Werte auszuprobieren.

Grundsätzlich wirst du

  • Wählen Sie einen Bereich von CRF-Werten
  • Führen Sie das Skript aus
  • Überprüfen Sie die Größe der generierten Videos und wählen Sie die gewünschte aus

Dies ist sehr praktisch, wenn Sie eine Größenbeschränkung haben, die Sie erreichen möchten, und Sie nicht wissen, wie hoch der CRF-Wert ist, mit dem Sie dies tun können.

Ich hoffe das hilft jemandem. Ich teilte mit meinen Kollegen und alle fanden es hilfreich.

#!/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
quelle