Wyjaśnienie dotyczące opcji wprowadzania ffmpeg z plikami obrazów jako danymi wejściowymi

34

Mam kilka zdjęć i chciałbym zrobić animowany gif z ffmpeg. Obrazy mają nazwy:

837_1.png
838_1.png
...

Próbuję nie zrozumieć opcji wiersza polecenia -i programu ffmpeg, ale zawieszam się przy niektórych problemach.

Jeśli nic nie podam, poprosi mnie o zastąpienie plików:

ffmpeg -i * -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from '358_1.png':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 550x550, 25 tbr, 25 tbn, 25 tbc
File '359_1.png' already exists. Overwrite ? [y/N]

A jeśli spróbuję użyć jednego z najczęściej używanych formatów (% d) w Internecie .. ffmpeg nie znajdzie plików:

fmpeg -i '%3d_1.png' -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[image2 @ 0x7f963a006600] Could find no file with with path '%3d_1.png' and index in the range 0-4
%3d_1.png: No such file or directory

Więc .. oto pytanie, jak korzystać z opcji wiersza polecenia -i z ffmpg?

Dla jasności jestem na Mac OSX 10.8, ffmpeg wersja 1.2.1, zsh 4.3.11

nkint
źródło

Odpowiedzi:

47

Bez dalszych opcji image2demuxer ffmpeg będzie szukał sekwencji zaczynającej się od 0. Sprawdza także ten indeks z domyślnym zakresem 5 (dlatego narzeka na brak indeksu w zakresie 0–4). Zgodnie z dokumentacją musisz ustawić numer początkowy, jeśli chcesz zacząć od dowolnego indeksu, takiego jak 837.

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 out.mp4

Przestrzeń kolorów w konwersji PNG na H.264

Ponieważ pliki PNG używają przestrzeni kolorów RGB do reprezentowania pikseli, konwersja do H.264 skończyłaby się YUV 4: 4: 4 ( bez podpróbkowania ). Powstały film może nie być odtwarzany na wszystkich odtwarzaczach, w szczególności na urządzeniach innych niż FFmpeg. Twój odtwarzacz będzie wyświetlał tylko czarne ramki lub może się zawiesić. Aby to naprawić, zmień format piksela na YUV 4: 2: 0:

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 -pix_fmt yuv420p out.mp4

Aby kontrolować jakość, użyj -crfopcji. Więcej informacji można znaleźć w przewodniku kodowania x264 .

Dlaczego *glob nie działa

Nie używaj *jako opcji wprowadzania. Powłoka rozwinie ją do wszystkich plików w bieżącym katalogu, zanim ffmpegją zobaczy, więc polecenie rozszerzy się do ffmpeg -i file1 file2 … filen. Ponieważ wszystkie pliki wejściowe ffmpegpotrzebują tej -iopcji, file2 … filenzamiast tego będą traktowane jako pliki wyjściowe i nadpisują je. Niedobrze.

slhck
źródło
bardzo kompletna odpowiedź! i czy masz jakieś porady na temat animowanego gif?
nkint
W przypadku animowanych plików GIF chcesz zaktualizować do wersji ffmpeg 2.0 lub nowszej, ponieważ znacznie poprawiły jakość wizualną. Strona pobierania zawiera kilka linków do statycznych wersji dla OS X. W przypadku starszych wersji ffmpeg zobacz: ffmpeg konwertuje wideo .flv do .gif z okropną jakością
slhck
W rzeczywistości sprawdza nie tylko + 0..4, ale także 8,16,32,64 itd. Jest to zauważalne przy korzystaniu z adresów URL HTTP. Jednak image2nie rozpoznaje, że 200 OKjest to odpowiednik „znalezionego pliku”, więc nie przestaje szukać.
MSalters
1
Otrzymuję to samo, nawet po próbie wdrożenia twoich sugestii. Moje pliki mają nazwę, DSCxxxxx.jpggdzie xxxxxjest 5-cyfrowy numer rozpoczynający się od zera (uwaga: nie mam podkreślników). Mimo to po uruchomieniu ffmpeg -r 30 -start_number 04606 -i DSC%d.jpg out.mp4pojawia się ten sam błąd, co w oryginalnym poście powyżej
Anonimowy
@jphollowed Czy wstawiłeś wzorzec nazwy pliku w cudzysłowie?
slhck
29

Globowanie można włączyć, określając -pattern_type globopcję:

ffmpeg -pattern_type glob -i '*.png' -vcodec libx264 out.mp4
Yohanson
źródło
2
Znacznie lepszy sposób :)
Gustav
3
Tylko to działało dla mnie. Nie ma mowy, aby uzyskać to xxx%d.png, xxx%3d.png, 'xxx%d.png'lub 'xxx%3d.png'coś roboczego
yPhil
Otrzymuję ten sam błąd po wypróbowaniu tego:[image2 @ 0x2552560] Could find no file with path '*.jpg' and index in the range 0-4 *.jpg: No such file or directory
Anonimowy
Wybrano typ wzorca „glob”, ale globbing nie jest obsługiwany przez tę kompilację libavformat [używając Windows ffmpeg] [oof, powinien był przewinąć w dół jedną odpowiedź]
Katastic Voyage
7

Uwaga: Globowanie wzorców nie działa w systemie Windows (i może nigdy nie być spowodowane brakiem obsługi globowania w libavfilter w systemie Windows.) Jeśli więc robisz to w systemie Windows, będziesz musiał zmienić nazwy plików, aby były kolejno numerowane i bez luk.

Możesz zmienić ich nazwę za pomocą prostego wiersza polecenia Powershell:

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName “Base$x”; $x++ }
Bill Westrup
źródło
file1.jpg file2.jpgfile10.jpgfile1.jpgfile10.jpgfile2.jpg
Zwróci
Czy nie powinno to być Base $ x.jpg? W tej chwili twój zmienił nazwę na wszystkie moje i zabił rozszerzenia plików.
Katastic Voyage
5

lepszy sposób zmiany nazwy za pomocą programu PowerShell (zachowaj kolejność):

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName "Base$($x.tostring('000000')).jpg"; $x++ }
pBac
źródło
Czy dirzawsze zwraca pliki posortowane alfabetycznie? Czy bezpieczniej byłoby dodać sort-objectmiks do miksu?
stib