Wie kann ich ffmpeg
die 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.
video
ffmpeg
compression
xralf
quelle
quelle
ffmpeg
Manpage zeigt eine-fs
Option zur Begrenzung der Ausgabegröße. Funktioniert so etwasffmpeg -i in.avi -fs 100M out.avi
?man ffmpeg | wc -l --> 5254
.avi
ist nicht das Hauptproblem ..avi
ist nur ein Container. Das Hauptproblem ist, welche Codecs Sie verwenden. Viele (die meisten?).avi
Vids 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 desH.264
Videokomprimierungsstandards (z. B. Codecx264
) undaac
Komprimierung für Audio. Der Container und die Codecs, die Sie verwenden, liegen bei Ihnen und Ihrem Telefon. Der.mp4
Container wird gut angenommen. siehe diesen LinkAntworten:
Siehe diese Antwort. Der Einfachheit halber unten angegeben:
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.
quelle
-crf 24
ich 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!libx265
Größe noch weiter reduzieren können.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!Sofern Sie nicht nach einer bestimmten Bitrate suchen, würde ich die
-crf
Option empfehlen . Dies ist die am häufigsten verwendetex264
Kodierung: http://slhck.info/articles/crfKurz 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.
quelle
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 .
quelle
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:
(CR) Variieren Sie den Constant Rate Factor mit:
(SZ) Ändern Sie die Bildschirmgröße des Videos (z. B. auf die Hälfte seiner Pixelgröße), indem Sie Folgendes verwenden:
(BL) Ändern Sie das H.264-Profil in "Baseline", indem Sie Folgendes verwenden:
(DF) Verwenden Sie die Standard-ffmpeg-Verarbeitung unter Verwendung von:
DATEN
Ich habe die Ziel-Bitrate für (BL) mit der vorgeschlagenen Methode berechnet.
=== Datei A - Wie der Knoten dabei hilft, Angular-Fnbixa7Ts6M.mkv voranzutreiben ===
=== Datei B - Verwenden von GraphQL mit Angular _ By - Lee Costello-OGyFxqt5INw.mkv ===
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.
quelle
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: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
ffprobe
ausführen), wodurch ein 700-MB-Video in ein 60-MB-Video mit scheinbar ähnlicher Qualität umgewandelt wurde.quelle
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:
-vo null
und-ao null
weist 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:
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:
Ändern Sie den im ersten Durchgang empfohlenen Parameter crf in Bitrate , der in den folgenden Durchgängen erforderlich ist:
Diese Codierung für den zweiten Durchgang liest die Statistiken, die beim ersten Durchgang (
divx2pass.log
unddivx2pass.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
( nichtpass=2
) eine neue Statistikdatei generiert, sodass Sie den letzten Schritt so oft wiederholen können, wie Sie möchten. Normalerweise mache ich daspass=3
zweimal und achte dabei immer auf die Bitrate des Ergebnisses.In der Zwischenzeit können Sie das Audio auch mit
lame
oder komprimierenoggenc
:Zum Schluss werden wir Audio und Video remuxen
-of lavf -lavfopts format=mp4
erzeugt dasmp4
Dateiformat mit den Lavopts-Muxern.quelle
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 docsoutputfilename.mp4
: Name der AusgabedateiFü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:
.webm
Dateien funktionieren nicht mit dem Befehl. Musste tauschen"cc${i}"
→"${i%.*}.mp4"
Handbremse ist eine Open-Source-Alternative mit einer Benutzeroberfläche
quelle
Sie müssen eine 2-Pass-Codierung verwenden, um ein Video innerhalb einer festgelegten Dateigröße (Bitrate) "anzupassen", ohne die Qualität zu drastisch zu verringern. Dies ist ein ziemlich detailliertes Thema: http://web.archive.org/web/20171130050515/http://www.mpabo.com/2014/12/14/ffmpeg-and-x264-encoding-guide/
quelle
Ich habe ein Bash-Skript geschrieben, um die Größe des Videos zu reduzieren und automatisch verschiedene crf-Werte auszuprobieren.
Grundsätzlich wirst du
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.
quelle