如何做可變時間尺度?

如何做可變時間尺度?

我有一個視頻,我想根據從文件中讀取的比率來更改視頻的時間尺度。

我發現要讓整個影片的速度加倍,我可以使用濾鏡setptssetpts=2*PTS但是我想要做的是隨著時間的推移改變比例,這樣影片就會

  • 以 1 倍速度啟動
  • 在 5.7564 秒標記處,它將切換到 1.4 倍速度
  • 在 10.2571 秒標記處,它將切換到 0.983333x 速度
  • 在 15.6251 秒標記處,影片的其餘部分將切換到 1 倍速度。

我發現我可能需要製作一個可以讀取的腳本文件-filter_script:v,但我不知道該使用什麼來獲得我想要的行為。

我的第一個天真的方法是

setpts='
if(lt(T,5.7564),
    1*PTS,      
if(lt(T,10.2571),
    1.4*PTS,
if(lt(T,15.6251),
    0.983333*PTS,
    1*PTS
))))'

但這會導致影片在剪切點處跳躍,並可能導致影片的某些部分被跳過或重複。我現在明白為什麼會發生這種情況,但我不知道我該做什麼。

最好的方法可能是將影片切成 4 個片段,setpts=#*PTS每個片段只使用一個片段,但我不知道如何編寫腳本。

答案1

正如您所提到的,一種方法是將輸入修剪為四個單獨的段,並對其中兩個段應用 setpts 過濾器,最後將所有段連接起來。這是它的命令:

ffmpeg -i input.mp4 -lavfi "[0:v]trim=0:5.7564[firstpart];[0:v]trim=start=5.7564:10.2571,setpts=PTS-STARTPTS[secondpart];[0:v]trim=10.2571:15.6251,setpts=PTS-STARTPTS[thirdpart];[0:v]trim=15.6251,setpts=PTS-STARTPTS[forthpart];[secondpart]setpts=PTS/1.4[second];[thirdpart]setpts=PTS/0.983333[third];[firstpart][second][third][forthpart]concat=n=4:v=1:unsafe=1[out]" -map '[out]' output.mp4

相關內容