Mam klatki wideo w formacie PNG przy 1 FPS i próbuję przekonwertować je na wideo za pomocą ffmpeg.
Jeśli zrobię coś takiego:
ffmpeg -i data/input-%4d.png data/output.mp4
Dostaję wideo przy 25 klatkach na sekundę, co jest w zasadzie bardzo szybkim przewijaniem do przodu wejścia (które jest rejestrowane przy 1 klatce na sekundę).
Jeśli spróbuję:
ffmpeg -i data/input-%4d.png -r 1 data/output.mp4
Dostaję coś, w co VLC nie chce grać :)
Teraz, jeśli wezmę pierwszy film (FF) i zastosuję filtr, aby go spowolnić (np. -filter:v 'setpts=24.0*PTS'
), Mogę sprawić, aby grał jak wideo 1 FPS, ale oczywiście cena jest wielkością pliku. To chyba generuje kilka powtarzających się ramek.
Pytanie brzmi: w jaki sposób mogę stworzyć film, który ma dokładnie 1 FPS i faktycznie jest odtwarzany z tą prędkością? Format wyjściowy, btw, nie jest dla mnie tak ważny.
źródło
ffmpeg
jest wystarczająco inteligentny, aby dowiedzieć się kodeka wideo tylko z rozszerzeniem formatu pojemnik.mp4
. Spróbuj dodać-vcodec libx264 -vpre hq
do wiersza poleceń, aby podać kodek i parametry kodowania.-r 1
.Odpowiedzi:
Jeśli chcesz mieć jeden wiersz dla FFMPEG, który generuje wideo odtwarzane z prędkością 1 klatki na sekundę, to co chcesz zrobić, to określić liczbę klatek na sekundę dla wejścia i wyjścia, jak poniżej:
Te
-r 1
środki wideo będzie grać w 1 oryginalnych obrazów na sekundę.Te
-r 10
środki wideo będzie grać przy 10 klatkach na sekundę.(
-pix_fmt yuv420p
Jest tylko po to, aby zapewnić kompatybilność z szeroką gamą programów do odtwarzania. Jest tutaj wymagane, na przykład, aby wideo mogło być odtwarzane przez Windows Media Player.)Przetestowałem wiele różnych klatek wyjściowych, a 10 wydaje się być najniższą liczbą, jaką możesz użyć, która nadal tworzy wideo, które odtworzy VLC.
Oczywiście powyższe polecenie oznacza, że każdy oryginalny obraz jest zwielokrotniany, ale jest to metoda prostsza niż ta, o której wspominałeś, i w zależności od kodeka może nie wytworzyć wideo dużo większego niż prawdziwy 1-FPS wideo.
Aby to przetestować, właśnie wyprodukowałem prawdziwy film 1-FPS, który wyniósł 2,24 kiB. Następnie stworzyłem wideo z tymi samymi obrazami wejściowymi, ale generowanymi przy 24 FPS, i wyszło to do 5,76 kiB. To nieco ponad dwa razy więcej i prawie 24 razy więcej. :)
źródło
Użyj obu
-framerate
i-r
Na przykład, aby mieć końcowy film, który wygląda jak 1FPS:
Jest to podobne do konwertowania klatek PNG na wideo przy 1 FPS | Mówi, że Unix i Linux Stack Exchange , ale potrzebowałem
-framerate
zamiast tego-r
, aby działało.Zostało to wspomniane na wiki pod adresem : http://trac.ffmpeg.org/wiki/Slideshow#Framerates
Ustawia wyjściową liczbę klatek na sekundę
30
, którą VLC może obsłużyć, i kopiuje każde zdjęcie 30 razy, dzięki czemu wyjściowe wideo wydaje się mieć 1 FPS. Zobacz także: Problemy z odtwarzaniem w VLC przy niskiej liczbie klatek na sekundę z obrazów przy użyciu ffmpeg | Przepełnienie stosuVLC może wtedy normalnie odtwarzać wideo.
Testowany na Ubuntu 16.10, VLC 2.2.4,
ffmpeg
3.0.5, w katalogu z 10 PNG.Zobacz także: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg
źródło
-r
i-framerate
?man
stron, daj mi znać ;-) Znaczącym cytatem jest „-r Jako opcję wprowadzania, zignoruj wszystkie znaczniki czasu zapisane w pliku i zamiast tego wygeneruj znaczniki czasu przy założeniu stałej liczby klatek na sekundę. Nie jest to to samo, co opcja -framerate stosowana w niektórych formatach wejściowych, takich jak image2 lub v4l2 (kiedyś była taka sama w starszych wersjach FFmpeg). W razie wątpliwości użyj opcji -framerate zamiast opcji wejściowej -r. "Co jeśli nieznacznie wzmocnisz swój drugi przykład w następujący sposób:
Na
-r 1
potrzeby przyjść przed plików .png, a nie po.Z dokumentacji FFmpeg :
źródło
Jest to błąd w VLC (który nadal istnieje w wersji 3.0.6). Po kilku eksperymentach zdałem sobie sprawę, że VLC ulega awarii dla filmów z liczbą klatek na sekundę mniejszą niż 10 . Więc wszystkie filmy z 10 FPS lub więcej nie powinny stanowić problemu. Dlatego obecnie nie ma czystego sposobu na uzyskanie filmu z 1 klatką na sekundę, który można odtwarzać w VLC ( nie poddawaj się, czytaj dalej ).
Jednym obejściem jest - jak pokazano w powyższej odpowiedzi - aby sfałszować efekt 1 FPS przez powielenie zdjęć (gdy faktycznie mamy FPS równy 10 lub więcej, co jest dobre dla VLC).
Przykład: jeśli masz folder z 12 obrazami i chcesz wygenerować wideo z 1 klatką na sekundę (którą można odtwarzać w VLC), musisz powielić każdy obraz wiele razy (powiedzmy 10 razy), a następnie powiedzieć FFMPEG wygenerować wideo 10 FPS. W ten sposób otrzymamy film o łącznej liczbie klatek 120, w którym każdy obraz będzie odtwarzany przez 1 sekundę (ponieważ jest powielany 10 razy), co jest po prostu fałszywe za 1 FPS.
Wolę używać
fps
parametru niż-r
(co pokazano w innej odpowiedzi), co może w niektórych przypadkach być problematyczne (zgodnie z oficjalną dokumentacją ).Ponieważ wejście
-framerate
jest niższe niż wyjściefps
, FFMPEG powieli klatki, aby osiągnąć pożądaną wyjściową częstotliwość klatek (która wynosi 10 zgodnie z powyższym poleceniem).Ważne jest również, aby zauważyć, że kolejność
-framerate
i-vf fps
jest ważna , ponieważ ta konfiguracja zostanie zastosowana do następnego wspomnianego wideo (wejściowego lub wyjściowego). To jest zgodnie z oficjalnymi dokumentami :źródło