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.