FFMPEG: Converter vídeo para visualização gif animada recebendo frame após intervalo

0

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

Ele deve gerar um gif recebendo 10 quadros para cada vídeo, mas sem usar uma pasta temporária (ou arquivos temporários relacionados a cada quadro), se for possível.

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

Parece estranho, mas o efeito que eu preciso é algo que você pode ver em muitos sites de pornografia (não me lembro quais deles)

    
por andreaem 30.08.2017 / 20:59

1 resposta

2

Se eu entendi corretamente, este artigo sobre O 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 você quer (sem alguns cálculos automatizados).

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

XYZ=wanted_frames_times_actual_fps/total_frames_of_vid

com wanted_frames_times_actual_fps sendo, e. 10*25 (PAL) ou 10*30 (NTSC) no seu caso e total_frames_of_vid=(hh*3600+mm*60+ss)*25+ff , onde hh significa horas, mm significa minutos, ss significa segundos e ff significa quadros (após o último contado em segundo). Exemplo de cálculo: um timecode de 01:35:45:24 (ou 01:35:45.960 nos termos do FFmpeg, como o FFmpeg não usa quadros mas milissegundos) a 25 quadros por segundo lembra o total de 143649 quadros.

Esta solução pode muito bem 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 timecode adequado) e então armazenar essa informação como um variável chamada $total_frames_of_vid .

Encontrei outra abordagem sobre isso na seção "Veja também" do Wiki, com links para uma pergunta de superusuário com o nome "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 - mudei o codec de imagem para PNG e mudei os valores para -frames:v e fps . Também alterei as imagens de saída para ter três dígitos em seus nomes.)

e, em seguida, codificá-los novamente no seu GIF.

Esta solução também precisa de alguns cálculos ou trabalho manual, já que os valores de todas as opções (e especialmente fps precisam ser alterados de acordo com a duração do vídeo. Eu tentei o código original do superusuário com um vídeo 35min tenho 5 quadros fora disso.

    
por 31.08.2017 / 14:40