자막 싱크가 안 맞을 때: 밀림과 드리프트를 잡는 프레임레이트·타이밍 가이드
받아 온 자막이나 다른 도구에서 내보낸 자막이 음성과 맞지 않을 때, 증상은 보통 둘 중 하나입니다. 모든 줄이 몇 초씩 늦게 뜨거나, 첫 장면은 맞는데 끝으로 갈수록 자막이 한 문장씩 앞서 나갑니다. 비슷해 보여도 원인과 해결책이 다르고, 맞지 않는 방법을 쓰면 오히려 더 어긋납니다.
오프셋인지 드리프트인지 구분하기
설정을 만지기 전에 영상 맨 앞에서 또렷한 대사 하나를 골라 자막이 얼마나 어긋났는지 보고, 맨 뒤에서도 같은 방식으로 확인합니다.
| 관찰 결과 | 원인 | 해결 |
|---|---|---|
| 시작과 끝에서 같은 양만큼 어긋남 | 일정한 오프셋: 전체가 똑같이 빠르거나 늦음 | 타이밍 이동 |
| 시작은 맞는데 끝으로 갈수록 벌어짐 | 점진적 드리프트: 프레임레이트 불일치 | 프레임레이트 변환 |
| 장면마다 어긋나는 방향과 양이 제각각 | 불규칙 비동기: 재편집, 광고 제거, 가변 프레임레이트 | 구간별로 다시 맞추거나 자막을 새로 만들기 |
오차가 일정한지, 점점 커지는지가 도구를 정합니다. 드물게 둘이 겹쳐 있다면 프레임레이트 변환으로 드리프트를 먼저 없애고, 남은 일정한 오프셋을 시프터로 맞춥니다.
경로 1: 일정한 오프셋
자막 사이 간격은 음성과 맞는데 트랙 전체가 잘못된 시점에서 시작하는 경우입니다. 흔한 원인은 다음과 같습니다.
- 인트로 길이가 다른 판본(스튜디오 로고나 앞부분 요약이 있거나 없는 판)에 맞춰 만든 자막
- 플레이어가 고정 지연을 더하거나 빼는 경우
- 앞부분이 잘렸거나 덧붙은 영상에 맞춰 만든 자막
고치는 법
- 특징 있는 대사 한 줄을 골라 플레이어에서 실제로 말하는 시각을 적습니다.
- 같은 대사의 자막 시작 시각을 적습니다.
- 두 값의 차이가 오프셋입니다. 자막이 00:01:05에 뜨는데 대사는 00:01:02.5에 나온다면 자막이 2.5초 늦은 것이므로 -2.5초만큼 옮깁니다.
- 자막 시프터에 SRT나 VTT 파일을 올리거나 붙여 넣고, 오프셋을 초 단위로 입력한 뒤(양수는 늦추고 음수는 앞당깁니다) 수정된 SRT를 내려받습니다.
시프터는 모든 큐에 같은 시간을 더하고 번호를 다시 매긴 SRT를 만듭니다. 앞당기다가 시작 시각이 0보다 앞서는 큐는 0초에서 시작하게 맞추고, 끝 시각까지 0 이하가 되는 큐는 지웁니다.
경로 2: 점진적 드리프트
처음 몇 분은 멀쩡하다가 10분쯤 지나면 살짝 어긋나고, 끝에서는 한 문장씩 밀립니다. 오차가 시간이 갈수록 커진다면 프레임레이트 불일치를 의심하세요.
프레임레이트가 드리프트를 만드는 이유
자막 타임스탬프는 절대 시각입니다. 00:42:17,500은 "42분 17.5초 지점"이라는 뜻입니다. 그런데 같은 영화라도 어떤 프레임레이트로 재생하느냐에 따라 러닝타임이 달라집니다.
24 fps로 마스터링한 영화를 예로 들면 다음 두 가지가 흔합니다.
- PAL판 (25 fps): 25 fps 방송에 맞추려고 영화를 초당 1프레임 빠르게 재생합니다. 러닝타임이 약 4% 짧아지고 음정이 약 3/4 반음 올라갑니다. 이른바 "PAL 스피드업"입니다.
- NTSC판 (23.976 fps): NTSC 방식에 맞추려고 1000/1001(약 0.1%)만큼 느리게 재생합니다.
25 fps PAL판에 맞춘 자막은 더 짧은 러닝타임을 전제로 합니다. 이 자막을 23.976 fps 판에 쓰면 모든 큐가 조금씩 일찍 뜨고, 오차가 경과 시간에 비례하므로 시작에서는 거의 안 보이다가 끝에서는 몇 초씩 벌어집니다.
더하기가 아니라 곱하기로 고칩니다
드리프트는 시프트로 없앨 수 없습니다. 시프트는 모든 큐를 같은 양만큼 옮기지만, 드리프트는 타임스탬프에 비례하는 양만큼 옮겨야 하기 때문입니다. 모든 타임스탬프에 같은 비율을 곱해야 합니다.
새 시간 = 기존 시간 × (source_fps ÷ target_fps)
프레임레이트 변환기가 이 계산을 합니다. source fps에는 자막이 맞춰져 있던 영상의 값을, target fps에는 지금 보는 영상의 값을 넣습니다.
- PAL 기준 SRT(25)를 필름 레이트 블루레이(23.976)에 쓸 때: source에 25, target에 23.976을 넣습니다. 모든 타임스탬프에 25 ÷ 23.976 ≈ 1.0427이 곱해져 트랙이 약 4% 늘어납니다.
- 30 fps로 잘못 찍힌 SRT를 29.97 fps NTSC 영상에 쓸 때: source에 30, target에 29.97을 넣습니다. 0.1% 보정이지만 2시간 영화라면 끝에서 약 7초 차이가 사라집니다.
변환기에는 23.976, 24, 25, 29.97, 30, 50, 59.94, 60이 프리셋으로 들어 있습니다. 드리프트는 대부분 표준 PAL, NTSC, 필름 레이트 조합에서 생기므로 직접 값을 입력할 일은 드뭅니다. 변환기도 SRT와 VTT를 받아 SRT로 내보내고, 브라우저 안에서 처리합니다.
자주 만나는 프레임레이트
| 프레임레이트 | 출처 | 비고 |
|---|---|---|
| 23.976 | NTSC 필름 (24 × 1000/1001) | 블루레이와 스트리밍 영화에 흔함 |
| 24 | 극장 상영, DCP | 23.976을 반올림해 24로 표기하는 경우가 많음 |
| 25 | PAL (유럽·호주 방송, DVD) | 필름 대비 약 4% 드리프트의 원인 |
| 29.97 | NTSC 방송, DVD (30 × 1000/1001) | "30 fps"로 표기된 NTSC 영상의 실제 값 |
| 30 | 일부 웹 영상, 화면 녹화 | 29.97과 0.1% 차이 |
| 50, 59.94, 60 | 고프레임레이트, 스포츠, 게임 | 59.94와 60의 관계는 29.97과 30의 관계와 같음 |
드리프트가 생기는 조합은 주로 셋입니다.
- 23.976과 25: 필름과 PAL. 약 4.3%로 차이가 가장 큽니다.
- 23.976과 24, 29.97과 30: 0.1% NTSC 계수. 1분 단위로는 작지만 영화 한 편이면 약 7초입니다.
- 50과 59.94 또는 60: 고프레임레이트에서의 같은 문제입니다.
드롭프레임 타임코드
방송 장비나 편집 프로그램에서 드롭프레임과 논드롭 선택지를 본 적이 있다면, 이것도 같은 1000/1001 차이에서 나온 것입니다.
NTSC 영상은 29.97 fps로 재생되지만 타임코드는 초당 30프레임으로 셉니다. 그대로 두면 타임코드가 실제 시간보다 1시간에 약 3.6초씩 뒤처집니다. 드롭프레임 타임코드는 매 분 첫머리에서 프레임 번호 두 개를 건너뛰고(10분째마다는 건너뛰지 않음) 표기가 실제 시간을 따라가게 합니다. 논드롭은 건너뛰지 않고 세므로 조금씩 뒤처집니다.
드롭프레임이 바꾸는 것은 프레임의 번호 붙이는 방식이지 재생 속도가 아닙니다. SRT는 프레임 번호가 아니라 밀리초를 저장하므로 SRT를 옮길 때 드롭프레임을 고를 일은 없습니다. 다만 내보내기 과정에서 29.97 fps 영상을 30 fps로 계산해 SRT를 만들었다면 위의 30에서 29.97로 바꾸는 변환이 해결책입니다.
두 도구로 안 되는 경우
전체를 한 번 옮기거나 한 번 늘리는 방식으로는 일정한 패턴이 있는 문제만 고칠 수 있습니다. 다음 경우는 고치지 못합니다.
- 영상이 재편집되어(광고 제거, 장면 삭제) 이음매마다 오프셋이 다른 경우
- 화면 녹화나 휴대폰 영상에 흔한 가변 프레임레이트(VFR) 때문에 하나의 비율로 맞출 수 없는 경우
이럴 때는 구간별로 타이밍을 다시 잡거나, 지금 가진 영상에서 자막을 새로 만들어야 합니다.
가진 영상에서 자막을 새로 만들기
밀림과 드리프트는 대부분 다른 판본에 맞춘 자막 파일을 가져다 쓸 때 생깁니다. 지금 보는 영상의 음성으로 자막을 만들면 처음부터 그 파일의 타이밍에 맞춰집니다. Picute에 영상 파일이나 유튜브 링크를 넣으면 60개 언어로 전사할 수 있고, 결과는 SRT·VTT 파일이나 자막을 입힌 MP4로 내보낼 수 있습니다.
관련 글
- SRT, VTT, SBV, ASS 자막 파일 차이점 정리: 포맷별 구조와 변환 방법
- 긴 영상 자막 만들기: 드리프트가 가장 잘 드러나는 긴 영상 작업
- 유튜브 자막 자동 생성 가이드: 유튜브에 자막 파일 올리기