Konwersja klatek PNG na wideo przy 1 FPS


21

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.


Nie jestem pewien, ffmpegjest wystarczająco inteligentny, aby dowiedzieć się kodeka wideo tylko z rozszerzeniem formatu pojemnik .mp4. Spróbuj dodać -vcodec libx264 -vpre hqdo wiersza poleceń, aby podać kodek i parametry kodowania.
Warren Young,

Właściwie to się udało, a jak już wspomniałem, działało dobrze i dawało dziwne wyniki, gdy dodałem -r 1.
Assaf Lavie

Myślę, że możesz mieć więcej szczęścia w odpowiedzi na ffmpeg na stackoverflow.com lub superuser.com .
Damien

Odpowiedzi:


19

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:

ffmpeg -r 1 -i data / input-% 4d.png -pix_fmt yuv420p -r 10 data / output.mp4

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 yuv420pJest 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. :)


+1 na -pix_fmt. Łatwo zapomnieć, że niektórzy nalegają na używanie WMP :-)
Smalltown2k

dlaczego chcesz, aby format wyjściowy wynosił 10 fps, podczas gdy wejście ma tylko 1? Czy nie stworzyłoby 90% zbędnych ramek, które są dokładnie takie same?
Herbert

@Herbert tworzy zbędne klatki, dzięki czemu można uzyskać częstotliwość klatek do 10, co jest zrobione tylko po to, aby VLC nie narzekało i wizualnie nie zmieniało wideo. Koder jest wystarczająco inteligentny, aby zobaczyć, że wszystkie ramki są identyczne, więc nie kończy się na znacznie większym pliku
chiliNUT

@chiliNUT jasne, klatka kluczowa, która nie wszystkie formaty, ale większość rozsądnych formatów. Dzięki!
Herbert

5

Użyj obu -frameratei-r

Na przykład, aby mieć końcowy film, który wygląda jak 1FPS:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
    -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Jest to podobne do konwertowania klatek PNG na wideo przy 1 FPS | Mówi, że Unix i Linux Stack Exchange , ale potrzebowałem -frameratezamiast 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 stosu

VLC może wtedy normalnie odtwarzać wideo.

Testowany na Ubuntu 16.10, VLC 2.2.4, ffmpeg3.0.5, w katalogu z 10 PNG.

Zobacz także: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg


Jaka jest różnica między -ri -framerate?
Royi,

@Royi Naprawdę nie wiem, poza tym, że to jedyna rzecz, która działała dla mnie :-) Ale jeśli udało ci się wyodrębnić ją ze manstron, 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. "
Ciro Santilli 事件 改造 中心 法轮功 六四 事件

3

Co jeśli nieznacznie wzmocnisz swój drugi przykład w następujący sposób:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4

Na -r 1potrzeby przyjść przed plików .png, a nie po.

Z dokumentacji FFmpeg :

Zasadniczo opcje są stosowane do następnego określonego pliku. Dlatego kolejność jest ważna i możesz mieć tę samą opcję w wierszu poleceń wiele razy. Każde wystąpienie jest następnie stosowane do następnego pliku wejściowego lub wyjściowego.


Niestety to nie działa. Jednak wspomnienie, że zamówienie jest ważne, pozwoliło mi zaoszczędzić sporo czasu. Dzięki.
Mohammed Noureldin

0

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ć fpsparametru niż-r (co pokazano w innej odpowiedzi), co może w niektórych przypadkach być problematyczne (zgodnie z oficjalną dokumentacją ).

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

Ponieważ wejście -frameratejest niższe niż wyjście fps, 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ść -frameratei -vf fpsjest ważna , ponieważ ta konfiguracja zostanie zastosowana do następnego wspomnianego wideo (wejściowego lub wyjściowego). To jest zgodnie z oficjalnymi dokumentami :

opcje są stosowane do następnego określonego pliku. Dlatego porządek jest ważny ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.