키프레임 간격이란? I-프레임, GOP, 컷의 관계

키프레임 간격은 영상에서 완전한 이미지로 저장된 프레임 사이의 거리로, 스트림 카피 컷과 빠른 탐색이 놓이는 위치를 정합니다. 간격을 확인하고 설정하는 방법을 설명합니다.

읽는 시간 5분Sume
전체 가이드

키프레임 간격은 영상의 키프레임, 즉 완전한 이미지로 저장된 프레임 사이의 거리입니다. 그 사이의 프레임은 변화만 저장하므로 디코딩은 키프레임에서 시작해야 하고, 재인코딩 없는 컷이나 빠른 탐색은 키프레임에만 놓일 수 있습니다. 간격은 영상을 인코딩할 때 정해지며, GOP(group of pictures) 크기라고도 합니다.

FFmpeg 관련 내용은 FFmpeg의 ffmpeg, 코덱, ffprobe 문서에서, Sume의 동작은 영상 트림과 영상 검사 문서, Sume API 레퍼런스에서 가져왔으며, 모두 2026-09-28에 확인했습니다. 현재 동작이라고 설명한 내용은 Sume의 코드에서 확인한 것입니다.

I-프레임, P-프레임, B-프레임은 무엇인가요?

키프레임은 I-프레임입니다. 그 뒤로 다음 키프레임 전까지의 프레임은 대신 변화를 P-프레임이나 B-프레임으로 저장하며, 이 프레임들이 함께 GOP(group of pictures) 하나를 이룹니다.

  • I-프레임(키프레임): 그 자체로 디코딩되는 완전한 이미지입니다.
  • P-프레임: 앞선 프레임에서 달라진 부분을 저장합니다.
  • B-프레임: 앞뒤 양쪽 프레임을 기준으로 달라진 부분을 저장합니다.
  • FFmpeg의 libx264 옵션에서 -g(x264의 keyint)는 최대 GOP 크기, -keyint_min(min-keyint)은 최소 GOP 크기, -bf(bframes)는 I-프레임과 P-프레임 사이의 B-프레임 수입니다.

키프레임 간격은 왜 중요한가요?

디코딩 없이 컷이나 이동이 지정한 지점에 얼마나 가깝게 놓일 수 있는지를 간격이 정하기 때문입니다. 스트림 카피로 만든 컷은 인포인트와 같거나 그보다 앞선 키프레임에서 시작하므로 최대 간격 하나만큼 일찍 시작하고, 재인코딩한 컷은 그 키프레임부터 디코딩한 뒤 지정한 지점 앞의 프레임을 버립니다. FFmpeg 영상 자르기: 시간 지정과 재인코딩 여부에서 FFmpeg의 -ss로 두 방식을 모두 보여 줍니다.

Sume의 미디어 도구에서도 이 트레이드오프의 양쪽을 볼 수 있습니다. 이 도구들은 이전 Sume Job의 출력처럼 워크스페이스에 있는 media.sume.com 파일만 읽습니다.

영상 트림과 영상 검사 기준, 2026-09-28 확인.
Sume 작업키프레임 간격의 영향
영상 트림, precision: "keyframe"재인코딩 없는 스트림 카피. 컷이 GOP 하나만큼 일찍 시작될 수 있으며, 결과의 actual_start_seconds가 실제 시작 위치를 알려 줌.
영상 트림, precision: "exact"(기본값)프레임 단위로 정확한 재인코딩(libx264, yuv420p)이라 소스의 키프레임이 컷을 제한하지 않음.
영상 검사 스틸, seek: "fast"각 스틸이 해당 시점과 같거나 그보다 앞선 키프레임에 맞춰짐. 최대 GOP 하나만큼(일반적인 소스에서 대략 0–5초) 앞당겨질 뿐, 뒤로 밀리지는 않음.
영상 검사 스틸, seek: "precise"(기본값)정확한 시점까지 디코딩.

Sume의 인코딩은 어떤 키프레임 간격을 쓰나요?

현재 코드에서 타임라인 합성과 Timeline 렌더는 -g와 -keyint_min을 출력 프레임 레이트로 설정하고, exact 트림과 영상 필터는 소스의 프레임 레이트를 알 때 그 값을 반올림해 설정합니다. 따라서 트림의 output.fps나 필터 프로그램이 프레임 레이트를 낮추지 않는 한, 키프레임 사이 간격은 길어야 약 일 초입니다. 그러므로 이런 파일을 나중에 keyframe 트림하면 시작 위치는 길어야 약 일 초 앞당겨집니다. 트림 정밀도를 언제 무엇으로 고를지는 긴 영상을 짧은 클립으로 나누기에서 설명합니다.

FFmpeg에서 키프레임 간격은 어떻게 설정하나요?

인코딩할 때 설정하세요. libx264에서 -g는 GOP의 상한을 프레임 수로 정하므로, 프레임 레이트에 원하는 초를 곱하세요. 24 fps에서 -g 48은 적어도 2초마다 키프레임이 하나 있다는 뜻입니다. -force_key_frames는 대신 시간 기준으로 키프레임을 넣으며, FFmpeg 문서는 5초마다 하나씩 강제하는 데 expr:gte(t,n_forced*5)를 씁니다.

  • -g는 최댓값이므로, 인코더가 키프레임을 그보다 촘촘하게 넣을 수도 있습니다.
  • FFmpeg 문서는 키프레임을 너무 많이 강제하면 일부 인코더의 룩어헤드(lookahead) 알고리즘에 매우 해로우며, 고정 GOP 옵션이나 그와 비슷한 방법이 더 효율적일 것이라고 경고합니다.
  • 두 명령 모두 영상을 재인코딩합니다. 스트림 카피는 소스의 키프레임을 정확히 원래 위치에 그대로 둡니다.
# At most 48 frames (2 s at 24 fps) between keyframes
ffmpeg -i input.mp4 -c:v libx264 -g 48 -c:a copy output.mp4

# A keyframe every 5 seconds, by time
ffmpeg -i input.mp4 -c:v libx264 -force_key_frames "expr:gte(t,n_forced*5)" -c:a copy output.mp4

영상의 키프레임 위치는 어떻게 확인하나요?

Sume의 무료 프로브인 frames: false를 담은 POST /v1/video-inspect는 클립의 코덱, 크기, 프레임 레이트를 알려 주지만 키프레임 필드는 없으므로, 파일은 ffprobe로 확인하세요.

ffprobe에 키프레임 타임스탬프만 요청하세요. 디코더 옵션 skip_frame에 nokey를 주면 키프레임을 뺀 모든 프레임을 버리므로, 이 명령은 키프레임마다 시간을 하나씩 출력하고, 그 시간 사이의 간격이 곧 키프레임 간격입니다.

ffprobe -v error -skip_frame nokey -select_streams v:0 \
  -show_entries frame=pts_time \
  -of default=noprint_wrappers=1:nokey=1 input.mp4

출처

관련 글

미디어 도구 카테고리의 다른 글

미디어 도구 글 전체 보기

작성자 Sume