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