Jak zmusić FFMPEG do dołączania niesekwencyjnych plików obrazów? (przeskocz o 3s)

27

Mam kilka zdjęć, które są zgodne z tym wzorem.

0001.png
0004.png
0007.png
0010.png
0013.png
0016.png
0019.png
...

Są w prawidłowej kolejności, ale FFMPEG ignoruje cokolwiek po pierwszym pliku, ponieważ nie może go znaleźć 0002.png. Jak mogę go dołączyć do tych plików?

próbowałem

ffmpeg -i %04d.png out.avi
Bandyta
źródło
2
Co powiesz na tymczasową zmianę nazwy, utworzenie AVI, a następnie zmianę nazwy z powrotem na schemat (3x-2) .png? Bulk Rename Utility @ bulkrenameutility.co.uk/Main_Intro.php to darmowa, umm, masowa zmiana nazwy.
Gyan

Odpowiedzi:

18

z ffmpeg 0.11.1 jest to tak proste, jak:

ffmpeg -f image2 -i %*.png out.avi

Ze manstrony, w przykładzie w sekcji „Konwersja formatu pliku audio i wideo”:

Podczas importowania sekwencji obrazów -iobsługuje także wewnętrzne rozszerzanie wzorów wieloznacznych podobnych do powłoki (globowanie). Aby obniżyć ryzyko ingerencji ze swoimi rzeczywistych nazw plików i ekspansji glob przez powłokę, które są wymagane do aktywacji znaków glob meta poprzedzając je za pomocą jednego %znaku, jak w foo-%*.jpeg, foo-%?%?%?.jpeglub foo-00%[234%]%*.jpeg.

Aktualizuj według komentarzy: w najnowszych wersjach powinieneś teraz używać -i '*.png'składni.

rymo
źródło
3
To nie działało dla mnie przy użyciu ffmpeg lub avconv w Ubuntu 13.04
hellocatfood 12.12.2013
2
To wydaje się nie być już opcją.
Timmmm
2
Typ glob_sequencewzoru jest przestarzały, ale globtyp wzoru nie jest. Odpowiedź Mulvya i Petera Cordesa działa.
dr. Sybren,
1
Pattern type 'glob_sequence' is deprecated: use pattern_type 'glob' instead
Serge Stroobandt,
1
Dla wyjaśnienia, ponieważ ta strona jest obecnie najwyższym wynikiem w Google dla tego komunikatu ostrzegawczego ( Pattern type 'glob_sequence' is deprecated...): polecenie wydane przez rymo powyżej (konkretnie -i %*.png) spowoduje ostrzeżenie. Aby go wyeliminować, użyj nieco innej składni w answer ( -i '*.png') Peter Cordes .
James
19

Oprócz obejścia w moim komentarzu powinieneś być w stanie użyć tej składni z dokumentacji ffmpeg :

ffmpeg -f image2 -pattern_type glob -i '*.png' out.avi

Cytaty są ważne, potrzebujesz ffmpeg, aby zobaczyć *, a nie mieć powłoki, aby ją rozwinąć.

Gyan
źródło
Nie działa dla mnie, ale prawdopodobnie dlatego, że mam starszą wersję. Akceptuję ten, ponieważ najprawdopodobniej pomoże przyszłym użytkownikom.
Brigand
Zgodnie z dokumentacją ffmpeg należy użyć „* .png” zamiast% 04d.png z typem wzorca glob.
Friend Of George
To wybrałoby wszystkie pngs obecne w folderze, oprócz 00xx.png, podczas gdy OP chce ustawić w kolejce tylko pngs% 04d bez obawy o ciągłość numeracji.
Gyan,
2
Jestem prawie pewien , że musisz wstawić *.pngcudzysłowy (tak '*.png'), aby uniknąć rozszerzenia przez powłoki w stylu uniksowym (tak, OSX i Linux itp.).
evilsoup
1
Niestety programiści ffmpeg udostępniają opcję globowania plików ! Standardowe kompilacje systemu Windows tego nie uwzględniają.
Timmmm
9

From http://www.ffmpeg.org/faq.html : Jeśli masz dużo zdjęć do zmiany nazwy, możesz użyć następującego polecenia, aby zmniejszyć obciążenie. Polecenie, używając składni powłoki bourne, symbolicznie łączy wszystkie pliki w bieżącym katalogu, które pasują * jpg do katalogu „/ tmp” w sekwencji „img001.jpg”, „img002.jpg” i tak dalej.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

Nikhil
źródło
Użyłem tego do łączenia wielu sekwencji seqA-[0001-n].png, seqB-[0001-n].pngitp Znacznie łatwiej niż bawić z Image2 globowania i filtrem concat.
z0r
Dla mnie to nie działa, dopóki nie otrzymuje for i in *jpgz for i in /full/path/*jpg, ponieważ wszystkie dowiązania zostały złamane
Jezzamon
4

Sugerowałbym to samo, co zasugerował Mulvya. Ilekroć musiałem robić takie rzeczy podczas renderowania animacji 3D, zmieniałem nazwy plików, aby były sekwencyjne. Po prostu łatwiej jest pracować w ten sposób w wielu różnych programach, chyba że z jakiegoś powodu musisz zachować nazwy plików. Total Commander jest także doskonałym narzędziem do wielokrotnej zmiany nazwy.

AJ Henderson
źródło
Skończyło się na zrobieniu czegoś podobnego (skrypt zmieniający nazwę Pythona).
Brigand
3

Do brakującej części sekwencji użyłem 2 wkładki

CONCAT=$(echo $(ls *.png | sort -n -t _ -k 2) | sed -e "s/ /|/g")
ffmpeg -framerate 25 -i "concat:$CONCAT" -c:v libx264 -profile:v high -pix_fmt yuv420p output.mp4

Mam nadzieję, że to pomoże komuś w przyszłości

Shakil
źródło