Wie kann ich die Dateigröße mit ffmpeg begrenzen?

10

Ich möchte ein Video mit einer Länge von 60 Sekunden auf ein Ziel oder eine maximale Größe von 10 MB codieren .

Ich kenne zwei Ansätze. Einer wird im FFMPEG-Wiki erklärt, der andere in der Dokumentation. Leider habe ich keine Erklärung gefunden, wann welche Methode anzuwenden ist.

Wird eine dieser Methoden empfohlen? Wenn nicht, welche Vor- und Nachteile hat jede Methode?

1) Berechnen Sie Bitrate und stellen Sie es so ein, dass es der Länge des Videos entspricht, wie im ffmpeg-Wiki erläutert

(10 MB * 8192 [konvertiert MB in Kilobit]) / 60 Sekunden = ~ 1365 kbit / s Gesamtbitrate 1365k - 128k (gewünschte Audio-Bitrate) = 1237k Video-Bitrate

ffmpeg -y -i input -c:v copy -preset medium -b:v 1237k -pass 1 -c:a copy -b:a 128k -f mp4 /dev/null && \
ffmpeg -i input -c:v libx264 -preset medium -b:v 1237k -pass 2 -c:a libfdk_aac -b:a 128k output.mp4

2) Verwenden Sie den -fs Parameter und lassen Sie ffmpeg es herausfinden.

ffmpeg -i input -c:v copy -c:a copy -preset medium -crf 23 -fs 10485760 output.mp4
Daniel
quelle
1
In Ihrem ersten Beispiel sollte der erste Schritt auch libx264als verwenden c:v. In diesem fsBeispiel wird das Video nicht transkodiert, da -c:v copyes verwendet wird. Also haben die presetund crfauch keine Wirkung.
Gyan
Dies war hilfreich für mich: stackoverflow.com/a/34547102/470749
Ryan

Antworten:

11

Der fsParameter stoppt die Codierung, sobald sie ihren Wert erreicht. Wenn also die Ausgabe 10MBbeim Codieren der 15. Sekunde die Marke erreicht, ist dies die Dauer Ihrer Ausgabedatei.

Wenn Sie sicherstellen möchten, dass die gesamte Datei codiert ist, die festgelegte Zielgröße jedoch nicht überschreitet, verwenden Sie die Bitratenmethode. Stellen Sie die Videobitrate etwas niedriger ein, z. B. 1-2%, um den Muxing-Overhead und andere Daten innerhalb der Zielgröße zu berücksichtigen

Gyan
quelle