키프레임 간격이란? 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