MKV와 MP4에 자막 넣는 방법 (재인코딩 없이)
MKV와 MP4에 자막을 넣는 법을 정리했어요: 재인코딩 없이 MKVToolNix와 FFmpeg로 트랙을 먹싱하고, 여러 언어와 기본·강제 플래그를 설정하고, 자막이 안 보이는 이유까지 짚어요.
MKV에 재인코딩 없이 자막을 넣으려면 자막을 별도의 트랙으로 먹싱하면 돼요. MKVToolNix는 GUI에서, FFmpeg는 명령어 한 줄로 이 작업을 해내고, 둘 다 영상을 건드리지 않고 그대로 복사하기 때문에 걸리는 시간은 파일 하나를 복사하는 정도예요. MP4도 자막 트랙을 담을 수 있지만, 스타일 없는 텍스트로만 담겨요.
이 글에서는 두 도구를 단계별로 짚고, 언어 태그를 제대로 붙여서 한 파일에 여러 언어를 담는 방법, 기본 플래그와 강제 플래그가 시청자에게 어떤 영향을 주는지, 먹싱한 트랙이 화면에 안 나타나는 흔한 이유를 차례로 다뤄요.
MKV에 자막을 넣는 데 재인코딩이 필요 없는 이유
영상 파일은 서로 분리된 스트림을 담은 컨테이너이고, 자막을 넣는다는 건 스트림 하나를 더 추가하는 일일 뿐이에요. 화면과 소리는 영상을 만들 때 이미 한 번 압축됐어요. 먹싱은 멀티플렉싱의 줄임말로, 컨테이너 안에 이미 있는 것은 하나도 디코딩하지 않고 스트림 하나를 더 끼워 넣어요. 그래서 결과물은 비트 단위까지 똑같은 영상 옆에 자막 트랙이 하나 더 붙은 모습이 돼요.
자막을 구워 넣는 건 정반대 작업이에요. 텍스트를 모든 프레임에 그려 넣어야 하니, 모든 프레임을 디코딩하고 그 위에 텍스트를 그린 다음 다시 압축해야 해요. 시간이 들고 화질도 조금 손해를 보지만, 플랫폼이 자막 트랙을 무시할 때는 여전히 맞는 선택이에요. 그 방법은 자막 구워 넣기 가이드에서 다뤄요. 둘 중 어느 쪽이 필요한지 아직 정하지 못했다면 하드서브 vs 소프트서브가 그 결정을 짧게 정리해 줘요.
Matroska(.mkv)는 소프트서브 방식에 맞춰 설계된 컨테이너예요. 영상, 오디오, 자막 트랙을 개수 제한 없이 담을 수 있고, 폰트 같은 첨부 파일도 넣을 수 있으며, 트랙마다 자기만의 메타데이터를 가져요:
- 언어 —
eng,spa같은 코드로, 플레이어는 이 코드로 트랙에 이름표를 붙이고 하나를 자동으로 골라요. - 이름 — 플레이어 메뉴에 표시되는 자유 텍스트로, “English”나 “English (SDH)” 같은 이름이에요.
- 기본 플래그(default flag) — 시청자가 직접 고르지 않았을 때 플레이어가 켜는 트랙이에요.
- 강제 플래그(forced flag) — 시청자가 자막을 꺼 뒀어도 표시되는 트랙으로, 외국어 대사를 위한 거예요.
이 네 가지를 제대로 맞추는 게 작업의 대부분이에요. 먹싱 자체는 쉬운 부분이에요.
MP4에도 자막 트랙을 넣을 수 있을까요?
네, 다만 MP4는 자막을 mov_text라는 스타일 없는 타임드 텍스트 형식으로만 담아요. FFmpeg가 SRT를 넣으면서 이 형식으로 변환하는데, 폰트, 색상, 위치 지정은 살아남지 못해요. 그래서 컨테이너 선택은 취향이 아니라 실제로 따져 봐야 하는 결정이에요:
| MKV | MP4 | |
|---|---|---|
| 담을 수 있는 자막 형식 | SRT, ASS, PGS 등 | mov_text만 |
| 스타일(폰트, 색상, 위치) | ASS 트랙에서 유지됨 | 사라짐 |
| 영상에 폰트 파일 첨부 | 네 | 아니요 |
| 한 파일에 여러 언어 | 네 | 네, 스타일 없는 텍스트로 |
| Apple 기본 플레이어에서 열림 | 항상 열리지는 않음 | 네 |
| VLC와 mpv에서 열림 | 네 | 네 |
| 트랙을 추가할 때 재인코딩 필요 | 아니요 | 아니요 |
보통 결정을 가르는 건 Apple 행이에요. QuickTime은 MKV를 아예 열지 못하고 iPhone 기본 앱도 MKV를 안정적으로 다루지 못하는 반면, 두 곳 모두 mov_text 트랙은 잘 보여줘요. 그래서 Apple 기기용 파일은 자막이 스타일 없는 텍스트가 되더라도 MP4로 만들어야 해요. VLC, mpv, Plex, Kodi는 MKV를 스타일과 첨부 폰트까지 그대로 살려서 재생해요. 브라우저는 세 번째 경우예요. 브라우저의 영상 플레이어는 대체로 내장 자막 트랙을 무시하고 별도의 WebVTT 파일을 기대하기 때문에, 형식 비교 글도 VTT를 웹용 형식으로 다뤄요.
자막 트랙을 넣는 세 가지 방법
- MKVToolNix — 무료이고 GUI가 있으며 Windows, macOS, Linux에서 쓸 수 있어요. 자막 파일이 이미 있을 때 가장 좋은 도구예요.
- FFmpeg — 무료이고 명령어 한 줄이면 되며, 셋 중 MP4로 출력할 수 있는 유일한 도구예요. 스크립트와 일괄 처리에 가장 좋은 도구예요.
- Sablate — 자막이 아직 없을 때 쓰는 도구예요. 전사하고, 레이어로 번역하고, 언어마다 트랙이 하나씩 담긴 MKV 하나를 내보내요.
Subtitle Edit에서도 Video → Add/remove embedded subtitles 메뉴로 먹싱할 수 있고, 내부에서는 FFmpeg를 실행해 처리해요.
방법 1: MKVToolNix로 MKV에 자막 넣기
MKVToolNix는 Matroska 파일을 다루는 표준 도구 모음이고, GUI를 쓰면 작업 전체가 네 단계로 정리돼요:
- mkvtoolnix.download에서 설치하세요. 버전 102.0은 2026년 9월 14일에 나왔고, macOS 빌드는 macOS 13 Ventura 이상이 필요해요.
- MKVToolNix GUI를 열고 Multiplexer 탭을 그대로 둔 채, 영상과 모든 자막 파일을 Source files 영역으로 끌어다 놓으세요. 자막 파일 하나하나가 별도의 트랙으로 나타나요.
- 자막 트랙을 하나씩 클릭해서 Language와 Track name 필드를 채우세요. 가장 먼저 재생될 트랙 하나에만 Default track 플래그를 켜고 나머지에서는 끄세요. 트랙이 외국어 대사만 담고 있는 게 아니라면 Forced display는 꺼 두세요.
- 아래쪽에서 출력 파일 이름을 정하고 Start multiplexing 버튼을 누르세요.
아무것도 인코딩하지 않으니 두 시간짜리 영화도 파일을 복사하는 정도의 시간이면 끝나요. 같은 작업을 명령줄로 하면 아래와 같고, 일괄 처리할 때도 이 방식을 써요:
mkvmerge -o film.subtitled.mkv film.mp4 \
--language 0:eng --track-name 0:English --default-track-flag 0:yes en.srt \
--language 0:spa --track-name 0:Spanish --default-track-flag 0:no es.srt
옵션은 바로 뒤에 오는 파일에 적용되고, 0은 각 SRT 안의 트랙 ID예요. SRT에는 트랙이 항상 하나뿐이거든요. 악센트가 있는 글자가 깨져 나온다면 그 SRT는 UTF-8이 아니에요. 그 파일 앞에 --sub-charset 0:windows-1252(또는 그 파일의 실제 인코딩)를 넣거나, 먼저 UTF-8 인코딩으로 다시 저장하세요.
나중에 다시 먹싱하지 않고 플래그를 바꾸려면 mkvpropedit이 기존 파일을 그 자리에서 수정해요:
mkvpropedit film.subtitled.mkv --edit track:s1 --set flag-default=0 --edit track:s2 --set flag-default=1
track:s1은 첫 번째 자막 트랙이에요. 새 파일을 쓰는 대신 파일의 헤더만 바꾸기 때문에 용량이 큰 영화에서도 거의 즉시 끝나요.
방법 2: FFmpeg로 자막 트랙 넣기 (MKV와 MP4)
FFmpeg는 같은 먹싱을 명령어 한 줄로 해내고, 결과물이 MP4여야 할 때 쓰는 도구예요. 영어와 스페인어 트랙이 있는 MKV라면 이렇게 해요:
ffmpeg -i film.mp4 -i en.srt -i es.srt \
-map 0:v -map 0:a -map 1 -map 2 -c copy \
-metadata:s:s:0 language=eng -metadata:s:s:0 title=English \
-metadata:s:s:1 language=spa -metadata:s:s:1 title=Spanish \
-disposition:s:0 default -disposition:s:1 0 \
film.subtitled.mkv
왼쪽에서 오른쪽으로 읽으면 돼요. 입력은 세 개이고, -map은 영화에서 영상과 오디오를 가져온 다음 각 자막 파일을 순서대로 가져와요. -c copy는 모든 스트림을 인코딩하지 않고 그대로 복사하고, -metadata:s:s:0은 출력의 첫 번째 자막 스트림에 태그를 붙여요. 두 -disposition 옵션은 영어를 기본 트랙으로 표시하고 스페인어의 플래그는 해제해요.
-map을 하나하나 명시하는 게 중요해요. -map 0만 쓰면 원본에 이미 들어 있는 자막 트랙까지 전부 딸려 오는데, MP4의 mov_text 트랙은 MKV로 그대로 복사할 수 없어서 명령어가 아무것도 쓰기 전에 오류로 멈춰요.
MP4라면 자막을 mov_text로 변환하고 나머지는 모두 복사하세요:
ffmpeg -i film.mp4 -i en.srt -i es.srt \
-map 0:v -map 0:a -map 1 -map 2 \
-c:v copy -c:a copy -c:s mov_text \
-metadata:s:s:0 language=eng -metadata:s:s:1 language=spa \
film.subtitled.mp4
영상과 오디오는 여전히 손대지 않고, 자막 텍스트만 MP4 형식으로 다시 쓰여요. 입력이 스타일이 있는 .ass 파일이라면 스타일이 사라지는 단계가 바로 여기예요.
스타일이 있는 ASS 자막은 MKV에 넣어야 하고, 폰트를 첨부해 두면 플레이어가 임의의 대체 폰트가 아니라 내가 고른 서체로 그려 줘요:
ffmpeg -i film.mp4 -i en.ass \
-map 0:v -map 0:a -map 1 -c copy \
-attach Montserrat-ExtraBold.ttf -metadata:s:t:0 mimetype=application/x-truetype-font \
-metadata:s:s:0 language=eng \
film.subtitled.mkv
FFmpeg 문서에는 Matroska 첨부 파일에 mimetype 태그가 필요하다고 분명히 나와 있어요. mpv와 VLC는 ASS를 렌더링할 때 첨부된 폰트를 불러오기 때문에 스타일이 파일과 함께 이동해요. 어떤 서체를 첨부할지는 또 다른 문제인데, 자막 폰트 가이드에서 어떤 폰트가 읽기 좋은지, 인기 있는 캡션 폰트 중 어느 것이 어떤 문자 체계를 그리지 못하는지 다뤄요.
방법 3: 자막과 MKV를 한 번에 만들기
MKVToolNix와 FFmpeg는 자막 파일이 이미 있다고 가정해요. 하지만 없는 경우가 많아요. 녹화 영상은 있고, 영어에 번역 세 개가 더 필요하고, 먹싱은 훨씬 긴 작업의 마지막 몇 초일 뿐인 경우예요. Sablate는 바로 이런 경우를 위해 만들어졌고, 전체 과정이 앱 하나 안에서 끝나요:
- 내 컴퓨터에서 Whisper로 영상을 전사하세요.
- 편집기에서 전사본을 교정하세요.
- 같은 타이밍 위에 언어마다 번역 레이어를 추가하세요.
- Video with switchable subtitles (.mkv) 형식으로 내보내세요.
파일에 담기는 결과는 방법 2에서 손으로 만드는 것과 같아요. 영상과 오디오는 스트림 복사로 처리하니 내보내기는 파일을 복사하는 정도의 시간이면 끝나요. 언어 레이어는 하나하나가 내 캡션 스타일을 입힌 별도의 ASS 트랙이 되고, 폰트는 그 언어의 문자 체계를 그릴 수 있는 것으로 바뀌어요. 트랙마다 언어 태그와 알아보기 쉬운 이름이 붙고, 첫 번째 트랙에는 기본 플래그가 켜져요. 스타일이 Sablate에 포함된 캡션 서체 중 하나를 쓰고 있으면 그 폰트 파일이 첨부되기 때문에, 다른 컴퓨터에서도 스타일이 그대로 유지돼요.
한계 세 가지를 있는 그대로 적을게요. MKV 내보내기는 Pro에 포함되어 있고, Pro는 가격 페이지에 나와 있듯이 $29를 한 번만 결제하면 돼요. Sablate는 MP4 자막 트랙을 만들지 않아요. mov_text가 스타일을 버리게 되기 때문이에요. MP4가 필요하면 .srt 파일을 내보내서 위의 FFmpeg MP4 명령어를 실행하세요. 그리고 내보내기는 원본 파일에 이미 있던 자막 트랙을 유지하지 않고 대체해요. 그 트랙이 중요하다면 MKVToolNix로 다시 추가하세요.
전사와 번역 쪽은 다국어 작업 흐름에서 단계별로 설명해요.
어떤 방법을 써야 할까요?
이미 가진 것이 자막 파일인지 영상뿐인지, 그리고 파일이 어디서 재생돼야 하는지에 따라 고르세요:
| MKVToolNix | FFmpeg | Sablate | |
|---|---|---|---|
| 가격 | 무료 | 무료 | $29 일회성(Pro) |
| 지원 플랫폼 | Windows, Mac, Linux | Windows, Mac, Linux | Windows와 Mac |
| 인터페이스 | GUI와 명령줄 | 명령줄 | GUI |
| 이미 있는 자막 파일 먹싱 | 네 | 네 | 부분적으로, 작업으로 가져와서 |
| 음성에서 자막 생성 | 아니요 | 아니요 | 네 |
| 자막 트랙이 있는 MP4 생성 | 아니요 | 네 | 아니요 |
| 언어 태그와 기본 플래그 | 네 | 네 | 네, 자동으로 설정 |
| 강제 플래그 | 네 | 네 | 아니요 |
| 폰트 첨부 | 네 | 네 | 네, 앱에 포함된 캡션 서체 |
| 다시 먹싱하지 않고 플래그 변경 | 네, mkvpropedit으로 | 아니요 | 아니요 |
“자막 파일이 이미 있어요.” MKVToolNix를 쓰세요. 무료이고, 파일을 쓰기 전에 모든 트랙과 플래그를 보여주고, 작업은 2분이면 끝나요.
“처리할 에피소드가 한 시즌 분량이에요.” mkvmerge나 FFmpeg를 반복문으로 돌리세요. 파일 이름이 일정한 규칙을 따르기만 하면 위의 두 명령어 모두 사람 손 없이 알아서 돌아가요.
“iPhone이나 QuickTime에서 재생돼야 해요.” FFmpeg로 MP4를 만들고, 자막은 스타일 없는 텍스트가 된다는 점을 감수하세요.
“내 자막은 스타일이 있는 ASS예요.” 폰트를 첨부한 MKV를 쓰세요. MP4는 자막을 넣는 과정에서 스타일이 사라져요.
“영상만 있어요.” 전사, 번역, 다중 트랙 MKV를 한곳에서 하고 싶다면 Sablate를 쓰세요. 각 단계를 직접 이어 붙일 의향이 있다면 무료로 쓸 수 있는 Subtitle Edit이 있어요.
“YouTube에 올릴 거예요.” MKV도 MP4도 아니에요. YouTube 같은 플랫폼은 .srt나 .vtt를 별도로 업로드받아요.
MKV 자막이 왜 안 보일까요?
트랙은 거의 항상 파일 안에 있어요. 다만 무언가가 그 트랙을 보여주지 않기로 한 거예요. 먼저 파일에 실제로 뭐가 들어 있는지 확인하세요:
ffprobe -v error -select_streams s -show_entries stream=index,codec_name:stream_tags=language,title:stream_disposition=default,forced -of compact=p=0 film.subtitled.mkv
자막 트랙마다 코덱, 언어, 이름, 기본 플래그와 강제 플래그가 담긴 한 줄이 출력돼요. 트랙이 목록에 보인다면 아래 순서대로 확인하세요:
- 기본 플래그가 켜진 트랙이 없어요. 플레이어가 저절로 켤 트랙이 없는 거예요. 방법 1에서처럼
mkvpropedit으로 플래그를 지정하세요. - 플레이어 자체의 설정이 우선해요. VLC, Plex, 많은 TV에는 선호 자막 언어나 자막 끄기 설정이 있어서 파일 안의 플래그보다 그 설정이 우선해요. 파일보다 플레이어를 먼저 확인하세요.
- 전체 트랙에 강제 플래그가 켜져 있어요. 자막을 꺼 둔 시청자에게도 모든 줄이 표시돼요. 강제 플래그는 부분 트랙에만 지정해야 해요.
- MP4 트랙이 무시돼요. 많은 플레이어가
mov_text를 조용히 건너뛰어요. 파일이 꼭 MP4일 필요가 없다면 MKV로 다시 먹싱하세요. - 악센트가 있는 글자가 깨져서 나와요. 원본 SRT가 오래된 인코딩으로 저장된 거예요. UTF-8 인코딩으로 다시 저장해서 다시 먹싱하거나,
mkvmerge에서는--sub-charset옵션으로, FFmpeg에서는 자막 입력 앞에-sub_charenc옵션을 붙여 인코딩을 직접 지정하세요. - 스타일이 있는 텍스트가 평범한 폰트로 나와요. ASS 트랙이 지정한 폰트가 재생하는 기기에 없는 거예요. 마지막 FFmpeg 명령어에서처럼 폰트 파일을 첨부하세요.
먹싱은 자막 전달에서 비용이 가장 적게 드는 단계예요. MKVToolNix에서 1분, FFmpeg에서 한 줄이면 되고, 재인코딩도 없어요. 비용이 많이 드는 쪽은 애초에 모든 언어의 좋은 자막 파일을 갖추는 일이에요. 이미 갖고 있다면 위의 무료 도구만으로 충분해요. 녹화 영상만 있다면 Windows나 Mac용 Sablate를 다운로드해서 전사하고 번역한 다음, 트랙과 태그와 플래그는 내보내기가 알아서 써 주게 하세요.