
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 trim
Filter 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 x
und y
Koordinaten 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