话不多说,直接分享最终的命令如下
1.图片慢慢放大
ffmpeg -y -i input.png -filter_complex "[0:v]scale=3840x2880,zoompan=z='min(zoom+0.0016,1.2)':d=120:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)',scale=960:720[v]" -map "[v]" -c:v libx264 -profile:v baseline -pix_fmt yuv420p -crf 28 -preset slow -aspect 4:3 output.mp4
0.0016怎么算出来。因为图片要放大1.2倍,所以(1.2-1)/120 = 0.0016,120是帧,在ffmpeg,25帧为1秒。
2.图片慢慢缩小
ffmpeg -y -i input.png -filter_complex "[0:v]scale=3840x2880,zoompan=z='max(1.2-0.0016*on,1)':d=120:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)',scale=960:720[v]" -map "[v]" -c:v libx264 -profile:v baseline -pix_fmt yuv420p -crf 28 -preset slow -aspect 4:3 output.mp4
核心原理:先放大图片再缩放图片,可以减少视频的抖动。
参考文档:https://blog.csdn.net/happydeer/article/details/122385254
https://blog.dreamfever.me/posts/2024-05-19-ffmpeg-keyframe-animation/#%E7%BC%A9%E6%94%BE
修复bug: https://superuser.com/questions/1112617/ffmpeg-smooth-zoompan-with-no-jiggle