¿Cómo aplicar un filtro ffmpeg a un objeto en movimiento?

¿Cómo aplicar un filtro ffmpeg a un objeto en movimiento?

Tengo un video en el que quiero difuminar una parte de cada cuadro (cara). Tengo las coordenadas del cuadro delimitador de la cara y estas podrían cambiar con cada fotograma.

Después de revisar la documentación, entendí que la forma de hacerlo es aplicar una cadena de filtros.

  • Filtro de recorte para recortar la pieza.
  • Desenfocar el vídeo recortado
  • Superponga el vídeo recortado y borroso en la ubicación original
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

Esto funciona bien para las coordenadas del cuadro delimitador que no cambian a lo largo del vídeo. ¿Cómo puedo hacer esto para las ubicaciones de los cuadros delimitadores que podrían cambiar con cada cuadro?

Respuesta1

Si conoce las marcas de tiempo, puede usar trimel filtro para configurar la cadena de filtros necesarios para una duración específica en el video de entrada. El siguiente ejemplo establece tres cadenas diferentes de filtros cada 10 segundos. Todo lo que necesitas recordar es usar nombres diferentes [ ]para cada paso de -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

Respuesta2

No creo que sea práctico solucionarlo "manualmente" (sin programar).
En teoría podemos utilizarEvaluación de expresionespara configurar las coordenadas xy ysegún el número de fotograma o el tiempo del fotograma.


Construcción de patrón sintético (para demostración):

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

Ejemplo de colocación del área borrosa según el número de fotograma:

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

Salida de muestra (convertida a gif animado):
ingrese la descripción de la imagen aquí

información relacionada