GIF에는 프레임마다 대기 시간이 기록됩니다

GIF89a 규격의 Graphic Control Extension은 0이 아닌 지연 시간을 1/100초 단위로 기록합니다. 즉 1단위는 10ms입니다. Moyoutil은 프레임마다 1000/FPS ms를 인코더에 전달하고, 포함된 gifenc 1.0.3은 이를 10으로 나눈 뒤 반올림합니다. 15FPS의 약 66.667ms는 7단위, 즉 70ms로 저장됩니다. 선택한 FPS는 프레임 추출 설정이며 GIF에 그대로 저장되는 FPS 숫자가 아닙니다.

5·10·15FPS로 만든 1초 가상 프레임의 저장 지연 합계 1000·1000·1050ms 비교
직접 제작한 지연 합계 도식. 막대 길이는 저장 필드의 합계에 비례합니다. 실제 화면 재생 시간을 측정한 차트가 아닙니다.

GIF89a §23: Graphic Control Extension

1초를 선택했을 때 저장되는 합계를 재현하기

같은 GIF 작업 코드와 인코더로 1×1px 가상 프레임을 생성하고 지연 필드를 읽었습니다. 1초·5FPS는 5프레임×200ms=1000ms, 10FPS는 10×100ms=1000ms, 15FPS는 15×70ms=1050ms였습니다. 이는 만들어진 테스트 GIF의 저장값입니다. 실제 동영상을 변환하거나 플레이어의 재생 시간을 측정한 실험은 아닙니다. 아래 계산 코드는 같은 숫자를 재현합니다.

for (const fps of [5, 10, 15]) {
  const frames = Math.ceil(1 * fps);
  const delayMs = Math.round(1000 / fps / 10) * 10;
  console.log(fps, frames, delayMs, frames * delayMs);
}
// 5 5 200 1000
// 10 10 100 1000
// 15 15 70 1050

프레임 수는 ceil(길이×FPS)입니다. 0.1초·15FPS는 2프레임이므로 저장 지연 합계는 140ms입니다. 현재 GIF 화면은 5·10·15FPS를 제공하고 최대 10초·150프레임을 허용합니다. 타이밍이 중요한 작업은 결과 파일과 사용할 플레이어에서 확인하세요. 이 계산만으로 모든 플레이어의 재생 시간이나 변환 작업 소요 시간을 예측할 수는 없습니다.

gifenc: writeFrame / delayTime

자주 묻는 질문

15FPS를 선택하면 항상 1초가 1.05초로 재생되나요?

아닙니다. 1050ms는 이 1초·15프레임 예제의 저장 지연 합계입니다. 실제 표시 타이밍은 별도 검증 대상이며, 이 글은 플레이어별 재생 시간을 측정하지 않았습니다.