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

  • Ja ' nie mam pewności 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.
  • Właściwie wszystko się udało i jak wspomniałem, działało dobrze i tylko dało dziwne wyniki, gdy dodałem -r 1.
  • Myślę, że możesz mieć więcej szczęścia z odpowiedzią ffmpeg na stackoverflow.com lub superuser.com .

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.

Z dokumentacji FFmpeg :

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 …

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *