Как добавить субтитры в MKV и MP4 без перекодирования
Как добавить субтитры в MKV и MP4 без перекодирования: MKVToolNix и FFmpeg, много языков в одном файле, флаги по умолчанию и forced, почему дорожки пропадают.
Чтобы добавить субтитры в MKV без перекодирования, их нужно замуксить отдельной дорожкой: MKVToolNix делает это из графического интерфейса, FFmpeg — одной командой, и оба копируют видео без изменений примерно за то время, которое уходит на копирование файла. MP4 тоже может нести дорожки субтитров, но только в виде простого текста.
Дальше — оба инструмента по шагам, несколько языков в одном файле с правильными языковыми метками, влияние флагов по умолчанию и принудительного показа на зрителя и обычные причины, по которым добавленная дорожка так и не появляется.
Почему для добавления субтитров в MKV не нужно перекодирование
Видеофайл — это контейнер с отдельными потоками, и субтитры добавляют в него лишь ещё один поток. Картинка и звук были сжаты один раз — при создании видео. Мукс — сокращение от «мультиплексирование» — вплетает в контейнер дополнительный поток, ничего не декодируя из того, что там уже есть, поэтому на выходе получается то же самое видео, бит в бит, а рядом с ним — дорожка субтитров.
Вшивание субтитров — противоположная операция. Текст нужно нарисовать в каждом кадре, поэтому каждый кадр декодируется, на него наносится текст, и он сжимается заново. Это стоит времени и немного качества, но остаётся правильным решением, когда платформа игнорирует дорожки субтитров: этот путь разбирает руководство по вшиванию субтитров. Если вы ещё не решили, какой из двух вариантов вам нужен, хардсаб или софтсаб — краткая версия этого выбора.
Matroska (.mkv) создавали под мягкие субтитры. В нём может быть любое число дорожек видео, звука и субтитров, а также вложенные файлы, например шрифты, и у каждой дорожки есть собственные метаданные:
- Язык — код вроде
engилиspa; по нему плееры подписывают дорожки и сами выбирают нужную. - Название — произвольный текст в меню плеера, например «English» или «English (SDH)».
- Флаг по умолчанию (default) — дорожка, которую плеер включает сам, если зритель не выбрал другую.
- Флаг принудительного показа (forced) — дорожка, которая показывается, даже если зритель выключил субтитры, и предназначена для реплик на иностранном языке.
Правильно выставить эти четыре параметра — большая часть работы. Сам мукс — лёгкая часть.
Можно ли добавить дорожку субтитров в MP4?
Да, но MP4 несёт субтитры только как mov_text — простой формат таймированного текста. FFmpeg преобразует в него SRT при добавлении, а шрифты, цвета и позиционирование при этом не сохраняются. Поэтому выбор контейнера — это настоящее решение, а не вопрос предпочтений:
| MKV | MP4 | |
|---|---|---|
| Форматы субтитров, которые хранит контейнер | SRT, ASS, PGS и другие | только mov_text |
| Оформление (шрифты, цвета, положение) | Сохраняется в дорожках ASS | Теряется |
| Файлы шрифтов, вложенные в видео | Да | Нет |
| Несколько языков в одном файле | Да | Да, как простой текст |
| Открывается во встроенных плеерах Apple | Не всегда | Да |
| Открывается в VLC и mpv | Да | Да |
| Нужно ли перекодирование, чтобы добавить дорожку | Нет | Нет |
Чаще всего выбор определяет строка про Apple. QuickTime вообще не открывает MKV, а родные приложения iPhone справляются с ним ненадёжно, зато дорожки mov_text у обоих отображаются хорошо, поэтому файл для устройств Apple должен быть MP4, даже если субтитры в нём будут простым текстом. VLC, mpv, Plex и Kodi воспроизводят MKV с сохранённым оформлением и вложенными шрифтами. Браузеры — третий случай: их видеоплееры, как правило, игнорируют встроенные дорожки субтитров и ожидают отдельный файл WebVTT, поэтому сравнение форматов считает VTT форматом для веба.
Три способа добавить дорожки субтитров
- MKVToolNix — бесплатный, с графическим интерфейсом, для Windows, macOS и Linux. Лучший инструмент, когда файлы субтитров уже есть.
- FFmpeg — бесплатный, одна команда, и единственный из трёх, который умеет записывать MP4. Лучший инструмент для скриптов и пакетной обработки.
- Sablate — на случай, когда субтитров ещё нет: транскрибировать, перевести по слоям и экспортировать один MKV с отдельной дорожкой на каждый язык.
Subtitle Edit тоже умеет муксить — через меню Video → Add/remove embedded subtitles — и для этого запускает FFmpeg под капотом.
Способ 1: добавить субтитры в MKV с помощью MKVToolNix
MKVToolNix — эталонный набор инструментов для файлов Matroska, а его графический интерфейс сводит всю работу к четырём шагам:
- Установите его с сайта mkvtoolnix.download. Версия 102.0 вышла 14 сентября 2026 года; сборке для 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 — это 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 затянул бы и все дорожки субтитров, которые уже есть в источнике, а дорожку mov_text из MP4 нельзя скопировать в 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, чтобы оформление сохранилось и на другом компьютере.
Три ограничения — прямо и без прикрас. Экспорт в MKV входит в Pro — это разовый платёж $29, он указан на странице с тарифами. Sablate не записывает дорожки субтитров в MP4, потому что mov_text выбросил бы оформление, — экспортируйте файлы .srt и, если нужен MP4, запустите приведённую выше команду FFmpeg для MP4. И экспорт заменяет все дорожки субтитров, которые уже были в исходном файле, а не сохраняет их, поэтому, если они важны, добавьте их обратно через MKVToolNix.
Транскрипцию и перевод шаг за шагом разбирает рабочий процесс с несколькими языками.
Какой способ выбрать?
Выбирайте по тому, что у вас уже есть (файлы субтитров или только видео), и по тому, где файл должен воспроизводиться:
| MKVToolNix | FFmpeg | Sablate | |
|---|---|---|---|
| Цена | Бесплатно | Бесплатно | $29 разово (Pro) |
| Платформы | Windows, Mac, Linux | Windows, Mac, Linux | Windows и Mac |
| Интерфейс | Графический интерфейс и командная строка | Командная строка | Графический интерфейс |
| Муксует уже готовые файлы субтитров | Да | Да | Частично, через импорт в задачу |
| Создаёт субтитры из речи | Нет | Нет | Да |
| Записывает MP4 с дорожками субтитров | Нет | Да | Нет |
| Языковые метки и флаг по умолчанию | Да | Да | Да, ставятся автоматически |
| Флаг принудительного показа | Да | Да | Нет |
| Вкладывает шрифты | Да | Да | Да, встроенные шрифты для субтитров |
| Меняет флаги без повторного мукса | Да, через mkvpropedit | Нет | Нет |
«У меня уже есть файлы субтитров». MKVToolNix. Он бесплатный, показывает все дорожки и флаги, прежде чем что-либо записать, и работа занимает две минуты.
«Мне нужно обработать целый сезон серий». mkvmerge или FFmpeg в цикле. Обе приведённые выше команды работают без присмотра, как только имена файлов подчиняются шаблону.
«Файл должен воспроизводиться на iPhone или в QuickTime». MP4 через FFmpeg, и смиритесь с субтитрами простым текстом.
«Мои субтитры — оформленный ASS». MKV с вложенным шрифтом. MP4 срезает оформление при добавлении.
«У меня есть только видео». Sablate, если вам нужны транскрипция, перевод и многодорожечный MKV в одном месте. Subtitle Edit — бесплатный путь, если вас устраивает собирать эти шаги самостоятельно.
«Видео пойдёт на YouTube». Ни один из контейнеров. Такие платформы, как 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
Для каждой дорожки субтитров выводится одна строка с кодеком, языком, названием, а также флагами по умолчанию и принудительного показа. Если дорожки в списке есть, пройдите по этому списку сверху вниз:
- Ни одна дорожка не помечена флагом по умолчанию. Плееру нечего включать самому. Поставьте флаг через
mkvpropedit, как в способе 1. - Побеждает собственная настройка плеера. В VLC, Plex и на многих телевизорах хранится предпочитаемый язык субтитров или настройка «выключено», которые перекрывают флаги в файле. Сначала проверьте плеер, потом файл.
- Полная дорожка помечена как принудительная. Зрители, которые выключили субтитры, всё равно видят каждую реплику. Флаг принудительного показа нужен только частичным дорожкам.
- Дорожка в MP4 игнорируется. Многие плееры молча пропускают
mov_text. Если файл не обязан быть MP4, замуксите его заново в MKV. - Буквы с диакритикой превращаются в кракозябры. Исходный SRT сохранён в устаревшей кодировке. Пересохраните его в UTF-8 и замуксите заново либо укажите кодировку параметром
--sub-charsetвmkvmergeили-sub_charencперед входным файлом субтитров в FFmpeg. - Оформленный текст показан обычным шрифтом. В дорожке ASS указан шрифт, которого нет на устройстве воспроизведения. Вложите файл шрифта, как в последней команде FFmpeg.
Мукс — дешёвая часть доставки субтитров: минута в MKVToolNix, одна строка в FFmpeg, ничего не перекодируется. Дорогая часть — вообще получить хорошие файлы субтитров на каждом языке. Если они у вас уже есть, вам хватит бесплатных инструментов выше. Если есть только запись, скачайте Sablate для Windows или Mac, транскрибируйте и переведите её, а дорожки, метки и флаги пусть запишет экспорт.