23.976 vs 24 fps 차이: 언제 문제가 되나요?

23.976 fps는 24 fps의 NTSC 필름 버전인 24000/1001로, 0.1% 느리며 1,001프레임에 한 프레임 차이입니다. 언제 문제인지와 Sume 렌더의 처리 방식을 설명합니다.

읽는 시간 4분Sume
전체 글

23.976 fps는 24 fps의 NTSC 필름 버전입니다. 정확히는 초당 24000/1001프레임이며, 24보다 0.1% 느립니다. 24 fps 영상이 1,001프레임을 보여 주는 동안 23.976 fps 영상은 1,000프레임을 보여 줍니다. 이 차이는 프레임 한 장이 어떻게 보이는지가 아니라 타이밍에서 문제가 됩니다. 한 레이트를 다른 레이트로 변환할 때, 프레임을 셀 때, 한 편집 안에서 두 레이트를 섞을 때입니다. 29.97 fps와 30 fps도 정확히 같은 방식으로 다릅니다.

정확한 레이트는 FFmpeg의 유틸리티 문서와 필터 문서에서, Sume의 동작은 Timeline 1.0, 영상 트림, 영상 필터, 영상 검사 문서에서 가져왔으며, 모두 2026-09-28에 확인했습니다. 현재 동작이라고 설명한 내용은 Sume의 코드에서 확인한 것입니다.

왜 24와 30이 아니라 23.976과 29.97인가요?

두 분수 프레임 레이트는 모두 NTSC 컬러 텔레비전에서 나왔습니다. NTSC 컬러 텔레비전은 초당 30프레임이 아니라 30000/1001프레임으로 동작하며, 23.976은 24를 같은 1000/1001 비율로 늦춘 값입니다. 흔히 쓰는 반올림된 숫자는 정확한 분수를 가리키며, FFmpeg의 영상 레이트 문법에는 그 대부분에 해당하는 약어가 있습니다.

FFmpeg 영상 레이트 문법의 정확한 레이트와 약어, 2026-09-28 확인. 프레임 길이는 정확한 레이트로 계산했습니다.
흔히 쓰는 레이트정확한 레이트FFmpeg 약어프레임 하나의 길이
23.976 fps24000/1001ntsc-film41.708 ms
24 fps24/1film41.667 ms
25 fps25/1pal40.000 ms
29.97 fps30000/1001ntsc33.367 ms
30 fps30/1약어 없음33.333 ms

0.1% 차이가 문제가 되나요?

각 프레임이 화면에 머무는 시간은 41.667 ms가 아니라 41.708 ms입니다. 이 차이는 프레임이나 초를 정확히 세는 작업에서 드러납니다.

  • 프레임을 반복해 변환할 때: FFmpeg의 fps 필터는 필요에 따라 프레임을 복제하거나 버려서 영상을 고정 레이트로 변환합니다. 이 방식으로 23.976 영상을 24로 바꾸면 출력 프레임 1,001개마다 한 프레임이 반복되며(약 42초에 한 번), 재생 시간은 그대로입니다.
  • 재생 속도를 바꿔(리타이밍) 변환할 때: 23.976 프레임을 모두 24 fps로 재생하면 프레임은 전부 남지만 0.1% 빠르게 재생되므로, 한 시간 분량의 영상이 약 3.6초 일찍 끝납니다. 소리도 같은 비율로 빠르게 하지 않으면 싱크가 점점 어긋납니다.
  • 프레임으로 시간을 셀 때: 23.976의 타임코드는 24프레임을 타임코드상 한 초로 세므로, 실제 시계보다 한 시간에 똑같이 3.6초씩 뒤처집니다. 계산 과정은 프레임을 초로, 초를 프레임으로 변환하는 방법에서 설명합니다.
  • 29.97과 30도 수치는 같지만, 반복되는 프레임이 약 33초에 한 번 나온다는 점만 다릅니다. 29.97의 변형인 드롭 프레임 타임코드는 실제 시간에 가깝게 유지하려고 프레임이 아니라 프레임 번호를 건너뛰므로, 같은 방식으로 어긋나지 않습니다.

24 fps와 30 fps를 섞는 것은 더 큰 문제인가요?

네. 24 fps 영상을 30으로 렌더링하면 다섯 프레임에 한 프레임이, 25 fps 영상은 여섯 프레임에 한 프레임이 반복되며, 이는 움직임에서 떨림(judder)으로 보입니다. Sume의 Timeline은 이 경우를 경고하며(output_fps_resamples_sources), Timeline이 레이트를 고르는 방식은 영상의 프레임 레이트나 해상도 바꾸기에서 설명합니다.

Sume는 23.976 영상을 어떻게 처리하나요?

Sume의 편집 도구는 이전 Sume Job의 출력처럼 워크스페이스에 있는 media.sume.com 파일만 읽습니다. 이 규칙은 엔드포인트별로 받는 URL에서 설명합니다. 23.976 소스는 다음과 같이 처리됩니다.

  • 무료 프로브로 확인할 수 있습니다. frames: false를 담은 POST /v1/video-inspect는 fps를 반환하는데, 현재 코드에서 이 값은 스트림의 평균 프레임 레이트를 소수점 세 자리로 반올림한 것이므로 24000/1001 클립은 23.976으로 나옵니다. 호출 방법은 영상의 길이, 해상도, fps 확인하기에서 보여 줍니다.
  • 트림과 필터는 레이트를 그대로 유지합니다. output.fps 없는 exact 트림은 소스의 레이트를 이어받고, 필터 출력은 프로그램이 바꾸지 않는 한 소스의 프레임 레이트를 이어받습니다.
  • Timeline은 정수 레이트로 렌더링합니다. Timeline의 output.fps는 24, 25, 30, 60만 받으며, 트림의 output.fps도 마찬가지입니다. 생략하면 소스가 쓰는 레이트로 렌더링합니다. 현재 코드에서는 출력 레이트와 0.05 fps 이내로 차이 나는 소스를 일치하는 것으로 보므로, 23.976 영상은 24로, 29.97 영상은 30으로 경고 없이 렌더링됩니다.
  • 일치로 보더라도 변환은 일어납니다. 현재 코드에서는 모든 세그먼트가 출력 레이트로 FFmpeg의 fps 필터를 거치므로, 23.976 영상을 24로 렌더링하면 1,001프레임에 한 프레임이 반복됩니다.

출처

관련 글

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

미디어 도구 글 전체 보기

작성자 Sume