Błąd „nadpisania” upływu czasu ffmpeg - może to być problem globbing / powłoki?

1

Mam problem z tym, co moim zdaniem powinno być prostym skryptem FFMPEG. Próbuję tylko pobrać wszystkie pliki jpg z danego katalogu i wypełnić je filmem poklatkowym. Czuję się dobrze ze wszystkimi opcjami enkodera i innymi rzeczami w ffmpeg, ale wydaje mi się, że nie mam poprawnej składni.

Wiersz, który próbuję, powinien (tak, wiem ... „powinien”) po prostu pobrać wszystkie obrazy .JPG z katalogu i zakodować je jako „out.mp4”. Ale jeśli spojrzysz na dół, otrzymam monit o zastąpienie GOPR3974.JPG - który jest drugim plikiem w katalogu. Oznacza to, że z jakiegoś powodu nie sumuje poprawnie wszystkich plików ... Próbowałem pojedynczych cudzysłowów, podwójnych cudzysłowów, próbowałem

ffmpeg -i GOPR%04d.JPG out.mp4

więc musi być coś, co działa. Jeśli to ma znaczenie, jest uruchamiany w środowisku cygwin za pomocą bash ...

[lwobker:/dtop/hack]$ /usr/local/bin/ffmpeg.exe -i GOPR*.JPG out.mp4
ffmpeg version N-64919-ga613257 Copyright (c) 2000-2014 the FFmpeg developers
  built on Jul 23 2014 00:35:22 with gcc 4.8.3 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads
--enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r
--enable-gnutls --enable-iconv --enable-libass --enable-libbluray
--enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme
--enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame
--enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg
--enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr
--enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab
--enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis
--enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264
--enable-libx265 --enable-libxavs --enable-libxvid --enable-decklink
--enable-zlib
  libavutil      52. 92.101 / 52. 92.101
  libavcodec     55. 69.100 / 55. 69.100
  libavformat    55. 48.101 / 55. 48.101
  libavdevice    55. 13.102 / 55. 13.102
  libavfilter     4. 11.102 /  4. 11.102
  libswscale      2.  6.100 /  2.  6.100
  libswresample   0. 19.100 /  0. 19.100
  libpostproc    52.  3.100 / 52.  3.100
Input #0, image2, from 'GOPR3973.JPG':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg), 1920x1440 [SAR 72:72 DAR
4:3], 25 tbr, 25 tbn, 25 tbc
File 'GOPR3974.JPG' already exists. Overwrite ? [y/N]
ljwobker
źródło

Odpowiedzi:

4

Metoda 1: Użyj wzorców sekwencji

Naprawdę potrzebujesz tego, jeśli twój pierwszy obraz nazywa się GOPR0001.JPG:

ffmpeg.exe -i "GOPR%04d.JPG" -pix_fmt yuv420p out.mp4

Lub jeśli wywoływany jest pierwszy obraz GOPR3973.JPG, musisz podać ffmpeg numer początkowy, aby szukać:

ffmpeg.exe -start_number 3973 -i "GOPR%04d.JPG" -pix_fmt yuv420p out.mp4

Metoda 2: Użyj wzorców globowania

Jeśli twoja wersja ffmpeg ma obsługę globowania (które, jak sądzę, nie mają kompilacji Windows), możesz po prostu zrobić:

ffmpeg.exe -pattern_type glob -i "GOPR*.JPG" -pix_fmt yuv420p out.mp4

Jest to preferowane, jeśli nie znasz numeru początkowego lub po prostu nie zależy ci na precyzyjnej kontroli.

Dlaczego to nie działa

ffmpeg.exe -i GOPR*.JPG out.mp4

To nie działa, ponieważ rozwinie się do czegoś takiego (zakładając, że nazywa się twój pierwszy obraz GOPR0001.JPG):

ffmpeg.exe -i GOPR0001.JPG GOPR0002.JPG  out.mp4

Ponieważ ffmpeg traktuje ostatnią nienazwaną opcję argumentu (tj. Cokolwiek bez wiodącego -) jako nazwę pliku wyjściowego, GOPR2.JPGbyłby plikiem wyjściowym i cokolwiek, dopóki out.mp4nie zostanie zastosowane.

Kilka wskazówek

  • -pix_fmt yuv420pjest potrzebny do konwersji z przestrzeni kolorów YUV 4: 2: 2 JPEG na podpróbkowanie 4: 2: 0. W przeciwnym razie niektóre (większość nieopartych na FFmpeg) odtwarzacze nie będą mogły wyświetlić wideo

  • Kontroluj jakość, ustawiając -crf 23opcję i wybierając coś między 18 a 28, gdzie niższa oznacza lepszą jakość.

  • Możesz ustawić liczbę klatek na sekundę, zgodnie z którą przechwytywane były ramki wejściowe (obrazy). Zrób to, uruchamiając ffmpeg.exe -framerate 30 -start_number …. Jeśli nie określisz liczby klatek na sekundę, ffmpeg przyjmie, że twoje oryginalne klatki zostały nagrane przy 25 Hz.

  • Przeczytaj część instrukcji image2demuxera .

  • Podwójne cudzysłowy są zawsze dobre w użyciu, aby zapobiec rozszerzaniu wzorców przez powłoki.

slhck
źródło