ТранскрибаторТранскрибатор
Транскрибатор · Практика

Как добавить субтитры через FFmpeg: отдельная дорожка и вшивание SRT

В FFmpeg добавление дорожки и вшивание текста — разные операции. Первая может сохранить видео без перекодирования, вторая меняет изображение. Ниже — два небольших примера и проверки, которые помогут выбрать нужный результат.

База знаний Транскрибатора6 мин. чтения
SRT: текст и времяПоток или фильтр subtitlesДва разных результата
Работа с реальной записьюНаглядный учебный примерШаблон для копирования
1Подготовить файлы2Выбрать команду3Проверить результат
Выбор операции определяет, будут ли субтитры самостоятельной дорожкой или частью видеокадров.
Практика работы с видео

Что нужно подготовить

В примерах используются input.mp4 и captions.srt в одной рабочей папке. Выходные файлы называются иначе, чтобы не затронуть исходник. Установленная сборка FFmpeg должна поддерживать указанные кодеки; для вшивания нужен фильтр subtitles с поддержкой libass.

Сначала проверьте сам SRT: язык, кириллицу и соответствие монтажу. Если текста ещё нет, получите основу через расшифровку видео, затем подготовьте интервалы. Команда добавления дорожки не распознаёт речь и не исправляет неверные слова.

Оба примера ниже проверены на коротком синтетическом ролике с видео H.264, аудио AAC и русской репликой. Это подтверждает работу команд в тестовой среде, но не гарантирует поддержку любого исходного кодека или контейнера у получателя.

Практика работы с видео

Переключаемая дорожка SRT внутри MP4

ffmpeg -n -i input.mp4 -i captions.srt -map 0:v:0 -map "0:a?" -map 1:0 -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=rus soft.mp4

Здесь первый вход — видео, второй — SRT. Явный выбор потоков берёт первый видеопоток, доступные аудиопотоки и субтитры из второго входа. Вопросительный знак позволяет не считать отсутствие аудио ошибкой выбора. Кавычки вокруг такого аргумента полезны для оболочек, где знак вопроса имеет специальное значение.

Видео и аудио копируются, а субтитры преобразуются в mov_text. Этот пример рассчитан на исходные потоки, совместимые с MP4. Если исходный звук не поддерживается контейнером, копирование потребует изменения команды: не заменяйте параметры наугад, сначала прочитайте сообщение об ошибке.

Языковая метка rus описывает русский текст, но не переводит его. Такая дорожка остаётся отдельной от изображения. В проигрывателе может понадобиться включить её вручную; не делайте вывод об отсутствии текста только по первому запуску видео.

Практика работы с видео

Постоянные субтитры в изображении

ffmpeg -n -i input.mp4 -vf "subtitles=captions.srt" -c:v libx264 -crf 20 -preset medium -c:a copy burned.mp4

Фильтр отрисовывает текст поверх кадров, поэтому видео перекодируется. CRF 20 и preset medium здесь служат стартовым примером, а не универсальным требованием к качеству. Оцените результат на своём материале и целевом устройстве.

Для первой проверки используйте простые имена файлов в текущей папке. Сложные пути, особенно со служебными символами и двоеточиями, требуют отдельного экранирования внутри выражения фильтра. Кавычки оболочки и правила фильтра — разные уровни; простое копирование длинного пути может оказаться недостаточным.

После вшивания надписи нельзя отключить как дорожку. Сохраните чистый исходник и SRT для последующих исправлений. Повторное наложение текста на уже обработанный файл способно создать два слоя надписей.

Практика работы с видео

Почему нельзя совместить фильтр и копирование видео

Копирование видеопотока переносит закодированные данные без изменения изображения. Фильтр работает с кадрами и меняет их содержимое. Поэтому в команде вшивания не нужно заменять видеокодек на copy ради ускорения: это противоречит самой операции.

