O problema pode ser facilmente resolvido usando um filtro gráfico com várias redes , o que nos permite realizar a pesquisa / download / filter apenas uma vez e processá-lo de várias maneiras. O fluxo de procura / filtrado é alimentado para o gerador de paleta e para o filtro de aplicativo de paleta, que o utiliza junto com a paleta gerada. Graficamente:
.--> palettegen [pal]---.
input / |
[0:v] -> fps -> scale -> split=2 [a][b] V
with '-> [b] fifo [b] -> [b] [pal] paletteuse -> out.gif
precise
seek
que se traduz em:
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
Observe que para usar o mesmo fluxo como entrada para duas ramificações de pipeline separadas, é necessário usar o filtro split
.
Editar : fifo
foi adicionado graças ao comentário do @Gyan ; é necessário porque palettegen
precisa esperar até o final do fluxo antes de gerar a paleta, e paletteuse
não pode começar a consumir [b]
antes de ter a paleta, portanto, se o vídeo for grande o suficiente, os buffers padrão serão [b]
não será suficiente e ffmpeg
começará a descartar quadros. A solução é adicionar um fifo
no meio para manipular o buffer de tamanho arbitrário (é preciso tomar cuidado para não exceder o comprimento do vídeo, já que armazenar em buffer todo o fluxo na memória pode estar sobrecarregando a RAM disponível).
(plug sem vergonha: este é o comando Estou usando agora no meu tube2gif_bot bot de telegrama
Mais importante ainda, este é um conto sobre entender os comandos que você está usando ; o segundo comando citado na questão já usou um filtro-gráfico complexo, mas como copiei-o cegamente da web eu realmente não tentei entender a sintaxe opaca do filtro de grafos, então não me ocorreu que apenas ajustando um pouco teria sido a melhor solução.