FFMPEG: Converta vídeo em Visualização de GIF animado, obtendo quadro após intervalo

0

Gostaria de gerar uma visualização gif para o meu aplicativo e o fiz no meu servidor usando o FFMPEG.

Ele deve gerar um gif obtendo 10 quadros para cada vídeo, mas sem usar um diretório temporário (ou arquivos temporários relacionados a cada quadro), se possível.

Em relação a essa resposta no superuser.com , ele deve gerar um gif usando cada quadro, isso não é necessário.

Parece estranho, mas o efeito que preciso é algo que você pode ver em muitos sites pornográficos (não me lembro o que)

andreaem
fonte

Respostas:

2

Se bem entendi, este artigo no Wiki do FFmpeg chamado "Criar uma imagem em miniatura a cada X segundos do vídeo" mostra que o FFmpeg não pode fazer o que deseja (sem alguns cálculos automatizados).

O wiki diz que -vf "fps=fps=XYZ"é sua melhor chance - ele criará uma miniatura / quadro a cada quadro XYZdo vídeo original. Se você realmente deseja 10 fotos por vídeo e todas elas têm comprimentos diferentes, primeiro você pode ler a contagem total de quadros e calcular os fps necessários com um script:

XYZ=wanted_frames_times_actual_fps/total_frames_of_vid

por wanted_frames_times_actual_fpsexemplo, 10*25(PAL) ou 10*30(NTSC) no seu caso e total_frames_of_vid=(hh*3600+mm*60+ss)*25+ff, onde hhsignifica horas, mmsignifica minutos, sssegundos, e ffquadros (após o último segundo contado). Exemplo de cálculo: um código de tempo de 01:35:45:24(ou 01:35:45.960nos termos do FFmpeg, como o FFmpeg não usa quadros, mas milissegundos) a 25 quadros por segundo se assemelha ao total de 143649 quadros.

Essa solução pode funcionar - você só precisa encontrar uma maneira de obter o tempo total do vídeo (por exemplo, via ffprobe) e seus fps (se você não conseguir um código de tempo adequado) e, em seguida, armazenar essas informações como uma variável chamada $total_frames_of_vid.


Eu encontrei outra abordagem sobre isso na seção "Also see" da Wiki, com um link para uma pergunta de superusuário chamada "Miniaturas significativas para um vídeo usando o FFmpeg", que sugere o uso de:

ffmpeg -hide_banner -i <YOUR_VIDEO> -vf "select=gt(scene\,0.8)" -frames:v 10 -vsync vfr -vf "fps=fps=1/200" -y out%03d.png

(Modifiquei o código um pouco - alterei o codec da imagem para PNG e alterei os valores para -frames:ve fps. Também alterei as imagens de saída para ter três dígitos em seus nomes.)

e depois recodificá-los no seu GIF.

Esta solução também precisa de algum trabalho manual ou computacional, pois os valores de todas as opções (e principalmente fpsprecisam ser alterados de acordo com a duração do vídeo. Ou seja, eu tentei o código original do superusuário com um vídeo de 35 minutos - e obtive apenas 5 quadros .

flolilo
fonte