Eu tenho uma pasta cheia de vídeos que quero converter em gifs animados. O ffmpeg / avconv faz um trabalho ruim ao fazê-lo diretamente, então, em vez disso, converto o vídeo em um gif, primeiro exibindo cada quadro como png e depois convertendo-o novamente em gif usando o imagemagick. O problema é que isso resulta em um grande gif em termos de tamanho do arquivo. Para resolver isso, quero "soltar" cada segundo ou enésimo quadro do gif, pulando todos os arquivos de imagem ao converter para um gif ou removendo os quadros de um gif. Como posso fazer isso no Ubuntu (13.04) usando o imagemagick ou algum outro utilitário de linha de comando?
fonte
let i=0; while [[ $i -lt $(($numframes / 2)) ]]; do gifsicle $2 --delete "#$i" -o $2; let i=i+1; done
gifsicle "$1" --unoptimize $(seq -f "#%g" 0 2 $numframes) -O2 -o "$2"
fará isso em uma chamada.chmod +x gifdrop.sh
Aqui está uma solução mais simples usando gifsicle do que o roteiro de JohnB:
Este comando deve funcionar na maioria dos shells do Unix; Eu testei no bash. Substitua
input.gif
eoutput.gif
pelos nomes dos arquivos de entrada e saída e99
pelo número de quadros na sua animação. (Não há problema em usar um número maior, mas os gifs se queixam disso.)Algumas notas:
A
-U
opção mesclará os quadros na animação de entrada com os anteriores, de modo que cada quadro fique sozinho e não dependa de outros. Você realmente deseja fazer isso antes de fazer praticamente qualquer coisa com animações, caso contrário, provavelmente obterá resultados confusos. (Se sua animação de entrada já não estiver otimizada, o gifsicle pode imprimir um aviso sobre ela, mas isso também é totalmente inofensivo.)Por outro lado, o
-O2
switch otimiza novamente a animação de saída para minimizar o tamanho do arquivo. Com a animação de amostra de JohnB, reduz o tamanho da saída em 27%.O
seq
comando apenas gera uma sequência de números de 0 a 99, contando as etapas de 2. O-f "#%g"
faz imprimir um#
antes de cada número, o que faz com que o gifsicle o entenda como uma seleção de quadro em vez de um nome de arquivo. Os backticks (`
) ao redor do comando seq fazem com que sua saída seja incluída como parâmetros na linha de comando do gifsicle.Se você não quiser que o gif acelere, use
gifsicle -I input.gif
o atraso de quadro atual, multiplique-o por 2 e use-ogifsicle -d ${delay} ...
.fonte
gifsicle input.gif `seq -f "#%g" 0 2 $(identify input.gif | tail -1 | cut -d "[" -f2 - | cut -d "]" -f1 -)` --unoptimize -O2 -o output.gif
useless unoptimization-related input option
. Então eu fiz isso em duas etapas (de dentro do Git Bash): 1.gifsicle -U -o unoptimized.gif input.gif
2.gifsicle unoptimized.gif `seq -f "#%g" 0 2 99` -O2 -o output.gif
Usando o Photoshop
Esta não é uma solução de código aberto ou de linha de comando, mas você pode fazer isso com o Photoshop:
Arquivo ▸ importação ▸ Vídeo Frames em camadas ...
" Limitar a todos os quadros __ " fará o truque para você
fonte
Aqui está minha solução usando o processamento de script em lote ...
Primeiro copie o gif animado capturado e original para o arquivo input.gif e inicie o interpretador de comandos e digite:
gifsicle input.gif -I "# -1"> input.txt
consulte input.txt e veja qual é o tamanho da animação - quantos quadros ela contém ...
input.txt:
em seguida, edite-crie test.bat e altere o valor da variável len = especifique_length_number_from_input.txt e salve test.bat ...
test.bat:
finalmente inicie process1.bat e process2.bat e a animação cortada com cada quadro ímpar será processada no arquivo input.gif
process1.bat:
process2.bat:
fonte
Eu acho que preciso de uma nova explicação mais sofisticada (o atraso de quadros também é uma coisa importante que deve ser considerada também) ... Para esse novo processo, você precisará baixar o JREPL.BAT neste link: http://www.dostips.com /forum/viewtopic.php?t=6044
Primeiro copie o gif capturado no arquivo input.gif e inicie o interpretador de comandos e digite:
gifsicle input.gif -I "# -1"> input.txt
olhe para input.txt e veja qual é o comprimento da animação - quantos quadros ele contém ... também olhe para o atraso do quadro e se é 0,07s significa que você deve colocar a opção -d14 (7msec * 2) nessa linha em process.cmd: gifsicle -b -U -d14 input.gif, após editar, salve process.cmd
edite test.bat e altere o valor da variável 166 dessa linha para corresponder ao número de quadros de animação: para / L %% i IN (1,2,166) DO echo "# %% i" >> input.bat, depois editar salvar test.bat ...
então inicie process.cmd e a animação cortada com todos os quadros ímpares será processada no arquivo input.gif
PS A vantagem desse método também é que você tem controle total do que deseja excluir do gif (a cada segundo quadro (1,2,166) ou a cada terceiro (1,3,166)), e assim por diante, basta alterar o número do meio em linha de lote, mas lembre-se de que, se você especificar (1,3,166), deverá alterar -d14 (opção de atraso) de process.cmd para refletir a alteração (7msec * 3/2 = 10), portanto, em vez de (7msec * 2 / 1 = 14), a opção de atraso deve ser -d10 ...
Outros arquivos (por exemplo, removendo cada segundo quadro): test.bat:
process.cmd:
E o arquivo leia-me auxiliar input.txt:
fonte