
我有一個視頻,我想模糊掉每一幀的一部分(臉部)。我有面部邊界框的座標,這些座標可能會隨著每一幀而變化。
在深入研究文件後,我了解到執行此操作的方法是應用一系列過濾器
- 裁剪過濾器以裁剪掉部分
- 將裁切後的影片進行模糊處理
- 將剪裁和模糊的影片疊加在原始位置
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