Jak zakodować wideo przy 30 FPS ze zdjęć zrobionych przy 7 FPS

21

Nie mam żadnej wiedzy na temat kodowania wideo, mam aplikację napisaną w OpenGL i zapisuję wygenerowane klatki w pngobrazach. Ramki z mojej aplikacji mają 7 FPS i staram się stworzyć z nich wideo.

W tym celu używam ffmpeg w ten sposób

ffmpeg -framerate 30 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

który został pobrany z tej strony , ale zastanawiałem się, czy można mieć film pokazujący animację przy 30 klatkach na sekundę?

BRabbit27
źródło
Po prostu popraw -framerateparametr, aby uzyskać pożądane wyniki.
nullptr

Odpowiedzi:

21

Korzystam z poniższego kodu, aby zrobić to samo.

ffmpeg -framerate 30 -i img%03d.png -c:v libx264 -pix_fmt yuv420p -crf 23 output.mp4

Podział polecenia:

ffmpeg             <- call ffmpeg
  -framerate 30    <- set the input framerate to 30
  -i img%03d.png   <- read PNG images with filename img001, img002, img003, etc..
                     img can be changed to another prefix
                     %03d can be changed to %04d for 0001, %05d for 00001 formats, etc...
  -c:v libx264     <- Set the codec to libx264
  -pix_fmt yuv420p <- Set the pixel format to planar YUV 4:2:0, 12bpp
  -crf 23          <- set the Constant Rate Factor to 23 (default value)
  -output.mp4      <- the output filename

Odczytuje to dane wejściowe przy 30 fps ( -framerate 30opcja) i koduje je przy użyciu libx264kodeka o stałym współczynniku szybkości 23 ( -crf 23opcja).

Saaru Lindestøkke
źródło
26

Do rozważenia są dwie liczby klatek: wejście i wyjście.

Domyślnie wejściowa liczba klatek na sekundę wynosi 25, a dane wyjściowe będą używać tej samej liczby klatek na sekundę co dane wejściowe, chyba że zostanie podane inaczej.

Ta sama częstotliwość klatek na wejściu i wyjściu

Jeśli chcesz, aby dane wejściowe i wyjściowe miały taką samą liczbę klatek na sekundę, po prostu podaj wejściową liczbę klatek na sekundę. W tym przykładzie ustawiono częstotliwość odświeżania 30000/1001 (wideo NTSC):

ffmpeg -framerate 30000/1001 -i input output.mp4
  • Alternatywnie, w tym przykładzie możesz użyć ntsczamiast 30000/1001, ale nie używaj, 29.97ponieważ nie jest to dokładne ani poprawne. Zobacz inne aliasy klatek .

  • Ponieważ domyślna wejściowa liczba klatek na sekundę to 25, a jeśli ustawisz tylko wyjściową liczbę klatek na sekundę, klatki zostaną upuszczone lub zduplikowane w celu kompensacji. Dlatego w tej sytuacji ustawiana jest liczba klatek na sekundę.

Inna częstotliwość klatek dla wejścia i wyjścia

Czasami może być konieczne, aby wejściowa liczba klatek na sekundę i wyjściowa częstotliwość klatek były różne. Na przykład, możesz chcieć wprowadzić klatki z określoną częstotliwością, a następnie powielić lub upuścić klatki, aby dane wyjściowe miały inną częstotliwość klatek. Możesz to zrobić z powodu problemów ze zgodnością z pojemnikiem formatu wyjściowego, odtwarzaczem i / lub urządzeniem:

ffmpeg -framerate 10 -i input -r 25 output.mp4
  • W tym przykładzie ramki zostaną zduplikowane, aby przejść od 10 do 25. Dane wyjściowe konsoli powiedzą, czy ramki są upuszczane czy powielane.

  • W plików graficznych DEMUXERA zastosowania -framerate, natomiast stopa ramka wyjściowa jest ustawiana za pomocą -r.

  • W -pix_fmt yuv420pniektórych przypadkach może być konieczne dodanie tej opcji, jeśli wyprowadzasz wideo H.264 ( ffmpegwyjście konsoli ostrzeże Cię, jeśli zajdzie taka potrzeba). Spowoduje to użycie schematu podpróbkowania kolorów, który jest zgodny ze wszystkimi odtwarzaczami.

Llogan
źródło
2
ffmpeg wersja 3.2.2 mówi mi: Option framerate not found.:-(
erik
Tak masz rację. Niemniej jednak opcja -frameratejuż nie istnieje. Skasuję mój komentarz, ponieważ tak naprawdę nie ma to nic wspólnego z konwertowaniem serii zdjęć na wideo o określonej liczbie klatek na sekundę.
erik
4
@erik -framerateistnieje. Jest używany przez demuxery obrazu i rawvideo oraz niektóre urządzenia wejściowe, takie jak x11grab i v4l2.
llogan
1
Gdzie jest -framerateudokumentowana opcja ? Przeczytałem man ffmpegstronę, ale nie mogłem jej znaleźć. Może jakiś wskaźnik?
Atcold
1
OK, okazało się, że ... FFMPEG-DEVICES(1).
Atcold
1
ffmpeg -framerate 30 -i img%03d.png output.mp4  

będzie wystarczający w najnowszej wersji ffmpeg.

Tessaracter
źródło