Sie können die Größe einer Videodatei vor dem Codieren nicht wirklich abschätzen . Dies ist aufgrund der Funktionsweise des Codecs nicht möglich. Es ordnet jedem Frame eine bestimmte Anzahl von Bits zu, diese Menge hängt jedoch normalerweise vom Inhalt des Frames selbst ab.
Es gibt jedoch einige Lösungen.
1. Der billige:
Lassen Sie es codieren, überprüfen Sie die Dateigröße und werfen Sie die Datei erneut in den Papierkorb
2. Die "Problemumgehung":
Berechnen Sie die Dateigröße selbst mit einem einfachen Taschenrechner. Dies funktioniert nur bei konstanter Bitrate. Geben Sie dies beispielsweise -b 500k
für 500 kBit / s an. Sie müssen sicherstellen, dass Sie eine Bitrate angeben, die der Codec verwenden kann. Zum Beispiel gibt es keine Möglichkeit, ein 1080p-Video mit 200k
Bitrate zu komprimieren mpeg4
, da es viel mehr als das benötigen würde.
3. Die "echte" Lösung:
Die letzte Option, an die ich gedacht hatte, war das Weiterleiten der Ausgabe an /dev/null
und das Messen der Größe der weitergeleiteten Datei. Dies funktioniert jedoch nicht für alle Formate, da FFmpeg eine durchsuchbare Datei benötigt, um eine gültige Ausgabe zu erzeugen.
Trotzdem funktioniert es für AVI ziemlich gut. Der folgende Befehl wird weitergeleitet /dev/null
, wodurch keine Spur der Datei selbst hinterlassen wird, und gibt schließlich die codierte Dateigröße aus.
ffmpeg -i input.avi -vcodec mpeg4 -b 3M -f avi pipe:1 | pv > /dev/null
… Zum Beispiel so:
5.42MB 0:00:10 [ 521kB/s]
Was tut es?
- Sie müssen das Format mit angeben
-f avi
. Andernfalls weiß FFmpeg nicht, welches Format verwendet werden soll.
pipe:1
Weist FFmpeg an , die Ausgabe in eine Pipe zu schreiben .
- Wir werden diese Ausgabe kurz in den Pipe Viewer einspeisen
pv
.
- Der Pipe Viewer misst die übertragene Größe und gibt Ihr Video an aus
/dev/null
.
Der einzige kleine Nachteil ist, dass die Ausgabe etwas seltsam aussieht, bis das Video fertig ist. Ich habe noch keine Möglichkeit gefunden, die Ausgabe von FFmpeg vollständig zu deaktivieren und damit pv
zu arbeiten.