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 숫자가 아닙니다.
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프레임을 허용합니다. 타이밍이 중요한 작업은 결과 파일과 사용할 플레이어에서 확인하세요. 이 계산만으로 모든 플레이어의 재생 시간이나 변환 작업 소요 시간을 예측할 수는 없습니다.
자주 묻는 질문
15FPS를 선택하면 항상 1초가 1.05초로 재생되나요?
아닙니다. 1050ms는 이 1초·15프레임 예제의 저장 지연 합계입니다. 실제 표시 타이밍은 별도 검증 대상이며, 이 글은 플레이어별 재생 시간을 측정하지 않았습니다.