
幾天以來,我遇到了 ffmpeg 的問題,這實際上讓我發瘋......我嘗試使用 FFMPEG 的 filter_complex 來提取視頻文件的某些短片段(以 60fps 拍攝)。我知道我想要用於剪輯的原始素材中的確切幀。我用修剪過濾命令與設定點,如果我想改變每個片段的速度。在實際情況中,我希望第一個片段保持原始速度 (1.0),並且產生的輸出影片應為 30fps,而不是原始片段 60fps。這是我正在使用的程式碼:
ffmpeg -y -i footage60fps -filter_complex "
[0:v]trim=start_frame=28:end_frame=82,setpts=PTS-
STARTPTS,setpts=1.0*PTS[v0];
[0:v]trim=start_frame=10:end_frame=20,setpts=PTS-
STARTPTS,setpts=2.0*PTS[v1]; [v0][v1]concat=n=2:v=1:a=0[out] " -map [out] -
preset ultrafast -r 30 output30fps.mp4
我期望的結果是,在第一個片段(第28 幀直到第82 幀之前的最後一個幀)中,ffmpeg 每隔一幀就會丟棄一次([x]),以便以正常速度將其從60fps轉換為30fps:[28] [x][30][x][32][x]...[80]
然而,我得到的結果是: [28][29][30][31][x][33][x][35][x]...[81]
有人理解這種行為嗎?我該如何解決它?這似乎是一個小問題,但事實證明,在音樂等方面變得尖銳時非常煩人......任何幫助將不勝感激!
答案1
使用
ffmpeg -y -i footage60fps -filter_complex "
[0:v]trim=start_frame=28:end_frame=82,setpts=PTS-STARTPTS,framestep=2[v0];
[0:v]trim=start_frame=10:end_frame=20,setpts=PTS-STARTPTS,setpts=2.0*PTS[v1];
[v0][v1]concat=n=2:v=1:a=0[out]" -map [out] -r 30 -preset ultrafast output30fps.mp4
我還沒有研究您所看到的行為的原因,但是當您將像這樣的不同速率流與 concat 過濾器混合併應用 CFR 速率一致性時,丟幀的節奏並不總是符合預期。