Как применить фильтр ffmpeg к движущемуся объекту?

Как применить фильтр ffmpeg к движущемуся объекту?

У меня есть видео, в котором я хочу размыть часть каждого кадра (лицо). У меня есть координаты для рамки, ограничивающей лицо, и они могут меняться с каждым кадром.

Покопавшись в документации, я понял, что это можно сделать, применив цепочку фильтров.

  • Фильтр обрезки, чтобы обрезать часть
  • Размыть обрезанное видео
  • Наложить обрезанное и размытое видео на исходное место
ffmpeg -i input_video.mp4 -filter_complex "[0]crop=200:200:60:30[cropped];[cropped]avgblur=10[croppedblurred];[0][croppedblurred]overlay=60:30" output_video.mp4

Это хорошо работает для координат ограничивающего прямоугольника, которые не меняются в видео. Как я могу сделать это для локаций ограничивающих прямоугольников, которые могут меняться с каждым кадром?

решение1

Если вы знаете временные метки, вы можете использовать trimфильтр, чтобы задать цепочку необходимых фильтров для определенной длительности во входном видео. Пример ниже устанавливает три разные цепочки фильтров каждые 10 секунд. Все, что вам нужно запомнить, это использовать разные имена [ ]для каждого шага -filter_complex.

ffmpeg -i input.mp4 -filter_complex ^
 ^"[0:v]trim=start=0:end=10[a]; ^
   [0:v]trim=start=10:end=20,setpts=PTS-STARTPTS[b]; ^
   [0:v]trim=start=20,setpts=PTS-STARTPTS[c]; ^
   [a] here insert your chain of filters for this part of video [aa]; ^
   [b] here insert your chain of filters for this part of video [bb]; ^
   [c] here insert your chain of filters for this part of video [cc]; ^
   [aa][bb]concat[aaa]; ^
   [aaa][cc]concat[video]^" ^
 -map [video]:v -map 0:a -c:v libx264 -crf 18 -c:a copy output.mp4

решение2

Я не думаю, что это практично решать "вручную" (без программирования).
Теоретически, мы можем использоватьОценка выражениядля установки координат xи yв соответствии с номером кадра или временем кадра.


Построение синтетической модели (для демонстрации):

ffmpeg -y -f lavfi -r 10 -i testsrc=size=192x108:rate=1:duration=300 -vf setpts=N/10/TB -vcodec libx264 -pix_fmt yuv444p -crf 17 input_video.mp4

Пример расположения размытой области в соответствии с номером кадра:

ffmpeg -y -i input_video.mp4 -filter_complex "[0]avgblur=10,crop=50:50:'if(lte(n,100), n+10, if(lte(n,200), 210-n, 10))':'if(gte(n,100), 5+(n-100)/5, 5)'[blurredcropped];[0][blurredcropped]overlay='if(lte(n,100), n+10, if(lte(n,200), 210-n, 10))':'if(gte(n,100), 5+(n-100)/5, 5)':format=yuv444" -vcodec libx264 -pix_fmt yuv444p -crf 17 output_video.mp4

Пример вывода (конвертированный в анимированный gif):
введите описание изображения здесь

Связанный контент