Kombinieren / Weiterleiten / Verketten mehrzeiliger FFMPEG-Befehle

Kombinieren / Weiterleiten / Verketten mehrzeiliger FFMPEG-Befehle

Grüße, ich kann eine Videodatei in eine hochwertige animierte GIF-Datei konvertieren, indem ich die folgenden beiden Befehlszeilen direkt nacheinander ausführe.

ffmpeg -i test.mkv -vf palettegen palette.png
ffmpeg -i test.mkv -i palette.png -lavfi paletteuse animated.gif

Gibt es eine Möglichkeit, die beiden Befehlszeilen miteinander zu verketten, sodass ich nur eine Zeile ausführen muss?

Der Grund, warum ich das mache, ist, dass ich gerne verwenden möchtefrankalso muss ich die beiden Zeilen zu einer ausführbaren ffmpeg-Zeilenoperation zusammenfassen. Ich kann jede Videodatei mit WinFF in ein animiertes GIF umwandeln, indem ich die XML-Datei so bearbeite, dass sie wie die folgenden Zeilen aussieht.

<GifAnimation>
    <label>Gif Animation Simple</label>
    <params>-f gif</params>
    <extension>gif</extension>
    <category>Gif Animation</category>
  </GifAnimation>

Aber welche Änderungen muss ich an der Zeile vornehmen, <params>um die beiden folgenden Zeilen zu einer ausführbaren ffmpeg-Zeilenoperation zu verketten?

ffmpeg -i test.mkv -vf palettegen palette.png
ffmpeg -i test.mkv -i palette.png -lavfi paletteuse animated.gif

It looks like it needs to:
1) generate the color palette from the video
2) save the color palette to a file
3) read the color palette back in
4) apply it to the gif animation file.

UPDATE Frage dankböse Suppehelfen

Ich habe die Antworten von evilsoup ausprobiert, siehe Befehl unten:

ffmpeg -i test.mkv -filter_complex 'palettegen[PAL],[0:v][PAL]paletteuse' output.gif

Und

ffmpeg -i test.mkv -filter_complex 'palettegen,[v]paletteuse' output.gif

Es erstellt eine animierte GIF-Datei, aber nur das erste Frame enthält ein Bild. Alle anderen Frames sind leer. Es sieht fast so aus, als ob alle Frames außer dem ersten Alphakanäle hätten. Siehe beigefügtes GIF-Bild.

Ein Bild ist nur im 1. Frame vorhanden, alle anderen Frames haben irgendeine Art Alphakanal. Es sollte ein Bild eines sich ungleichmäßig drehenden Objekts sein

Ich erhalte Fehlermeldungen, wenn ich den Befehl ausführe (siehe unten). Was könnte die Ursache sein? Irgendwelche Ideen, wie man das beheben kann?

[Parsed_paletteuse_1 @ 0xd526c0] [framesync @ 0xec5108] Buffer queue overflow, dropping.
    Last message repeated 82 times
[Parsed_paletteuse_1 @ 0xd526c0] [framesync @ 0xec5108] Buffer queue overflow, dropping.
    Last message repeated 36 times

Die vollständige Liste finden Sie unten:

rt@sys76:/tmp$ ffmpeg -i test.mkv -filter_complex 'palettegen[PAL],[0:v][PAL]paletteuse' output.gif
ffmpeg version 2.8.6-1ubuntu2 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.3.1 (Ubuntu 5.3.1-11ubuntu1) 20160311
  configuration: --prefix=/usr --extra-version=1ubuntu2 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
  WARNING: library configuration mismatch
  avcodec     configuration: --prefix=/usr --extra-version=1ubuntu2 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv --enable-version3 --disable-doc --disable-programs --disable-avdevice --disable-avfilter --disable-avformat --disable-avresample --disable-postproc --disable-swscale --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libvo_aacenc --enable-libvo_amrwbenc
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, matroska,webm, from 'test.mkv':
  Metadata:
    ENCODER         : Lavf56.40.101
  Duration: 00:00:07.40, start: 0.000000, bitrate: 125 kb/s
    Stream #0:0: Video: h264 (High), yuv420p, 560x480, SAR 1:1 DAR 7:6, 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Metadata:
      ENCODER         : Lavc56.60.100 libx264
      DURATION        : 00:00:07.400000000
File 'output.gif' already exists. Overwrite ? [y/N] y
Output #0, gif, to 'output.gif':
  Metadata:
    encoder         : Lavf56.40.101
    Stream #0:0: Video: gif, pal8, 560x480 [SAR 1:1 DAR 7:6], q=2-31, 200 kb/s, 25 fps, 100 tbn, 25 tbc (default)
    Metadata:
      encoder         : Lavc56.60.100 gif
