Mam klatki wideo w formacie PNG z szybkością 1 kl./s i próbuję przekonwertować je na wideo przy użyciu 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 szybkie przewijanie wejścia do przodu (przechwytywane z 1 klatką na sekundę).
Jeśli spróbuję:
ffmpeg -i data/input-%4d.png -r 1 data/output.mp4
Dostaję coś, czego VLC nie chce odtwarzać 🙂
Teraz, jeśli wezmę pierwsze wideo (FF) i zastosuję filtr, aby go spowolnić (np. -filter:v "setpts=24.0*PTS"
), mogę go odtworzyć jak wideo 1 FPS, ale oczywiście cena jest wielkością pliku. Wydaje mi się, że generuje kilka powtarzających się klatek.
Więc pytanie brzmi, jak utworzyć wideo, które ma dokładnie 1 FPS i faktycznie jest odtwarzane z tą prędkością? Format wyjściowy, przy okazji, nie jest ” t to dla mnie ważne.
Komentarze
Odpowiedź
Jeśli chcesz mieć jedną linijkę dla FFMPEG, która 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, na przykład:
ffmpeg -r 1 -i dane / wejście-% 4d.png -pix_fmt yuv420p -r 10 dane / wyjście.mp4
-r 1
oznacza, że wideo będzie odtwarzane z szybkością 1 z oryginalnych obrazów na sekundę.
-r 10
oznacza, że wideo będzie odtwarzane z prędkością 10 klatek na sekundę.
(Element -pix_fmt yuv420p
jest tylko po to, aby zapewnić zgodność z szeroką gamą programów do odtwarzania. Jest to wymagane na przykład, aby wideo mogło być odtwarzane przez Windows Media Player.)
Przetestowałem wiele różnych wyjściowych klatek na sekundę i wydaje się, że 10 jest najniższą liczbą, której możesz użyć, która nadal daje wideo, które VLC odtworzy.
Oczywiście powyższe polecenie oznacza, że powielany jest każdy oryginalny obraz, ale jest to prostsza metoda niż metoda „zwolnij to”, o której wspomniałeś. W zależności od kodeka może nie produkować wideo znacznie większego niż prawdziwe wideo z 1 klatką na sekundę.
Aby to przetestować, właśnie stworzyłem prawdziwy film z 1 klatką na sekundę, który wyszedł z prędkością 2,24 kiB. Następnie wyprodukowałem wideo z tymi samymi obrazami wejściowymi, ale wyjściem przy 24 FPS, i wyszło 5,76 kiB. To nieco ponad dwa razy więcej i nigdzie prawie 24 razy więcej. 🙂
Komentarze
- +1 na -pix_fmt. Łatwe do zapomnij, że niektórzy ludzie upierają się przy używaniu WMP 🙂
- dlaczego chcesz, aby format wyjściowy miał 10 klatek na sekundę, podczas gdy wejście ma tylko 1? Czy nie ' t utworzyć 90% nadmiarowych ramek, które są dokładnie takie same?
- @Herbert tworzy nadmiarowe ramki, dzięki czemu można uzyskać liczbę klatek na sekundę do 10, co jest wykonywane tylko po to, aby VLC nie ' t narzekać i wizualnie nie ' nie zmienia wideo. Koder jest wystarczająco inteligentny, aby zobaczyć, że wszystkie klatki są identyczne, więc nie otrzymujesz ' pliku o wiele większego
- @chiliNUT czysty, kluczowa sprawa, co nie we wszystkich formatach, ale większość rozsądnych formatów się nada. Dzięki !
Odpowiedź
Użyj obu -framerate
i -r
Np. aby końcowy film wyglądał jak 1 FPS:
ffmpeg -framerate 1 -pattern_type glob -i "*.png" \ -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
To jest podobne do tego, co Konwersja klatek PNG na wideo przy 1 FPS | Unix & Linux Stack Exchange mówi, ale potrzebowałem -framerate
zamiast -r
aby działało.
Jest to wspomniane na wiki pod adresem: http://trac.ffmpeg.org/wiki/Slideshow#Framerates
Ustawia wyjściową liczbę klatek na sekundę na 30
, którą VLC może obsłużyć, i kopiuje każdy obraz 30 razy, tak że wyjściowe wideo wydaje się mieć 1 FPS. Zobacz też: 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.
Testowane na Ubuntu 16.10, VLC 2.2.4, ffmpeg
3.0.5, w katalogu zawierającym 10 plików PNG.
Zobacz także: https://stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg
Komentarze
- Jaka ' jest różnica między
-r
a-framerate
? - @Royi Nie ' naprawdę nie wiem, poza tym, że jest to jedyna rzecz, która działała dla mnie 🙂 Ale jeśli udało ci się wyodrębnij go ze stron
man
, daj mi znać 😉 Znaczący cytat to ” -r Jako opcję wejściową zignoruj wszystkie timestamps przechowywane w pliku i zamiast tego generują znaczniki czasu przy założeniu stałej liczby klatek na sekundę. To nie to samo, co opcja -framerate używana dla niektórych formatów wejściowych, takich jak image2 lub v4l2 (była taka sama w starszych wersjach FFmpeg). W razie wątpliwości użyj -framerate zamiast opcji wejściowej -r. ”
Odpowiedź
A co, jeśli nieco rozszerzysz drugi przykład w następujący sposób:
$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4
-r 1
musi znajdować się przed plikami .png, a nie po.
Zgodnie z ogólną zasadą 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.
Komentarze
- Niestety to nie działa. Jednak wspomnienie, że kolejność jest ważna , pozwoliło mi zaoszczędzić dużo czasu. Dzięki.
Odpowiedź
To jest błąd w VLC (który nadal istnieje w wersji 3.0.6). Po kilku eksperymentach zdałem sobie sprawę, że VLC ulega awarii w przypadku filmów z FPS mniejszymi niż 10 . Dlatego wszystkie filmy z 10 lub więcej klatkami na sekundę nie powinny stanowić problemu. Dlatego obecnie nie ma prostego sposobu na uzyskanie filmu z 1 klatką na sekundę, który można odtworzyć w VLC ( don „t poddaj się, czytaj dalej ).
Jednym ze sposobów obejścia jest – jak pokazano w powyższej odpowiedzi – aby sfałszować efekt 1 FPS poprzez powielenie obrazów (gdy w rzeczywistości mamy FPS równy 10 lub więcej, co jest w porządku dla VLC).
Przykład: jeśli masz folder z 12 obrazami i chciałbyś wygenerować wideo z 1 klatką na sekundę (które można odtworzyć w VLC), musisz zduplikować każdy obraz wiele razy (powiedzmy 10 razy), a następnie powiedzieć FFMPEG do wygenerowania wideo 10 FPS W ten sposób otrzymamy wideo o łącznej liczbie klatek 120, gdzie każdy obraz będzie odtwarzany przez 1 sekundę (ponieważ jest powielany 10 razy), co jest po prostu fałszem dla 1 FPS.
Wolę użyć parametru fps
zamiast
(co pokazano w innej odpowiedzi), co w niektórych przypadkach może być problematyczne (zgodnie z oficjalna dokumentacja ).
ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv
Ponieważ wartość wejściowa -framerate
jest niższa niż wartość wyjściowa fps
, FFMPEG powiela klatki, aby osiągnąć żądaną wyjściową liczbę klatek na sekundę (która wynosi 10 zgodnie z powyższym poleceniem).
Jest to również należy zauważyć , że kolejność -framerate
i -vf fps
jest ważne , ponieważ ta konfiguracja zostanie zastosowana do następnego wspomnianego wideo (wejścia lub wyjścia). Jest to zgodne z oficjalną dokumentacją :
opcje są stosowane do następnej określonej plik. Dlatego kolejność jest ważna …
ffmpeg
jest na tyle sprytny, aby odgadnąć kodek wideo tylko na podstawie rozszerzenia pliku formatu kontenera,.mp4
. Spróbuj dodać-vcodec libx264 -vpre hq
do wiersza poleceń, aby podać kodek i parametry kodowania.-r 1
.