ffmpeg-Zeitraffer-Fehler "Überschreiben" - kann ein Globbing- / Shell-Problem sein?

1152
ljwobker

Ich habe Probleme mit dem, was ich denke, ein einfaches FFMPEG-Skript sein sollte. Ich versuche nur, alle JPG-Dateien in ein bestimmtes Verzeichnis aufzunehmen und in ein Zeitraffervideo zu füllen. Ich bin mit allen Encoder-Optionen und dem Zeug in ffmpeg vertraut, aber ich kann die Syntax nicht richtig verstehen.

Die Zeile, die ich versuche, sollte (ja, ich weiß ... "sollte") einfach alle .JPG-Bilder in das Verzeichnis aufnehmen und sie als "out.mp4" kodieren. Wenn Sie sich jedoch den unteren Bereich anschauen, erhalten Sie eine Aufforderung, GOPR3974.JPG zu überschreiben. Dies ist die zweite Datei im Verzeichnis. Dies bedeutet, dass es aus irgendeinem Grund nicht alle Dateien korrekt kugelt. Ich habe einfache Anführungszeichen, doppelte Anführungszeichen versucht, ich habe es versucht

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

Es muss also irgendwo etwas geben, das funktioniert. Wenn es darauf ankommt, wird dies in einer cygwin-Umgebung mit bash ausgeführt ...

[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] 
1

1 Antwort auf die Frage

4
slhck

Methode 1: Verwenden Sie Sequenzmuster

Was Sie wirklich brauchen, ist dies, wenn Ihr erstes Bild aufgerufen wird GOPR0001.JPG:

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

Wenn das erste Bild aufgerufen wird GOPR3973.JPG, müssen Sie ffmpeg die Startnummer geben, nach der gesucht werden soll:

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

Methode 2: Verwenden Sie Globbing-Muster

Wenn Ihre ffmpeg-Version Unterstützung für Globbing bietet (was die Windows-Builds meiner Meinung nach nicht haben), können Sie einfach Folgendes tun:

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

Dies ist vorzuziehen, wenn Sie die Startnummer nicht kennen oder einfach keine genaue Kontrolle wünschen.

Warum funktioniert es nicht?

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

Dies funktioniert nicht, da es sich in etwa so ausweiten wird (vorausgesetzt, Ihr erstes Bild wird aufgerufen GOPR0001.JPG):

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

Da ffmpeg die letzte unbenannte Argumentoption (dh alles ohne führende -) als Ausgabedateiname behandelt, GOPR2.JPGwäre dies die Ausgabe, und alles, was out.mp4nicht verwendet wird, wird nicht übernommen.

Einige Hinweise

  • -pix_fmt yuv420pwird benötigt, um aus dem YUV 4: 2: 2-Farbraum von JPEG in 4: 2: 0-Subsampling zu konvertieren. Andernfalls können einige (die meisten nicht auf FFmpeg basierenden) Player das Video nicht anzeigen

  • Kontrollieren Sie die Qualität, indem Sie die -crf 23Option einstellen und zwischen 18 und 28 wählen, wobei niedriger für bessere Qualität steht.

  • Möglicherweise möchten Sie die Bildrate entsprechend der Aufnahme der Eingangsbilder (Bilder) einstellen. Tun Sie dies, indem Sie laufen ffmpeg.exe -framerate 30 -start_number …. Wenn Sie keine Framerate angeben, geht ffmpeg davon aus, dass Ihre ursprünglichen Frames mit 25 Hz aufgenommen wurden.

  • Lesen Sie den image2Demuxer- Teil des Handbuchs.

  • Doppelte Anführungszeichen sind immer gut zu verwenden, um eine Schalenausdehnung von Mustern zu verhindern.