Как добавить субтитры через FFmpeg: отдельная дорожка и вшивание SRT
В FFmpeg добавление дорожки и вшивание текста — разные операции. Первая может сохранить видео без перекодирования, вторая меняет изображение. Ниже — два небольших примера и проверки, которые помогут выбрать нужный результат.
Что нужно подготовить
В примерах используются 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.mp4 | H.264 + AAC + mov_text | Субтитры добавлены отдельной дорожкой |
| burned.mp4 | H.264 + AAC | Текст отрисован в изображении |
| captions.srt | Исходный текст с интервалами | Сохранён для редактирования |
Чек-лист готовых субтитров
[ ] Сохранены исходное видео и SRT [ ] Файл субтитров относится к монтажу [ ] Выбран нужный способ вывода [ ] Сборка поддерживает фильтр и кодеки [ ] Выход имеет новое имя [ ] Потоки проверены после обработки [ ] Текст и время проверены в плеере
Частые вопросы
Эти команды распознают речь?
Нет. Они используют уже подготовленный SRT. Распознавание, вычитка и временная разметка выполняются до добавления субтитров.
Можно ли вшить текст без перекодирования видео?
Вшивание меняет кадры, поэтому требует обработки видео. Копирование подходит для другого сценария — добавления отдельной совместимой дорожки.
Зачем указана языковая метка?
Она описывает язык дорожки для программ воспроизведения. Метка не переводит слова и не проверяет правильность текста.
Почему -n остановил обработку?
Выход с таким именем уже существует. Проверьте его и выберите другое имя, чтобы сохранить предыдущий результат.