FFMpeg: Convertendo um arquivo de vídeo em um gif com várias imagens de vídeo

2

Estou trabalhando em um projeto no qual o usuário pode enviar vídeos. Existe alguma maneira com FFmpeg eu posso tirar algumas imagens do vídeo e criar um GIF de fora?

Como o projeto está em Java, eu tenho uma maneira de obter uma imagem de um vídeo, mas criar um GIF requer várias imagens e está custando caro.

O servidor está rodando um sistema Debian X64, então se o FFMpeg não é adequado, eu estou aberto a outras ferramentas no Linux que podem fazer isso eficientemente.

    
por We are Borg 22.04.2016 / 16:47

1 resposta

3

Eu faço a extração de cenas de vídeos usando vlc para o linux. Se você não tiver, use

apt-get install vlc

para instalá-lo. Uma vez instalado, você pode usar uma variação da seguinte linha de comando para extrair o (s) quadro (s) do seu vídeo. O formato de imagem padrão é png e é bom para o meu propósito. Se você insistir em gif images, sugiro instalar imagemagick para conversões de formato de imagem. Aqui está o comando que extrai os quadros:

cvlc ${videofile} \
         --video-filter=scene \
         --vout=dummy \
         --start-time=${start-sec} --stop-time=${end-sec} \
         --scene-ratio=1 --scene-prefix=${prefix} \
         --scene-path=${MyStorePath} \
         vlc://quit

onde

videofile is an mp4 format video. Other formats might be possible but didn't test

start-sec is where you want your frame grab starts from, in seconds from the beginning

end-sec is where you want your frame grab ends, in seconds from the beginning. Must be greater than start-sec

prefix is the prefix of the file names for captured images.

MyStorePath is the path where you want to store captured images.

Este comando ajuda você a descobrir a duração do vídeo:

ffmpeg -i ${vidfile} 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
A saída

está no formato HH:MM:SS.xx . para converter isso em tamanho de vídeo em segundos, eu uso

l=$(ffmpeg -i ${vidfile} 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//)
h=$(echo $l|cut -d: -f1)
m=$(echo $l|cut -d: -f2)
s=$(echo $l|cut -d: -f3|cut -d"." -f1)
(( hh=$h*3600 ))
(( mm=$m*60 ))
(( LengthSeconds=$hh+$mm+$s ))

neste ponto, você pode manipular a variável LengthSeconds para determinar automaticamente os horários de início e término. Infelizmente, para que meu comando vlc funcione, você precisa especificar uma fatia de tempo para extrair quadros de.

    
por 22.04.2016 / 17:30