Jak ograniczyć rozmiar pliku za pomocą ffmpeg?

10

Chcę zakodować wideo, które ma długość 60 sekund, do celu lub maksymalnego rozmiaru 10 MB .

Są dwa podejścia, które znam. Jeden jest wyjaśniony na FFMPEG-Wiki, a drugi znalazłem w dokumentacji. Niestety nie znalazłem wyjaśnienia, kiedy użyć jakiej metody.

Czy którakolwiek z tych metod jest zalecana? Jeśli nie, jakie są zalety / wady każdej metody?

1) Oblicz i ustaw Bitrate, aby dopasować długość filmu, jak wyjaśniono na stronie ffmpeg-wiki

(10 MB * 8192 [konwertuje MB na kilobity]) / 60 sekund = ~ 1365 kbitów / s całkowity bitrate 1365k - 128k (pożądany bitrate audio) = 1237k bitrate wideo

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) Użyj -fs parametru i pozwól, aby ffmpeg go zrozumiał.

ffmpeg -i input -c:v copy -c:a copy -preset medium -crf 23 -fs 10485760 output.mp4
Daniel
źródło
1
W pierwszym przykładzie w pierwszym kroku należy również użyć libx264jako c:v. W tym fsprzykładzie wideo nie jest transkodowane, ponieważ -c:v copyjest używane. Tak więc preseti crfrównież nie mają żadnego efektu.
Gyan
To mi pomogło
Ryan

Odpowiedzi:

11

fsParametr zatrzyma kodowanie raz trafi jej wartość. Tak więc, jeśli dane wyjściowe trafią w 10MBznak podczas kodowania 15. sekundy, oznacza to czas trwania pliku wyjściowego.

Jeśli chcesz się upewnić, że cały plik jest zakodowany, ale nie przekracza ustawionego rozmiaru docelowego, użyj metody bitrate. Aby uwzględnić narzuty i inne dane w docelowym rozmiarze, ustaw bitrate wideo nieco niższy o, powiedzmy, 1-2%

Gyan
źródło