Разбираемся · Создание онлайн-курсов

Как вшить субтитры в видеоурок через FFmpeg

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

В этом материале

Решите, действительно ли нужен текст внутри кадра

Вшитые субтитры становятся частью изображения: зритель не сможет отключить их или выбрать другой язык. Это удобно для короткого фрагмента, который будут воспроизводить без отдельной текстовой дорожки. Для полноценного урока сначала рассмотрите вариант переключаемых субтитров в совместимом плеере. Он оставляет пользователю больше контроля над просмотром и не требует нового видеоэкспорта при каждой правке реплики.

W3C различает постоянно видимые и переключаемые субтитры. Для передачи содержания важны не только слова, но и необходимые звуковые события. Само вшивание не исправляет текст и не делает видео автоматически доступным во всех отношениях. Сохраните отдельную расшифровку и исходную дорожку. В этой инструкции мы решаем узкую техническую задачу: получаем проверенную копию уже подготовленного собственного видео.

Подготовьте согласованную пару файлов

Положите окончательный монтаж lesson.mp4 и вычитанные субтитры lesson.srt в отдельную рабочую папку. Откройте терминал именно в ней. Простые имена без пробелов и двоеточий избавят первый запуск от дополнительного экранирования пути внутри фильтра. Не переименовывайте единственный мастер-файл ради эксперимента: работайте с копией и запишите, к какой версии монтажа относится текст.

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

Проверьте возможности установленной сборки

Выполните команду ffmpeg -hide_banner -h filter=subtitles. Нужна справка о фильтре subtitles, а не сообщение о неизвестном фильтре. Официальная документация фильтров FFmpeg описывает отрисовку через libass. Наличие самой команды ffmpeg ещё не гарантирует, что конкретная сборка включает нужный компонент. В нашей технической проверке использована сборка FFmpeg 7.1 с libass на macOS; это описание испытания, а не требование использовать именно эту версию.

Затем выполните ffmpeg -hide_banner -i lesson.mp4 и прочитайте список потоков. Команда без выходного файла покажет сведения и завершится сообщением об отсутствии выхода — это ожидаемо. Основной пример ниже рассчитан на первую видеодорожку и первую аудиодорожку AAC в MP4. Если звуковых потоков несколько, убедитесь, что первый содержит голос урока, а не музыку или другой язык. Для видео без звука команду нужно изменить, убрав обязательный выбор аудио.

Создайте новый файл одной командой

Для описанных входных файлов выполните:

ffmpeg -n -i lesson.mp4 -map 0:v:0 -map 0:a:0 -vf "subtitles=lesson.srt" -c:v libx264 -crf 20 -preset medium -c:a copy -movflags +faststart lesson-subtitled.mp4

Команда явно выбирает первый видеопоток и первый аудиопоток. Фильтр рисует текст, поэтому видео кодируется заново через libx264. Значение CRF 20 — отправная точка нашего примера, а не гарантия одинакового качества для любого материала. Звук копируется без повторного кодирования. Для иной аудиодорожки нужно проверить совместимость с выходным MP4; при ошибке не удаляйте звук ради успешного завершения команды.

Параметр -n защищает уже существующий выходной файл от перезаписи. Если lesson-subtitled.mp4 уже есть, выберите новое имя после проверки журнала. Не делайте вывод об успехе только по коду завершения: проверенная нами сборка при существующем файле напечатала «already exists. Exiting.», сохранила прежний файл и вернула код ноль. Читайте сообщения и проверяйте результат. Исходное видео и файл SRT команда не заменяет.

Примите короткий тест до обработки большого урока

Для воспроизводимой проверки мы использовали шестисекундное видео 640 × 360 с тестовым звуком и тремя русскими репликами. Первая показывалась с первой до второй секунды, вторая — с третьей до четвёртой, третья — с пятой до шестой. На кадрах 1,5, 3,5 и 5,5 секунды текст читался без повреждённых символов. До первой реплики текста не было. Это проверка работы команды на искусственном материале, не измерение доступности реального урока.

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

Проверьте выдачу ученику и сохраните версии

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

Храните мастер-видео, SRT, итоговый экспорт и команду с общим номером версии. В заметке укажите проверенную аудиодорожку и места контрольного просмотра. В Umhub размещайте уже проверенный материал выбранным поддерживаемым способом; инструкция не предполагает встроенного в платформу FFmpeg или автоматического вшивания. При изменении текста вернитесь к мастеру и дорожке, чтобы не накапливать перекодирования поверх предыдущих копий с уже нарисованными субтитрами.

Источники

  1. W3C различает постоянно видимые и переключаемые субтитры ↗
  2. Официальная документация фильтров FFmpeg ↗
Создать аккаунт и собирать свою библиотеку →
От знаний — к своему курсу

Создайте свой курс в Umhub

Примените то, что узнали: соберите программу, добавьте материалы и пригласите учеников.

Создать курс