SRT 자막은 VTT로, VTT 자막은 SRT로 바꿉니다
SRT와 VTT(WebVTT)는 영상 파일 밖에 따로 두는 글자 자막 형식입니다. 위 변환기에 자막을 붙여 넣거나 파일을 열면 어떤 형식인지 알아보고 반대 형식으로 바로 바꿉니다. 자막의 시작·끝 시각은 1000분의 1초까지 그대로 두고, 시각을 적는 쉼표와 점, 서식 태그, 위치 표기처럼 두 형식이 서로 다르게 적는 부분만 규칙에 맞춰 고칩니다.
바꾼 결과는 위 화면에서 실제 재생처럼 시각대로 띄워 볼 수 있습니다. 내 영상 파일을 열면 그 영상 위에 결과 자막을 얹어 대사와 맞는지 확인하고, 어긋나 있으면 싱크 이동에 초를 넣어 모든 자막을 함께 옮깁니다. 붙여 넣은 자막과 연 영상은 서버로 보내지 않고 이 브라우저 안에서만 처리합니다.
자막 형식을 바꿔야 하는 경우
두 형식은 생김새가 비슷해서 확장자만 바꾸면 될 것 같지만, 받는 쪽이 정한 형식과 다르면 자막이 아예 뜨지 않거나 시각을 읽지 못합니다. 다음과 같은 때에 형식을 바꿉니다.
- 웹 페이지 영상에 자막을 달 때: HTML 영상에 자막을 붙이는
<track>요소는 WebVTT 파일을 씁니다(MDN). 편집 프로그램에서 받은 SRT를 웹 영상에 쓰려면 VTT로 바꿔야 합니다. - YouTube에 자막을 올릴 때: YouTube는 두 형식을 모두 받지만, SRT는 기본 형식만 지원하고 서식 표시를 읽지 않으며 UTF-8 파일이어야 한다고 안내합니다. VTT는 위치 지정과 굵게·기울임·밑줄(b·i·u)을 지원한다고 적혀 있습니다. 기울임이나 화면 위쪽 자막을 살리려면 VTT로 올리는 편이 낫습니다.
- 웹에서 받은 VTT를 다른 프로그램에서 쓸 때: 온라인 강의나 회의 녹화에서 내려받은 VTT 자막을 SRT만 받는 플레이어나 편집 프로그램에서 쓰려면 SRT로 바꿉니다.
- 형식은 그대로 두고 싱크만 맞출 때: 영상 앞부분을 잘라 냈거나 인트로를 붙여서 자막이 일정하게 빠르거나 늦으면, 결과 형식을 원본과 같게 고르고 싱크 이동만 넣어 저장합니다.
변환기 쓰는 법
- 자막 넣기: 아래 글 칸에 붙여 넣거나 파일 열기를 누릅니다. 작업면에 파일을 끌어다 놓아도 됩니다. 처음 화면의 예시는 글 칸을 누르면 전체가 선택되어 붙여 넣는 즉시 바뀝니다.
- 형식 확인: 맨 위 원본 칸에 알아본 형식과 자막 개수가 나옵니다. 결과 형식은 반대 형식으로 정해지며, 싱크만 옮길 때는 원본과 같은 형식을 고릅니다.
- 화면에서 재생해 보기: 재생 단추나 화면을 누르면 결과 자막이 시각대로 나옵니다. 타임라인의 막대를 누르면 그 자막으로 가고, 타임라인을 고른 뒤 화살표 키로 이전·다음 자막을 오갑니다. 비교 창은 지금 자막의 원본 줄과 결과 줄을 함께 보여 줍니다.
- 내 영상으로 보기: 영상 파일을 열면 화면이 그 영상으로 바뀌고 결과 자막이 위에 얹힙니다. 영상은 이 브라우저에서만 재생합니다.
- 싱크 맞추기: 자막이 대사보다 늦게 나오면 싱크 이동에 음수(−0.5), 빨리 나오면 양수(+0.5)를 넣습니다. − + 단추는 0.1초씩 옮깁니다.
- 바뀐 것 확인하고 가져가기: 변환 내역의 칩을 누르면 그 종류에 해당하는 자막으로 차례로 이동합니다. 저장으로 .vtt·.srt 파일을 받거나 복사합니다. 가운데 ⇄ 단추는 결과를 원본으로 옮겨 반대 방향으로 다시 바꿔 봅니다.
SRT와 VTT는 이렇게 다릅니다
| 항목 | SRT | VTT(WebVTT) |
|---|---|---|
| 첫 줄 | 없음(바로 1번 자막) | WEBVTT로 시작해야 하며, 없으면 읽지 않음 |
| 자막 번호 | 1부터 차례로 붙임 | 적지 않아도 됨(식별자, 글자도 가능하나 파일 안에서 겹치면 안 됨) |
| 시각 표기 | 00:01:02,500(쉼표) | 00:01:02.500(점), 0시면 01:02.500도 가능 |
| 자막 순서 | 정해진 규칙 없음 | 시작 시각이 앞 자막보다 빠르면 안 됨, 겹치는 것은 허용 |
| 서식 | HTML에서 온 굵게·기울임·밑줄·색 태그 | b·i·u·c(클래스)·v(화자)·ruby·lang, 단어별 시각 |
| 글자색 | <font color> | 기본 색 클래스 8개(white·lime·cyan·red·yellow·magenta·blue·black), 그 밖은 STYLE 블록의 CSS |
| 위치 | 정해진 방법 없음 | 시각 줄 끝의 설정(line·position·align 등) |
| 메모·스타일 | 없음 | NOTE·STYLE·REGION 블록 |
| 특수 문자 | 글자 그대로 | &·<는 &·<로, 자막 안에 --> 금지 |
| 인코딩 | 정해진 표준 없음 | UTF-8 |
| 규격 | 정식 규격 없음(미국 의회도서관 자료) | W3C WebVTT |
바꿀 때 옮기는 것과 빼는 것
한쪽 형식에만 있는 표기는 맞는 표기가 있으면 옮기고, 담을 자리가 없으면 글자는 남긴 채 표기만 뺍니다. 뺀 것은 몇 개인지 변환 내역에 나오고, 자막마다 무엇이 바뀌었는지는 비교 창에서 볼 수 있습니다.
| 원본 | 결과 | 설명 |
|---|---|---|
| SRT → VTT | ||
<i>말</i> | <i>말</i> | b·i·u는 두 형식에 모두 있어 그대로 둡니다. |
<font color="#ffff00">말</font> | <c.yellow>말</c> | WebVTT 기본 8색과 같은 색은 색 클래스로 옮깁니다. |
<font color="#ff8800">말</font> | 말 | 기본 8색이 아닌 색과 글꼴 태그는 태그만 뺍니다. |
{\an8}말 | 말 | 화면 위 표기({\an7}~{\an9})는 시각 줄 끝의 line:0으로, 그 밖의 {\…} 표기는 뺍니다. |
A & B < C | A & B < C | VTT에서 글자로 쓸 수 없는 기호는 문자 참조로 적습니다. |
| VTT → SRT | ||
<v 민수>말 | 말 | 화자 표시는 뺍니다. 스위치를 켜면 민수: 말처럼 이름을 앞에 붙입니다. |
<c.yellow>말</c> | <font color="yellow">말</font> | 기본 8색 클래스는 font 색으로 옮깁니다. |
<c.note>말</c> | 말 | STYLE에 정의한 클래스는 SRT에서 뜻이 없어 뺍니다. |
<00:00:01.500>말 | 말 | 단어별 시각은 SRT에 없어 뺍니다. |
<ruby>漢字<rt>한자</rt></ruby> | 漢字(한자) | 루비(읽는 법)는 괄호에 넣습니다. |
& < | & < | 문자 참조는 글자로 풉니다. |
00:00:01.000 --> 00:00:02.000 align:start | 00:00:01,000 --> 00:00:02,000 | 위치·정렬 설정은 SRT에 담을 자리가 없어 뺍니다. |
NOTE·STYLE·REGION 블록 | (뺌) | 메모와 스타일 정의도 뺍니다. 파일 머리의 Kind:·Language: 줄도 같습니다. |
결과 형식을 원본과 같게 고르면 위 표의 변환은 하지 않고, 문구·설정·블록을 그대로 둔 채 시각만 옮깁니다. VTT에서 SRT로 바꿀 때 자막 번호는 1부터 다시 매기고, SRT에서 VTT로 바꿀 때는 번호를 적지 않습니다.
한 자막이 바뀌는 모습
예시 SRT의 4·5번 자막처럼 글자색과 화면 위 표기를 쓴 두 자막을 VTT로 바꾼 결과입니다.
| SRT 원본 | VTT 결과 |
|---|---|
4
00:00:09,700 --> 00:00:12,600
<font color="#ffff00">노란 글씨</font>는 그대로
5
00:00:11,800 --> 00:00:14,000
{\an8}[화면 위] A & B | WEBVTT 00:00:09.700 --> 00:00:12.600 <c.yellow>노란 글씨</c>는 그대로 00:00:11.800 --> 00:00:14.000 line:0 [화면 위] A & B |
4번은 노랑(#ffff00)이 WebVTT 기본 8색이라 c.yellow로 옮겼고, 5번은 화면 위 표기를 line:0으로, &를 &로 적었습니다. 두 자막은 11.8초부터 12.6초까지 0.8초 겹치지만 그대로 둡니다. WebVTT는 자막끼리 겹쳐도 된다고 정하고 있고, 두 사람이 동시에 말하는 장면처럼 일부러 겹친 자막일 수 있기 때문입니다.
싱크 이동은 이렇게 계산합니다
싱크 이동에 넣은 값은 모든 자막의 시작·끝 시각에 똑같이 더합니다. 더한 결과가 0초보다 앞이면 시작은 0초로 맞추고, 끝까지 0초 앞이 된 자막은 결과에서 뺍니다.
| 원본 시각 | +1.5초 | −2초 |
|---|---|---|
00:00:01,000 --> 00:00:03,400 | 00:00:02,500 --> 00:00:04,900 | 00:00:00,000 --> 00:00:01,400(시작은 0초로) |
00:00:00,500 --> 00:00:01,800 | 00:00:02,000 --> 00:00:03,300 | 뺌(끝도 0초 앞) |
처음에는 맞다가 뒤로 갈수록 점점 더 어긋난다면 한 값으로는 맞출 수 없습니다. 자막을 만들 때 기준으로 삼은 영상과 지금 영상의 재생 속도가 다를 때 이런 일이 생기며, 이 변환기는 시각을 비율로 늘리거나 줄이지 않습니다.
자주 틀리는 경우
- 확장자만 바꾸기: .srt 파일의 이름만 .vtt로 바꾸면 첫 줄에 WEBVTT가 없어서 WebVTT 규격의 해석 방법대로라면 파일 전체를 읽지 않습니다. 시각의 쉼표도 그대로 남습니다.
- 쉼표와 점 섞기: 손으로 고친 SRT에
00:00:01.500처럼 점이 섞이면 읽지 못하는 프로그램이 있습니다. 이 변환기는 읽을 때 둘 다 받아들이고 결과는 형식에 맞게 다시 적으며, 고친 곳은 내역의 '시각 구분 문자 고침'으로 셉니다. - 자막 사이 빈 줄 빠뜨리기: SRT는 빈 줄로 자막을 나눕니다. 빈 줄이 빠지면 다음 번호와 시각이 앞 자막의 문구로 읽힐 수 있습니다. 변환기는 번호·시각 줄을 보고 나눈 뒤 '붙어 있던 자막 나눔'으로 알려 줍니다.
- 끝 시각이 시작보다 빠른 자막: 손으로 시각을 고치다 자주 생깁니다. 어느 값이 맞는지 짐작할 수 없어서 변환을 멈추고 몇 번째 줄인지 알려 주며, 원본에서 보기를 누르면 그 줄로 갑니다.
- 옛 인코딩 자막을 그대로 올리기: 오래된 한국어 SRT 중에는 EUC-KR(CP949)로 저장된 파일이 있습니다. YouTube는 SRT가 UTF-8이어야 한다고 안내하므로, 파일 열기로 읽은 뒤 저장해 UTF-8 파일로 올립니다.
- 겹친 자막을 오류로 보고 지우기: 타임라인에 빗금으로 표시되는 겹친 자막은 일부러 겹쳐 둔 것일 수 있습니다. 재생해 보고 실제로 잘못된 경우에만 원본에서 고칩니다.
한계와 주의
- SRT와 VTT 글자 파일을 10MB, 자막 20,000개까지 바꿉니다. SMI·ASS·SBV 같은 다른 자막 형식은 읽지 않습니다.
- 미리 보기 화면은 결과 자막의 시각과 글자, 기본 서식과 색, 화면 위 표시를 보여 줍니다. 실제 플레이어의 글꼴·크기·위치는 다를 수 있고, STYLE 블록의 CSS는 미리 보기에 쓰지 않습니다.
- 영상은 이 브라우저가 재생할 수 있는 형식만 열립니다. 영상과 자막은 모두 서버로 보내지 않습니다.
- 끝 시각이 시작 시각보다 빠르거나 같은 자막, 읽을 수 없는 시각이 있으면 변환하지 않습니다. 문구가 없는 자막은 빼고 그 개수를 알려 줍니다.
- 결과는 UTF-8(BOM 없음), 줄바꿈 LF로 저장합니다.
기준일 형식 규칙과 플랫폼 안내는 2026-10-20에 원문으로 확인했습니다.
출처
- 01W3C: WebVTT, The Web Video Text Tracks FormatWEBVTT로 시작·UTF-8, 시각 형식, 식별자 고유, 시작 시각 순서와 겹침 허용, 자막 안 --> 금지와 & < 문자 참조, 기본 색 클래스 8개, NOTE·STYLE·REGION
- 02미국 의회도서관: SubRip Subtitle format (SRT)번호·시각(쉼표)·문구·빈 줄 구조, 정식 규격이 없음, HTML에서 온 굵게·기울임·밑줄·색, 인코딩 표준 없음
- 03MDN: <track> 요소영상·음성의 자막 트랙 파일은 WebVTT(.vtt) 형식
- 04YouTube 고객센터: 지원되는 자막 파일SRT는 기본 형식만·서식 미인식·UTF-8, WebVTT는 위치 지원·서식은 b·i·u
- 05WHATWG: Encoding Standard브라우저가 읽는 EUC-KR·Shift_JIS·windows-1252 레이블과 UTF-8 BOM
자주 묻는 질문
SRT와 VTT는 무엇이 다른가요?
둘 다 영상 밖에 따로 두는 글자 자막입니다. VTT(WebVTT)는 첫 줄이 WEBVTT이고 시각의 밀리초 앞에 점을 쓰며, 위치·스타일·메모를 적을 수 있는 W3C 규격입니다. SRT는 번호·시각·문구를 빈 줄로 나누고 밀리초 앞에 쉼표를 쓰며, 정식 규격 없이 널리 쓰이는 형식입니다.
SRT를 VTT로 바꾸면 싱크가 달라지나요?
달라지지 않습니다. 시작·끝 시각은 1000분의 1초까지 그대로 두고 표기만 00:00:01,250에서 00:00:01.250으로 바꿉니다. 싱크 이동 칸에 값을 넣었을 때만 모든 시각이 그만큼 옮겨집니다.
자막이 영상보다 늦게 나오면 어떻게 맞추나요?
내 영상으로 보기로 영상을 열고 재생하며 어긋난 정도를 봅니다. 자막이 늦으면 싱크 이동에 음수(예: −0.8), 빠르면 양수를 넣습니다. 0초 앞으로 밀린 시작은 0초가 되고, 끝까지 0초 앞이 된 자막은 빠집니다. 뒤로 갈수록 어긋남이 커지는 경우는 한 값으로 맞출 수 없습니다.
기울임·색 같은 서식은 그대로 남나요?
b·i·u 태그는 두 형식 모두에서 그대로 둡니다. SRT의 font color 가운데 WebVTT 기본 8색(white·lime·cyan·red·yellow·magenta·blue·black)은 c.yellow 같은 색 클래스로, 반대로 바꿀 때는 font color로 옮깁니다. 그 밖의 색·글꼴 태그는 태그만 빼고 글자는 남깁니다.
VTT의 위치 설정이나 NOTE·STYLE은 SRT로 바꾸면 어떻게 되나요?
SRT에는 그런 정보를 적을 자리가 없어서 뺍니다. 몇 개를 뺐는지는 변환 내역에 나오고, 자막마다 무엇이 빠졌는지는 비교 창에서 볼 수 있습니다. VTT 그대로 싱크만 옮기려면 결과 형식을 VTT로 두면 설정과 블록이 모두 남습니다.
한글 자막이 깨져 보이면 어떻게 하나요?
파일 열기로 읽으면 BOM, UTF-8, EUC-KR 순서로 인코딩을 알아보고 어떤 인코딩으로 읽었는지 글 칸 위에 표시합니다. 결과는 늘 UTF-8로 저장되므로 옛 EUC-KR 자막도 열었다가 저장하면 UTF-8 파일이 됩니다. 이미 깨진 글자를 붙여 넣었다면 원본 파일을 다시 여세요.
자막이나 영상 파일이 서버로 올라가나요?
올라가지 않습니다. 자막 변환과 영상 재생은 모두 이 브라우저 안에서 처리하며, 붙여 넣은 내용과 연 파일을 서버로 보내거나 주소·저장소에 남기지 않습니다.
어떤 파일까지 바꿀 수 있나요?
SRT와 VTT 형식의 글자 파일을 10MB, 자막 20,000개까지 바꿉니다. SMI·ASS·SBV 같은 다른 자막 형식은 읽지 않습니다. 끝 시각이 시작 시각보다 빠르거나 읽을 수 없는 시각이 있으면 변환을 멈추고 몇 번째 줄인지 알려 줍니다.