자막 포맷 변환 완전 가이드 — SRT · VTT · SMI 타임코드와 싱크·인코딩
업데이트 2026-07-11 · 모든 변환은 브라우저 안에서만 수행되며 파일은 업로드되지 않습니다.
자막 포맷은 왜 여러 개일까
자막 파일은 결국 "몇 초부터 몇 초까지 어떤 텍스트를 보여줄지"를 적어둔 텍스트일 뿐입니다. 다만 이 정보를 표기하는 방식이 플랫폼마다 달라 여러 포맷이 생겼습니다. subconvert가 지원하는 네 가지는 다음과 같습니다.
- SRT (SubRip) — 가장 널리 쓰이는 표준. 번호, 타임라인, 본문 순서로 반복됩니다. 데스크톱 플레이어·유튜브 업로드에 두루 호환됩니다.
- WebVTT (.vtt) — HTML5
<track>웹 표준. 파일 맨 위에WEBVTT헤더가 있고 타임코드에 마침표를 씁니다. - SMI (SAMI) — 마이크로소프트가 만든 포맷으로 한국 구형 플레이어(곰플레이어·KMPlayer 등)에서 오랫동안 표준처럼 쓰였습니다.
- TXT — 타임코드를 뺀 순수 대본. 자막을 텍스트로 옮겨 검수하거나 번역 초안으로 쓸 때 유용합니다(출력 전용).
타임코드가 핵심이다
포맷 변환에서 가장 자주 깨지는 부분이 타임코드입니다. 세 포맷은 같은 시각을 다르게 씁니다.
- SRT:
00:01:02,500— 시:분:초 뒤에 콤마(,)와 밀리초 3자리. - VTT:
00:01:02.500— 구분자가 마침표(.). 시(hour)가 0이면01:02.500처럼 생략되기도 합니다. - SMI:
<SYNC Start=62500>— 시작 시각을 밀리초 정수로 적고, 종료는 다음 빈 큐( )가 대신합니다.
subconvert는 모든 타임코드를 내부적으로 밀리초로 변환해 계산하므로, 콤마·마침표 차이나 시 생략 형식을 신경 쓰지 않아도 됩니다. SMI로 내보낼 때는 각 자막의 끝 시각에 자동으로 빈 큐를 넣어 화면을 정확히 지웁니다.
싱크가 밀릴 때 — 오프셋
다른 곳에서 받은 자막이 영상과 어긋나는 일은 흔합니다. 이럴 때는 싱크 오프셋으로 모든 자막을 한꺼번에 밀거나 당깁니다.
- 자막이 늦게 나오면(대사보다 뒤에 뜨면) 음수 값(예:
-1.5)으로 앞당깁니다. - 자막이 빨리 나오면 양수 값(예:
+0.8)으로 늦춥니다. - ±0.5초 / ±1초 빠른 버튼으로 미세 조정할 수 있습니다.
오프셋을 적용해 0초보다 앞으로 당겨지는 자막은 0초로 고정됩니다(음수 시각은 만들지 않습니다).
FPS 리타이밍 (고급)
영화 자막에서 가끔 처음엔 맞다가 뒤로 갈수록 점점 어긋나는 경우가 있습니다. 이는 자막을 만든 영상과 지금 영상의 프레임레이트(FPS)가 달라서입니다(예: 23.976fps 영화용 자막을 25fps PAL 영상에 얹는 경우). 고급 옵션에서 원본 FPS와 대상 FPS를 선택하면 새 시각 = 기존 시각 × (원본FPS / 대상FPS) 공식으로 전체 타이밍을 비례 조정합니다. 단순 오프셋으로 안 맞을 때만 사용하세요.
한국어 자막이 깨질 때 — EUC-KR 복구
오래된 한국어 SMI·SRT는 UTF-8이 아니라 EUC-KR(CP949)로 저장된 경우가 많습니다. 이런 파일을 UTF-8로 읽으면 한글이 깨져 보입니다. subconvert의 인코딩 선택에서 EUC-KR을 고르면 같은 파일을 올바르게 다시 읽어들입니다. 변환 결과는 항상 UTF-8로 출력되므로, 한 번 변환하면 현대 플레이어·웹에서 깨지지 않는 자막이 됩니다.
변환하는 방법 (요약)
- 자막 파일을 드롭존에 끌어다 놓거나 텍스트를 붙여넣습니다. 원본 포맷은 자동 감지됩니다.
- 한글이 깨져 보이면 인코딩을 EUC-KR로 바꿉니다.
- 대상 포맷(SRT·VTT·SMI·TXT)을 고르고, 필요하면 싱크 오프셋을 입력합니다.
- 미리보기를 확인한 뒤 복사하거나 파일로 다운로드합니다.
한계
- 줄바꿈과 기본
<i>·<b>·<u>태그는 보존되지만, ASS/SSA의 고급 스타일이나 VTT의 위치 지정, SMI의 CSS 클래스는 완전히 옮겨지지 않습니다. - TXT는 타임코드가 없으므로 다시 타이밍이 있는 포맷으로 되돌릴 수 없습니다.