Questão ffmpeg: zoompan suave sem agitar


Eu estou tentando criar um zoompan básico de 5 segundos para o centro de uma imagem (a partir do exemplo no site ffmpeg.org). O comando abaixo funciona, mas treme mais do que minhas mãos depois de 5 xícaras de café:

ffmpeg -framerate 25 -loop 1 -i island.jpg -filter_complex "[0:v]scale=-2:480,zoompan=z='min(zoom+0.0015,1.5)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=125,trim=duration=5[v]" -map "[v]" -y out.mp4

Entrada jpg. Saída mp4.

Estou ciente do bug do ffmpeg # 4298. A solução sugerida postada é usar o scale filtrar antes de zoompan. Mas, como mostrado no meu exemplo, isso ainda parece não ter efeito.

Parece que qualquer valor arbitrário de x ou y causa o efeito de sacudir / sacudir / sacudir.

Alguém pode oferecer algum tipo de solução eficaz? Obrigado!

Informação da versão:

ffmpeg version 3.1.2-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (Debian 5.4.0-6) 20160609

4


origem




Respostas:


Evitar baixaescala de antemão. Aplique uma função trunc às expressões x e y. Ou upscale isso antes. De preferência o último. Isso elimina a maior parte do jitter para mim.

ffmpeg -framerate 25 -loop 1 -i island.jpg -filter_complex "[0:v]scale=8000x4000,zoompan=z='min(zoom+0.0015,1.5)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=125,trim=duration=5[v]" -map "[v]" -y out.mp4

Basicamente, o filtro está arredondando os valores do x e y expressões, que podem ser arredondadas para cima ou para baixo. Isso está criando um movimento irregular devido a mudanças na direção do pan. Aumentar a resolução antecipadamente permite que o arredondamento seja menor.


10



Perfeito, obrigado! Eu também fui capaz de diminuir o zoom após o filtro zoompan para obter o desejado 480p e o zoom permaneceu suave: ffmpeg -framerate 25 -loop 1 -i island.jpg -filter_complex "[0:v]scale=8000x4000,zoompan=z='min(zoom+0.0015,1.5)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=125,trim=duration=5[v1];[v1]scale=-2:480[v]" -map "[v]" -y out.mp4 - Timbo White
Você pode dimensionar a saída de dentro do zoompan e..g :d=125:s=hd480 ou d=125:s=640x360 - Gyan
OK então s é o tamanho da imagem de saída do zoompan. Mas não parece haver uma maneira de obter a escala do zoompan para preservar automaticamente a proporção da imagem original. Assim, para obter o resultado para uma altura de 480 com a proporção preservada para este exemplo 4000x2000, você teria definido manualmente o zoompan para s=960x480 (não pode usar truque -2x480). Caso contrário, o zoompan usa s=hd720 (1280x720) por padrão, o que distorce a proporção. - Timbo White
@Mulvya, você pode expandir em "aplicar uma função trunc às expressões xey?" O upscaling pode causar uma diminuição no desempenho, talvez haja um trabalho alternativo. - Eric
Depois que o filtro avaliar o valor x & y para um determinado quadro,trunc irá remover a parte fracionária do resultado. Aplique-o assim x=trunc(iw/2-(iw/zoom/2)). Isso pode não ser tão suave quanto a rota luxuosa. - Gyan