ffmpeg slideshow com crossfade

1

Eu só descobri como fazer uma apresentação de slides com crossfade. É um processo de duas etapas. A primeira etapa lê as imagens com taxa de quadros 0,5 (o que significa 2 segundos para cada foto) e produz um vídeo intermediário com taxa de quadros 2. Isso significa que cada imagem é repetida 4 vezes. A segunda etapa aplica o filtro de taxa de quadros. O resultado é que cada imagem é mostrada por 1,5 segundos, seguida por um crossfade de 0,5 segundo.

ffmpeg -framerate 0.5 -i IMG_% 3d.jpg -r 2 -codec: v mpeg4 temp.mp4

ffmpeg -i temp.mp4 -vf "framerate = fps = 25" -codec: v mpeg4 out.mp4

Este processo de dois passos funciona bem, mas tenho duas perguntas:

  1. Também é possível obter o mesmo resultado em uma etapa, sem um arquivo de vídeo intermediário?
  2. Se a resposta à primeira pergunta for não, alguém pode me mostrar como os comandos acima devem ser modificados para um arquivo intermediário sem perdas, por exemplo, RAWVIDEO?

Obrigado Michael

    
por Michael 05.11.2017 / 11:10

2 respostas

1

Você pode refazer os quadros antes de aplicar o filtro:

ffmpeg -i IMG_%3d.jpg  -vf "setpts=N/0.5/TB,framerate=fps=25" -codec:v mpeg4 out.mp4

Update : O filtro de framerate parece estar vinculado à taxa de quadros de entrada na entrada, portanto, um método alt usando pipes

ffmpeg -framerate 0.5 -i IMG_%3d.jpg -vf fps=2 -f nut - | ffmpeg -f nut -i - -vf framerate=25 -c:v mpeg4 out.mp4

Uma solução alternativa de linha única:

ffmpeg -i IMG_%3d.jpg -vf zoompan=z=1:d=4:s=WxH:fps=2,framerate=25 -c:v mpeg4 out.mp4

onde W e H são substituídos pelas dimensões de entrada.

    
por 05.11.2017 / 12:52
1

Gostaria de resumir a solução:

ffmpeg -i IMG_%3d.jpg -vf zoompan=d=(A+B)/B:s=WxH:fps=1/B,framerate=25:interp_start=0:interp_end=255:scene=100 -c:v mpeg4 -maxrate 5M -q:v 2 out.mp4

onde A é a duração em segundos de quanto tempo cada imagem é mostrada (sem duração de crossfade), B é a duração do crossfade em segundos e WxH é o tamanho do vídeo de saída.

    
por 06.11.2017 / 12:18