Wie kann ich herausfinden, wie groß meine verschlüsselte Datei sein wird?

9

Ich konvertiere ein Video mit dem folgenden Befehl:

ffmpeg -i "input.avi" -vcodec mpeg4 -r 15 -sameq "output.avi"

Ich interessiere mich jedoch nur für die Dateigröße von output.avi. Gibt es einen Befehl, den ich ffmpeg geben kann, damit es keine Datei schreibt, sondern mir sagt, wie groß es wäre?

Fidel
quelle

Antworten:

10

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 500kfü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 200kBitrate 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/nullund 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:1Weist 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 pvzu arbeiten.

slhck
quelle
wow, danke für die umfassende Antwort slhck
Fidel