Stream mapping:
  Stream #0:0 (h264) -> palettegen
  Stream #0:0 (h264) -> paletteuse:default
  paletteuse -> Stream #0:0 (gif)
Press [q] to stop, [?] for help
[Parsed_paletteuse_1 @ 0xd526c0] [framesync @ 0xec5108] Buffer queue overflow, dropping.
    Last message repeated 82 times
[Parsed_paletteuse_1 @ 0xd526c0] [framesync @ 0xec5108] Buffer queue overflow, dropping.
    Last message repeated 36 times
[Parsed_palettegen_0 @ 0xd52220] 255(+1) colors generated out of 201259 colors; ratio=0.001267
frame=   65 fps= 47 q=-0.0 Lsize=     130kB time=00:00:07.40 bitrate= 143.5kbits/s    
video:128kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.005128%
rt@sys76:/tmp$

Antwort1

Sie müssen eine Filterkette verwenden (sieheFFmpeg-WikiUndonline Dokumentation).

ffmpeg -i input.mkv -filter_complex 'palettegen[PAL],[0:v][PAL]paletteuse' output.gif

Im Grunde genommen nimmt der palettegenFilter einen einzelnen Videoeingang (solange Sie nicht mehr als einen Videostream unter Ihren Eingängen haben, müssen Sie nicht angeben, wo der Eingang ist) und gibt einen Videoausgang (also ein Bildausgang) aus; in der Zwischenzeit paletteusenimmtzweiVideoeingänge (also ein Video und ein Bild).

Normalerweise wird in einer Filterkette der erste Ausgang jedes Filters zum ersten Eingang des nächsten in der Kette. Der paletteuseFilter erwartet jedoch, dass das Video sein erster Eingang ist, mit der „Palette“ als zweitem Eingang – dies ist einer der Gründe, warum Sie nicht einfach verwenden können palettegen,paletteuse. Der [0:v]verwendet FFmpegsStreamauswahlSyntax (siehe hierfür einige Anwendungsbeispiele), um anzugeben, paletteusedass als erste Eingabe das Video aus der ersten Eingabedatei verwendet werden soll (FFmpeg beginnt bei den meisten Dingen bei 0 zu zählen).

Technisch könnten Sie das Obige wie folgt schreiben:

ffmpeg -i input.mkv -filter_complex 'palettegen,[v]paletteuse' output.gif

... und es würde genauso gut funktionieren (unter der Annahme, dass es nur einen Videostream unter den Eingängen gibt). Aber ich denke, dass palettegendie Dinge etwas klarer nachvollziehbarer sind, wenn man die Ausgabe beschriftet und ihr explizit mitteilt, wohin sie gehen soll.

Ich habe WinFF noch nie verwendet, aber es sieht so aus, als müssten Sie nur alle FFmpeg-Optionen zwischen die Tags setzen. Das hier sollte also funktionieren:

<GifAnimation>
    <label>Gif Animation Simple</label>
    <params>-filter_complex 'palettegen[PAL],[0:v][PAL]paletteuse'</params>
    <extension>gif</extension>
    <category>Gif Animation</category>
  </GifAnimation>

Antwort2

Ich wollte nur den Code hinzufügen, der funktioniert hat, falls jemand anderes ihn braucht

Dies ist die letzte Zeile, die funktioniert hat; alles dank evilsoup und Mulvya.

ffmpeg -i test.mkv -filter_complex 'palettegen[PAL];[0:v]fifo[v0];[v0][PAL]paletteuse' test.gif

Wenn Sie Winff auch mit animierten GIFs verwenden möchten, fügen Sie einfach diese Zeilen zur Winff- presets.xmlDatei hinzu

<GifAnimationSimple>
    <label>Gif Animation Simple</label>
    <params>-f gif</params>
    <extension>gif</extension>
    <category>Gif Animation</category>
  </GifAnimationSimple>

  <GifAnimationbitrate>
    <label>Gif Animation bitrate Quality</label>
    <params>-f -b 2048k gif</params>
    <extension>gif</extension>
    <category>Gif Animation</category>
  </GifAnimationbitrate>

  <GifAnimationHigh>
    <label>Gif Animation high Quality paletteuse</label>
    <params>-filter_complex 'palettegen[PAL];[0:v]fifo[v0];[v0][PAL]paletteuse' </params>
    <extension>gif</extension>
    <category>Gif Animation</category>
  </GifAnimationHigh>

verwandte Informationen