Как сделать эффект размытия движения (motion blur) в ffmpeg?

Есть картинки-кадры некой анимации с частотой 60 fps. На выходе нужен gif с 20 fps.

ffmpeg ... -r 20 или ffmpeg ... -vf fps=20 или новый фильтр minterpolate – все просто выбрасывают избыточные кадры.

Есть ли способ именно для ffmpeg генерить кадры, накладывая один предыдущий и один последующий с 33% или 25% прозрачностью?
  • Вопрос задан
  • 1270 просмотров
Решения вопроса 1
sergiks
@sergiks Автор вопроса
♬♬
В обновлённом ffmpeg, начиная с версии 4.1, появился новый видео фильтр tmix – он смешивает N соседних кадров.

Для создания эффекта размытия движения, можно рендерить анимацию с частотой кадров в N раз выше, смешивать N соседних кадров, и снижать частоту обратно в N раз, просто выкидывая лишние кадры.

Скрипт примера
let WIDTH=640
let HEIGHT=480

let MID=$WIDTH/2

let BUFFER=16
let FRAMERATE=30

let XRATE=$BUFFER\*$FRAMERATE

let DURATION=8
let FPERIOD=$XRATE\*$DURATION

ffmpeg \
  -filter_complex \
  " \
    color=white:${WIDTH}x${HEIGHT}:d=$DURATION:r=$XRATE,format=rgb24[bg];  \
    color=black:8x${HEIGHT}:d=$DURATION:r=$XRATE,format=rgb24[bar];  \
    [bg][bar]overlay=x='$MID + $MID * sin(8 * PI * n / $FPERIOD)':y=0:format=yuv444,format=yuv420p[motion]; \
    [motion]tmix=frames=$BUFFER \
  " \
  -c:v libx264  \
  -r $FRAMERATE  \
  -an  \
  -hide_banner \
  -y  \
  output.mp4

Получившееся видео.

Чтобы анимация была плавнее и не страдала от округления координат до ближайшего четного целого, помог ответ от гуру ffmpeg'а Gyan: нужно форсить full chroma sampling.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AxianLTD
@AxianLTD
Я смотрю народ вот этим пользуется slowmovideo.granjow.net
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы