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