ffmpeg로 특정 비디오 프레임을 자르고 프레임 속도를 변환하는 방법은 무엇입니까?

ffmpeg로 특정 비디오 프레임을 자르고 프레임 속도를 변환하는 방법은 무엇입니까?

며칠 후 실제로 나를 미치게 만드는 ffmpeg 문제가 발생했습니다. 비디오 파일의 특정 짧은 세그먼트(60fps로 촬영)를 추출하기 위해 FFMPEG의 filter_complex를 사용하려고 합니다. 자르기에 사용하려는 원본 영상의 정확한 프레임을 알고 있습니다. 나는손질필터 명령을 함께 사용설정, 각 조각의 속도를 변경하려는 경우. 실제 경우에는 원본 속도(1.0)의 첫 번째 스니펫을 갖고 싶고 결과 출력 비디오는 원본 푸티지 60fps 대신 30fps여야 합니다. 내가 사용하는 코드는 다음과 같습니다.

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

내가 기대하는 결과는 첫 번째 조각(82 이전의 마지막 프레임까지의 프레임 28)에서 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 속도 적합성을 적용할 때 프레임 드롭의 흐름이 항상 예상한 것과는 다릅니다.

관련 정보