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
libx264
jakoc:v
. W tymfs
przykładzie wideo nie jest transkodowane, ponieważ-c:v copy
jest używane. Tak więcpreset
icrf
również nie mają żadnego efektu.Odpowiedzi:
fs
Parametr zatrzyma kodowanie raz trafi jej wartość. Tak więc, jeśli dane wyjściowe trafią w10MB
znak 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%
źródło