가변 시간 척도를 수행하는 방법은 무엇입니까?

가변 시간 척도를 수행하는 방법은 무엇입니까?

파일에서 읽은 비율을 기반으로 비디오의 시간 척도를 변경하고 싶은 비디오가 있습니다.

setpts전체 비디오의 속도를 두 배로 높이려면 필터를 사용할 수 있다는 것을 알았습니다 setpts=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

언급한 한 가지 접근 방식은 입력을 4개의 별도 세그먼트로 자르고 그 중 두 개에 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

관련 정보