Всё описанное можно сделать в ffmpeg.
Анимированный зум делается фильтром
zoompan. Он с только целыми координатами работает, поэтому, чтобы не дергался, делать это в повышенном разрешении. Потом даунсэмплить.
Например, из недавнего проекта, где интерактивно генерилась анимация по шаблону, это из bash-скрипта:
FILTER="[0] \
pad=color=0x99999900:w=${wIn}:h=${hIn}:x=${xPad}:y=${yPad}, \
scale=20064x3264, \
zoompan= \
s=${wSrc}x${hSrc} \
:d=${frames} \
:z='( ${zoomcode} ) / 16.89999' \
:x='2*(${xPad} + ${xPoi}) * (zoom - 1) / zoom' \
:y='2*(${yPad} + ${yPoi}) * (zoom - 1) / zoom' \
[fg]; \
[1][fg]overlay=x=247:y=438 \
"
Т.к. зумить меньше, чем влезает во вьюпорт нельзя, сначала картинке добавляется по краям паддинг прозрачный, чтобы можно было уменьшать. Потом размер увеличивается с запасом раз в 5-10, чтобы сделать незаметными целочисленные пиксельные шаги зума и смещения.