Das Problem kann leicht gelöst werden, indem ein Filtergraph mit mehreren Ketten verwendet wird. Dadurch können wir den Such / Download / Filter nur einmal ausführen und ihn auf verschiedene Arten verarbeiten. Der gesuchte / gefilterte Stream wird sowohl dem Palettengenerator als auch dem Palettenanwendungsfilter zugeführt, der ihn zusammen mit der generierten Palette verwendet. Grafisch:
.--> palettegen [pal]---. input / | [0:v] -> fps -> scale -> split=2 [a][b] V with `-> [b] fifo [b] -> [b] [pal] paletteuse -> out.gif precise seek
was übersetzt in:
ffmpeg -ss $START -I $IN_URL -t $LENGTH -filter_complex "fps=$FPS,scale=$WIDTH:-1:flags=lanczos,split=2 [a][b]; [a] palettegen [pal]; [b] fifo [b]; [b] [pal] paletteuse" out.gif
Beachten Sie, dass zur Verwendung desselben Streams als Eingabe für zwei separate Pipelinenzweige der split
Filter verwendet werden muss.
Edit :fifo
wurde dank @Gyan Kommentarhinzugefügt; Dies ist notwendig, dapalettegen
vor dem Generieren der Palette bis zum Ende des Streams gewartet werden muss und derpaletteuse
Verbrauch erst beginnen kann[b]
, wenn die Palette vorhanden ist. Wenn das Video groß genug ist, sind die Standardpuffer für[b]
nicht ausreichend undffmpeg
werden Frames löschen. Die Lösung ist das Hinzufügen einesfifo
in der Mitte vorhandenen Puffers mit beliebiger Größe (es ist darauf zu achten, dass die Videolänge nicht überschritten wird, da das Puffern des gesamten Streams im Speicher den verfügbaren Arbeitsspeicher belasten kann).
(schamloser Plug: Dies ist der Befehl, den ich jetzt in meinem tube2gif_bot- Telegramm-Bot verwende.)
Am wichtigsten ist, dass dies eine Geschichte über das Verstehen der Befehle ist, die Sie verwenden . Der zweite Befehl, der in der Frage zitiert wurde, verwendete bereits ein komplexes Filtergraph, aber als ich es blind aus dem Web kopierte, versuchte ich nicht wirklich, die undurchsichtige Filtergraph-Syntax zu verstehen, daher kam es mir nicht so vor, als würde ich es nur ein bisschen anpassen wäre die beste Lösung gewesen.