ffmpeg: 둥영상을 정확한 프레임 단위로 자르기

!
경고: 이 글이 작성된 지 365일이 넘었습니다. 글의 정보가 오래되어 부정확할 수 있습니다.

둥영상들을 다음 명령으로 ffmpeg으로 자를 때:

ffmpeg -i input.mp4 -ss 00:00:24.183 -to 00:03:22.183 -c copy output.mp4

어떤 경우에는 ffmpeg가 정확한 프레임으로 자르지 않는 것을 보셨을 수도 있습니다. 지정된 시간인 00:00:24.183보다 몇 프레임, 또는 몇 초 이후로 시작하는 경우입니다. 더욱 문제가 되는 점은, ffmpeg가 마음대로 고른 프레임에 도달할 때까지 둥영상이 멈춰있는 것처럼 보이고, 도달한 이후에 영상이 재생된다는 점입니다. 무엇이 문제일까요?

답은 (이전 ffmpeg 관련 블로그 글들과 같이) 키프레임 타입에 있습니다. 간단히 설명하자면 특정 키프레임들(P-프레임과 B-프레임들)은 렌더링할 때 I-프레임을 필요로 합니다. 그래서 지정된 타임코드이 정확히 I-프레임에서 시작하지 않을 경우, ffmpeg는 첫 I-프레임을 찾을 때까지 둥영상을 건너뛴 다음, 그 첫 I-프레임을 둥영상의 시작까지 반복합니다. 다음과 같이 말이죠:

원본 파일:

IPPPBIPPPBIPPPBIPPPB
       ^ 지정된 시작 타임코드

ffmpeg 시작 지점:

----------IPPPBIPPPB
          ^

비어있는 프레임들을 ffmpeg가 채우는 방식:

-------IIIIPPPBIPPPB

최종적으로 크기에 맞게 자르기:

IIIIPPPBIPPPB

그러면 ffmpeg가 시작 타임코드 이전에 있는 I-프레임으로 재인코딩하게 할 수는 없을까요? 원래 명령문에 -c copy 옵션값을 보셨다면, 이 부분이 문제가 됩니다. 이 옵션값은 ffmpeg에게 재인코딩 없이 둥영상을 그대로 복사하라는 지시를 하는데, 빠르긴 하지만 ffmpeg가 프레임을 쌓아 재인코딩을 할 수 없게 만듭니다. 여기에서의 해결방안은 그냥 인코더를 사용하여 재인코딩을 가능하게 옵션값을 교체하는 것입니다:

ffmpeg -i input.mp4 -ss 00:00:24.183 -to 00:03:22.183 -c:v libx264 -crf 18 output.mp4

비슷한 게시물

댓글