Erläuterung zur Eingabemöglichkeit von ffmpeg mit Bilddateien als Eingabe

34

Ich habe ein paar Bilder und möchte mit ffmpeg ein animiertes Gif machen. Die Bilder haben Namen wie:

837_1.png
838_1.png
...

Ich versuche, die Befehlszeilenoption -i von ffmpeg zu verstehen, aber ich stürze gegen einige Probleme ab.

Wenn ich nichts spezifiziere, bitte ich mich, die Dateien zu ersetzen:

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]

Und wenn ich versuche, eines der am häufigsten verwendeten Formate (% d) im Internet zu verwenden, findet ffmpeg die Dateien nicht:

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

Also ... hier ist die Frage, wie man die Befehlszeilenoption -i mit ffmpg verwendet.

Der Übersichtlichkeit halber bin ich auf Mac OS X 10.8, ffmpeg Version 1.2.1, zsh 4.3.11

nkint
quelle

Antworten:

47

Ohne weitere Optionen image2sucht der Demuxer von ffmpeg nach einer Sequenz, die mit 0 beginnt. Er prüft auch diesen Index mit einem Standardbereich von 5 (daher wird kein Index im Bereich von 0 bis 4 beanstandet). Gemäß der Dokumentation müssen Sie die Startnummer festlegen, wenn Sie an einem beliebigen Index wie 837 beginnen möchten.

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

Farbraum in PNG zu H.264-Konvertierung

Da PNG-Dateien den RGB-Farbraum zur Darstellung von Pixeln verwenden, würde die Konvertierung in H.264 YUV 4: 4: 4 ( ohne Unterabtastung ) ergeben. Das resultierende Video kann möglicherweise nicht auf allen Playern abgespielt werden, insbesondere nicht auf FFmpeg-basierten Videos. Ihr Player würde nur schwarze Rahmen anzeigen oder möglicherweise abstürzen. Um dies zu beheben, ändern Sie das Pixelformat in YUV 4: 2: 0:

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

Verwenden Sie die -crfOption , um die Qualität zu kontrollieren . Weitere Informationen finden Sie im x264-Codierungshandbuch .

Warum der *Glob nicht funktioniert

Verwenden Sie nicht die *als Eingabeoption. Die Shell erweitert es auf alle Dateien im aktuellen Verzeichnis, bevor es ffmpegangezeigt wird, sodass der Befehl auf erweitert wird ffmpeg -i file1 file2 … filen. Da alle Eingabedateien diese Option ffmpegbenötigen -i, werden sie stattdessen file2 … filenals Ausgabedateien verwendet und überschrieben. Nicht gut.

slhck
quelle
sehr vollständige Antwort! und hast du auch einen ratschlag zum animierten gif?
Nr. 29.10.13
Für animierte GIFs möchten Sie ein Update auf ffmpeg Version 2.0 und höher durchführen, da dies die visuelle Qualität erheblich verbessert. Die Download- Seite enthält einige Links zu statischen Builds für OS X. Ältere Versionen von ffmpeg finden Sie unter: ffmpeg konvertiert .flv-Video in .gif mit schrecklicher Qualität
slhck
Tatsächlich prüft es nicht nur + 0..4, sondern auch 8,16,32,64 usw. Dies ist bei Verwendung von HTTP-URLs bemerkbar. Es wird jedoch image2nicht erkannt, dass dies 200 OKder Entsprechung von "Datei gefunden" entspricht, sodass die Suche nicht abgebrochen wird.
MSalters
1
Ich erhalte das Gleiche, auch nachdem ich versucht habe, Ihre Vorschläge umzusetzen. Meine Dateien haben einen Namen, DSCxxxxx.jpgbei dem xxxxxes sich um eine 5-stellige Zahl handelt, die mit Null beginnt (Anmerkung: Ich habe keine Unterstriche). Trotzdem ffmpeg -r 30 -start_number 04606 -i DSC%d.jpg out.mp4bekomme ich nach dem Laufen den gleichen Fehler wie im obigen Originalbeitrag
Anonym
@jphollowed Hast du das Dateinamenmuster in Anführungszeichen gesetzt?
Slhck
29

Das Globbing kann durch Angabe der folgenden -pattern_type globOption aktiviert werden :

ffmpeg -pattern_type glob -i '*.png' -vcodec libx264 out.mp4
Yohanson
quelle
2
Viel besser so :)
Gustav
3
Nur das hat bei mir funktioniert. Kein Weg , dies zu bekommen xxx%d.png, xxx%3d.png, 'xxx%d.png'oder , 'xxx%3d.png'was Arbeits
yPhil
Ich erhalte den gleichen Fehler, nachdem ich Folgendes versucht habe:[image2 @ 0x2552560] Could find no file with path '*.jpg' and index in the range 0-4 *.jpg: No such file or directory
Anonym
Der Mustertyp 'glob' wurde ausgewählt, aber das Globbing wird von diesem libavformat-Build [mit Windows ffmpeg] [oof, sollte eine Antwort nach unten gescrollt haben] nicht unterstützt
Katastic Voyage
7

Hinweis: Das Globbing von Mustern funktioniert unter Windows nicht (und möglicherweise auch nicht, weil das Globbing in libavfilter unter Windows nicht unterstützt wird.) Wenn Sie dies unter Windows tun, müssen Sie die Dateien also so umbenennen, dass sie fortlaufend nummeriert sind und lückenlos.

Sie können sie mit einer einfachen Powershell-Befehlszeile umbenennen:

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName “Base$x”; $x++ }
Bill Westrup
quelle
Diese wird wieder file1.jpg file2.jpg... file10.jpgdie , wenn Sie alphabetisch sortieren würde am Ende file1.jpg, file10.jpg...file2.jpg
stib
Sollte das nicht Base $ x.jpg sein? Wie sie sind, haben Sie alle meine umbenannt und die Dateierweiterungen gelöscht.
Katastic Voyage
5

Besseres Umbenennen mit PowerShell (Reihenfolge beibehalten):

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName "Base$($x.tostring('000000')).jpg"; $x++ }
pBac
quelle
Gibt dirdie Dateien immer alphabetisch sortiert zurück? Wäre es sicherer, ein sort-objectin die Mischung hinzuzufügen ?
Stib