Wie ruft man Einzelbilder aus einem Video ab, ohne dass einige davon verloren gehen?

Wie ruft man Einzelbilder aus einem Video ab, ohne dass einige davon verloren gehen?

Ich habe eine AVI-Datei aus 30 PNG-Bildern erstellt, 15 Bilder/Sekunde:

ffmpeg -i %02d.png -r 15 video.avi

Aber als ich versuchte, die Bilder aus dem AVI-Format wiederherzustellen:

ffmpeg -i src.avi %02d.png

Ich habe nur 19 Bilder bekommen, statt 30! Ich habe auch diese beiden probiert:

ffmpeg -i src.avi -r 15 %02d.png
ffmpeg -r 15 -i src.avi %02d.png

beides mit dem gleichen Ergebnis. Es muss nicht extra erwähnt werden, dass Frames fehlen (z. B. Sprünge vom 4. zum 6.). Wie kommt das und wie löse ich das Problem?

Ausgabe für den ersten Befehl ( ffmpeg -i %02d.png -r 15 video.avi):

ffmpeg version N-50314-gf6fff8e Copyright (c) 2000-2013 the FFmpeg developers
  built on Feb 25 2013 21:57:41 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --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-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 17.103 / 52. 17.103
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.100 / 54. 63.100
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 41.100 /  3. 41.100
  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 '%02d.png':
  Duration: 00:00:01.20, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 713x386 [SAR 3779:3779 DAR 713:386], 25 fps, 25 tbr, 25 tbn, 25 tbc
Output #0, avi, to 'video.avi':
  Metadata:
    ISFT            : Lavf54.63.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 713x386 [SAR 1:1 DAR 713:386], q=2-31, 200 kb/s, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png -> mpeg4)
Press [q] to stop, [?] for help
frame=   19 fps=0.0 q=2.0 Lsize=      46kB time=00:00:01.26 bitrate= 297.1kbits/s dup=0 drop=11    

video:40kB audio:0kB subtitle:0 global headers:0kB muxing overhead 15.248175%

Ausgabe für zweiten Befehl ( ffmpeg -i video.avi %02d.png):

ffmpeg version N-50314-gf6fff8e Copyright (c) 2000-2013 the FFmpeg developers
  built on Feb 25 2013 21:57:41 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --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-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 17.103 / 52. 17.103
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.100 / 54. 63.100
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 41.100 /  3. 41.100
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, avi, from 'video.avi':
  Metadata:
    encoder         : Lavf54.63.100
  Duration: 00:00:01.27, start: 0.000000, bitrate: 297 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 713x386 [SAR 1:1 DAR 713:386], 15 tbr, 15 tbn, 15 tbc
Output #0, image2, to '%02d.png':
  Metadata:
    encoder         : Lavf54.63.100
    Stream #0:0: Video: png, rgb24, 713x386 [SAR 1:1 DAR 713:386], q=2-31, 200 kb/s, 90k tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg4 -> png)
Press [q] to stop, [?] for help
frame=   19 fps=0.0 q=0.0 Lsize=N/A time=00:00:01.26 bitrate=N/A    

video:129kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.016665%

Antwort1

Gleiche Bildrate für Eingabe und Ausgabe

Verwenden Sie -frameratediese Option als Eingabeoption, um die Bildrate für Bildeingaben festzulegen. Beispiel:

ffmpeg -framerate 15 -i %02d.png -pix_fmt yuv420p output.mp4

Wenn Sie diese Option weglassen, wird die Standardeinstellung -framerate 25angewendet. Wenn Sie nur eine Eingabebildrate angeben, wie im obigen Beispiel gezeigt, übernimmt ffmpeg dieselbe Bildrate für die Ausgabe, ohne Bilder zu löschen oder zu duplizieren.

-pix_fmt yuv420pwird empfohlen, aus Kompatibilitätsgründen bei der Ausgabe von H.264-Videos hinzuzufügen.

Unterschiedliche Bildraten für Ein- und Ausgabe

Wenn Sie die Eingabe- und Ausgabebildrate variieren möchten, fügen Sie die -rAusgabeoption hinzu. Dies kann nützlich sein, wenn Sie eine niedrige Eingabebildrate, aber aus Kompatibilitätsgründen eine standardmäßigere Ausgabebildrate wünschen:

ffmpeg -framerate 1 -i input_%03d.png -r 24 -pix_fmt youv420p output.mp4

Im obigen Beispiel wird ein Eingabebild pro Sekunde angezeigt, die Ausgabebilder werden jedoch dupliziert, sodass die Ausgabe tatsächlich mit 24 Bildern pro Sekunde wiedergegeben wird.

verwandte Informationen