Wie wende ich einen FFMPEG-Filter auf ein bewegtes Objekt an?

Wie wende ich einen FFMPEG-Filter auf ein bewegtes Objekt an?

Ich habe ein Video, in dem ich einen Teil jedes Frames (Gesicht) unscharf machen möchte. Ich habe die Koordinaten für den Begrenzungsrahmen des Gesichts und diese könnten sich mit jedem Frame ändern.

Nachdem ich die Dokumentation durchforstet habe, habe ich verstanden, dass dies durch die Anwendung einer Filterkette möglich ist

  • Zuschneidefilter zum Ausschneiden des Teils
  • Das zugeschnittene Video verwischen
  • Überlagern Sie das zugeschnittene und unscharfe Video am ursprünglichen Speicherort
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

Dies funktioniert gut für Begrenzungsrahmenkoordinaten, die sich im Verlauf des Videos nicht ändern. Wie kann ich dies für Begrenzungsrahmenpositionen tun, die sich mit jedem Frame ändern können?

Antwort1

Wenn Sie die Zeitstempel kennen, können Sie mit trimFilter die Kette der benötigten Filter für eine bestimmte Dauer im Eingabevideo festlegen. Das folgende Beispiel legt alle 10 Sekunden drei verschiedene Filterketten fest. Sie müssen nur daran denken, [ ]für jeden Schritt unterschiedliche Namen zu verwenden -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

Antwort2

Ich glaube nicht, dass es praktisch ist, es "manuell" (ohne Programmierung) zu lösen.
Theoretisch können wir verwendenAusdrucksauswertungzum Einstellen der xund yKoordinaten entsprechend der Frame-Nummer oder Frame-Zeit.


Erstellen eines synthetischen Musters (zur Demonstration):

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

Beispiel zur Positionierung des unscharfen Bereichs nach Bildnummer:

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

Beispielausgabe (in animiertes GIF konvertiert):
Bildbeschreibung hier eingeben

verwandte Informationen