При добавлении отдельной дорожки изображение менять не требуется, поэтому копирование может быть подходящим вариантом. Разница видна и при проверке результата: у soft.mp4 в тесте появилась отдельная дорожка mov_text, а у burned.mp4 текст находился в видеокадрах без отдельного потока субтитров.

Не ориентируйтесь только на размер выходного файла. Небольшой файл не доказывает правильный способ вывода, а большой — хорошую читаемость. Проверяйте потоки, изображение и поведение при отключении субтитров.

Практика работы с видео

Как разбирать типовые ошибки

Сообщение об отсутствии фильтра subtitles указывает на возможности сборки, а не на качество текста. Ошибка открытия captions.srt требует проверки имени, текущей папки и пути. Ошибка совместимости потока с контейнером относится к выбранному формату и кодеку.

Если команда завершилась, но реплики не совпадают с речью, проверьте версии видео и SRT. Добавление дорожки не синхронизирует произвольный текст автоматически. Сначала сравните раннюю, среднюю и позднюю реплику, чтобы отличить постоянный сдвиг от монтажного расхождения.

Параметр -n запрещает перезапись существующего выхода. Если файл уже есть, задайте новое имя после проверки ситуации. Для учебных проб это удобнее, чем автоматически перезаписывать результат и терять возможность сравнить две версии.

Сохраняйте использованную команду рядом с рабочими файлами. Тогда при повторной обработке не придётся вспоминать, какой вариант дал нужный результат и какие изменения вы внесли после первой неудачной попытки.

Практика работы с видео

Приёмка готового файла

Проверьте потоки командой ffprobe или через сведения о медиа в проигрывателе. Для переключаемого варианта найдите дорожку субтитров и включите её. Для вшитого варианта откройте видео без внешних файлов и убедитесь, что текст остаётся виден.

Практический порядок подключения и проверки описан в руководстве по VLC. Сверьте несколько временных точек, длинные строки, кириллицу и последнюю реплику. После технической проверки прочитайте материал без звука.

Передавайте результат с понятным указанием: «дорожку можно отключить» или «надписи постоянные». Если получатель просил отдельный SRT, добавьте его в комплект; наличие текста внутри MP4 не заменяет этот файл для дальнейшей редакторской работы.

Учебный пример

Что показала проверка двух команд

Учебный тест выполнен на трёхсекундном ролике H.264/AAC с одной русской репликой. Это тест команд, а не оценка качества на любых материалах.

ВыходПотоки в тестеСмысл результата
soft.mp4H.264 + AAC + mov_textСубтитры добавлены отдельной дорожкой
burned.mp4H.264 + AACТекст отрисован в изображении
captions.srtИсходный текст с интерваламиСохранён для редактирования
ДорожкаВидео копируетсяТекст переключаетсяВшиваниеКадры меняютсяТекст постоянныйПроверкаОткрыть результатСверить с речью
Технически успешная команда создаёт только выбранный тип результата. Точность текста и удобство чтения проверяются отдельно.
Проверка перед экспортом

Чек-лист готовых субтитров

Скопируйте и отметьте выполненное
[ ] Сохранены исходное видео и SRT
[ ] Файл субтитров относится к монтажу
[ ] Выбран нужный способ вывода
[ ] Сборка поддерживает фильтр и кодеки
[ ] Выход имеет новое имя
[ ] Потоки проверены после обработки
[ ] Текст и время проверены в плеере
Разберём детали

Частые вопросы

Эти команды распознают речь?

Нет. Они используют уже подготовленный SRT. Распознавание, вычитка и временная разметка выполняются до добавления субтитров.

Можно ли вшить текст без перекодирования видео?

Вшивание меняет кадры, поэтому требует обработки видео. Копирование подходит для другого сценария — добавления отдельной совместимой дорожки.

Зачем указана языковая метка?

Она описывает язык дорожки для программ воспроизведения. Метка не переводит слова и не проверяет правильность текста.

Почему -n остановил обработку?

Выход с таким именем уже существует. Проверьте его и выберите другое имя, чтобы сохранить предыдущий результат.