Главная страница
Видеосъемка, монтаж фильмов
Вставка субтитров в файл фильма


     На международных конференциях очень редко встречаются фильмы с субтитрами. Однако, у собирателя материал чаще всего представлен записями с речью информантов на их родном языке. Докладчик комментирует видео в течение просмотра, или в конце доклада. Обычно, процесс набора титров и вставка их в видеофайл представляется сложной задачей, но здесь постараюсь все упростить буквально в два-три действия.
    Титры в фильме очень важны, прежде всего это охват всей аудитории зрителей-исследователей, а перевод текста на английский язык, делает доступным материал зарубежным исследователям. В статье "Работа с программой ELAN. Расшифровка аудио и видеозаписей" легкодоступно описывается работа по набору расшифровки (субтитров) в бесплатной программе ELAN. Здесь будет описано, как полученные титры вставить в фильм.

     Есть два способа хранения титров в видеофайле - в контейнере и в растре. Хранение текста в контейнере, это значит текст с титрами дописывается в видеофайл (отдельным потоком) и при воспроизведении может быть отображен по желанию (качество видеозаписи неизменно). Хранение в растре, это накладывание текста субтитров на каждый кадр фильма. Оригинальное изображение фильма при этом утрачивается (буквы текста могут скрыть некоторые детали изображения в кадре). Контейнер же позволяет хранить множество субтитров (русский, английский, другие языки) и переключать их во время воспроизведения фильма. В растр изображения встраивается текст, выполненный на каком-то одном языке (чаще русский). Контейнерный тип хранения субтитров не воспринимается сервисом Youtube.com (2015 г.). Здесь будут рассмотрены оба варианта вставки субтиров.

Вставка субтитров в контейнер.
     Наиболее легкий способ вставки текста субтитров в контейнер, поместить их в видеофайл с расширением MKV (контейнер "Матрёшка"). Сегодня можно сказать, что такой контейнер уже стал распространенным и многие видеопроигрыватели его открывают. MKV "предпочитает" видеокодек H264 (x264) со звуковой дорожкой аудиокодека AAC (Free AAC). Возможны и другие комбинации, но указанные выше, легко обрабатываются.

     Сначала необходимо убедиться, что файл фильма соответствует рекомендуемым параметрам, чтобы не конвертировать его повторно. Для этого запускается видеопроигрыватель VLC (videolan.org.ru) и после открытия файла фильма (меню: /Медиа/-/Открыть файл.../, или /Media/-/Open file.../) нажимается комбинация клавиш [Ctrl]+[j] (или меню /Инструменты/-/Информация о кодеке/, в английской версии /Tools/-/Codec information/). Обращаем внимание на строки Type: Video, Codec: H264....., Type: Audio, Codec: MPEG AAC......(в русской версии соответственно "Тип" Видео или Аудио и "Кодек"), где указывается аудио и видеодорожка и соответствующие кодеки. Прочитаем информацию с рисунка, представленного ниже. Тип видеопотока - MPEG-1/2, звуковая дорожка - MPEG Audio layer 1/2/3. Здесь, видео сжато кодеком MPEG первого типа (один из ранних видеокодеков), а звук в MP3.

Эти кодеки без проблем размещаются в контейнере MKV, поэтому можно приступить ко вставке (в случае неудачи, после вставки будет рассмотрена конвертация).

     Всю работу необходимо осуществлять в отдельном каталоге. Идеальный вариант, создать папку на диске [D:\], или [C:\]. Имя папки (каталога) лучше набирать латинскими символами. Несмотря на то, что сегодня все операционные системы прекрасно работают с кириллическими символами, мы желаем, чтобы все прошло "чисто" и "гладко". Путь к каталогу может иметь вид: C:\Film1, или D:\video\kino1. В этот каталог уже сейчас можно "сбросить" файл с субтитрами, который был создан в ELAN. Это файл с расширением SRT. Его также лучше переименовать, например, в subtitle-file.srt
Теперь потребуется бесплатная программа ffmpeg. Это всего один файл ffmpeg.exe, который можно скачать здесь ffmpeg.zip, или с официального сайта ("www.ffmpeg.org", "ffmpeg.zeranoe.com"). Кроме того, необходимо создать строку кодирования. Открывается программа "Блокнот", куда вписывается следующий текст:

ffmpeg -i "film.mpg" -i "subtitle-file.srt" -vcodec copy -acodec copy -scodec srt -metadata:s:s:0 language=rus -y "film.mkv"

     Будет обработан файл film.mpg, найденный в каталоге, в котором была запущена программа кодирования ffmpeg. Вместо film.mpg вы указываете имя файла своего фильма.
После второго параметра "-i" (input) указан файл субтитров. Здесь указывается файл, который создала программа ELAN.
Пропустим остальные, ненужные нам параметры, задержимся на language=rus. Язык субтитров можно не указывать, тогда этот текст попросту стирается. Если к фильму перевод на русском, то можно оставить. Это лишь "декоративная" настройка и только проигрыватель гордо выведет - "язык субтитров: русский".
Имя film.mkv - результирующий файл. Этот файл уже будет содержать субтитры. Все имена меняются на те, что находятся в вашем каталоге и могут быть произвольными, кроме расширения результирующего файла - MKV, расширения файла титров SRT и ffmpeg.exe.

Итак, в Блокноте набрана вышеуказанная строка кодирования (можно "Скопировать" и "Вставить"). Далее выбирается меню /Файл/-/Сохранить как/ и внизу окна изменяется расширение "Тип файла: все файлы (*.*)". Имя файла любое, а расширение BAT, например, start.bat
Вот этот файл и следует запустить как программу. Если все выполнено верно, то спустя несколько секунд (несколько десятков секунд) будет создан файл с расширением MKV. Фильм открывается в проигрывателе VLC и в меню /Субтитры/-/Дорожка субтитров/-Дорожка 1 - [Русский] (/Subtitle/-/Sub track/....) ставится флажок.


     В случае, если в ходе операции результирующий файл не будет создан, то легче всего переконвертировать (пересжать) исходный фильм в формат MPEG-4 AVC (x264) в контейнер AVI и затем быстрый перенос в контейнер MP4. Для этого также потребуется ffmpeg и три строки кодирования (первая создает каталог output-avi):
mkdir output-avi
for %%a in ("*.webm","*.mov","*.mp*g","*.mts","*.mp4","*.mkv") do ffmpeg.exe -i "%%a" -vcodec libx264 -crf 16 -c:a aac -strict -2 -f avi -y "output-avi\%%~na_x264aac.avi"
for %%a in ("*.avi") do ffmpeg.exe -i "%%a" -vcodec copy -bsf:a aac_adtstoasc -acodec copy -f mp4 -y "%%~na_to-mp4.mp4"

     Надо отметить, что это уже другой файл, поэтому текст в блокноте можно сохранить с именем, например encode-video.bat
Также рассмотрим ближе.
В первой строке будут обработаны все файлы в каталоге с расширениями: webm, mov, mpg, mpeg, mts, mp4, mkv (надеюсь, охватил распространенные, кроме avi)
Параметр "-crf 16" отвечает за качество получающегося видеофайла. Если необходимо сохранить качество, близкое к оригиналу, то "-crf 10", или "-crf 12" будет вполне достаточно. В ходе экспериментов в Фонограммархиве, при таких параметрах не удалось обнаружить искажений в кадре. Иногда, после 16, или 18 зорким глазом удается разглядеть ухудшение качества, но не менее.
Параметр "-c:a aac -strict -2" - аудиокодек AAC (ffmpeg почему-то "любит" именно этот вариант вместо "-acodec libvo_aacenc -ab 256k -ac 2").
"%%~na_x264aac.avi" - шаблон. Например, если файл фильма film.mpg, то результирующий файл получит новое имя film_x264aac.avi

     Иногда спрашивают про изменение размера кадра. Это параметр -s, скажем, если изменить размер видео на 352*288 точек, то строка примет вид:
for %%a in ("*.webm","*.mov","*.mp*g","*.mts","*.mp4","*.mkv") do ffmpeg.exe -i "%%a" -vcodec libx264 -crf 16 -s 352x288 -c:a aac -strict -2 -f avi -y "output-avi\%%~na_x264aac.avi"

     Несмотря на то, что контейнер AVI устарел, в примере он выбран лишь для того, чтобы файл фильма использовать в следующем способе хранения титров - в растре. Но для записи в контейнер MKV, программа ffmpeg сообщит об ошибке относительно AVI, поэтому следующей строкой файл быстро переводится в контейнер MP4 и получает имя film_x264aac_to-mp4.mp4 (строчку не описываю, тут просто перемещение в контейнер, например "-vcodec copy" - т.е. не кодировать видео). Тогда первый bat-файл немножко исправим (я изменил только имя):
ffmpeg -i "film_x264aac_to-mp4.mp4" -i "subtitle-file.srt" -vcodec copy -acodec copy -scodec srt -metadata:s:s:0 language=rus -y "film.mkv"

     Как правило, после таких преобразований, вставка титров проходит без каких-либо затруднений. В каталоге будет создано много файлов, тот что с титрами имеет расширение mkv
Буквально на днях нашелся способ, добавляющий субтитры в файл контейнера MP4 (субтитры в кодировке юникод, UTF-8):
ffmpeg -i "film.mp4" -i "subtitle-file.srt" -map 0:0 -map 0:1 -map 1:0 -c:s mov_text "film-subs.mp4"

     Взял имя с первого примера film.mpg и переименовал в film.mp4, а результат будет иметь название film-subs.mp4



Вставка субтитров в растр.
     В силу разных причин может потребоваться фильм со встроенными в изображение титрами. Технически это похоже на фотографию, в которую впечатана дата фотосъемки. Для удаления такой даты потребуется выполнить определенный фотомонтаж. Для удаления растровых фильтров потребуются нетривиальные решения (например, фильтр DeLogo в программе Virtual Dub). Если "контейнерные" титры во время показа можно отключить (переключить), то растровые титры отображаются всегда. Такой вариант может потребоваться при кодировании видео в другой формат, при публикации на сайте youtube.com, для воспроизведении на компьютере, на котором точно известно, что никаких проигрывателей типа VLC установить не позволят (а жаль, хорошая программа).
     Этот способ чуть сложнее, поскольку потребуется две других бесплатных программы - AkelPad и Virtual Dub. Мне пришлось долго искать хорошо работающий фильтр для вставки ELAN-титров, поэтому готовую программу публикую здесь ffmpeg.zip. Сайт с фильтром - "TextSub". Текстовый редактор AkelPad доступен по адресу "akelpad.sourceforge.net", но также опубликую здесь akelpad.zip. Если удастся найти простое решение на базе ffmpeg, оно будет обязательно здесь размещено.
     К сожалению, фильтр для субтитров "не понимает" специфических символов, которые используются в национальных языках и о которых позаботился ELAN применяя кодировку Юникод. Значит растровые титры могут быть либо русские, либо английские (возможно, позже найдется фильтр для Unicode). Для того, чтобы фильтр открыл файл субтитров, откроем их сначала в программе AkelPad. Это обычный редактор наподобие Блокнот, только более функциональный и позволяет редактировать файлы огромного объема (для Блокнот существует ограничение в 32, или 64 тысячи знаков). Затем тут же сохраним под именем subtitle-file.srt (/Файл/-/Сохранить как/), однако, внизу окна выберем "Кодировка:1251 (ANSI - кириллица)". В принципе, можно перезаписать файл, если у вас уже был subtitle-file.srt, при этом в тексте будут утрачены все специфические символы (сохраните копию!).
     Теперь программа Virtual Dub (запускать файл VirtualDub.exe). С помощью меню /File/-/Open video file.../ откроем видеофайл, который в предыдущем примере получил имя film_x264aac.avi (программа может вывести информационное окно по звуковой дорожке Virtual Dub Warning - закрываем OK). Затем выберем видеокодек, поскольку все кадры будут заново выведены с учетом прорисовки титров - /Video/-/Compression/.


Теперь фильтр субтитров - /Video/-/Filters.../, нажимаем кнопку /Add.../. В открывшемся списке выбирается фильтр TextSub.


Открывается окно, где предлагается выбрать файл субтитров. Внизу можно было бы выбрать русский в Character Set: Russian (204), но видимо не используется, поэтому Default (1).


Теперь файл сохраняется /File/-/Save as AVI.../. Вписывается имя файла, скажем film_x264aac-SUB.avi


В результате кодирования будет получен видеофайл со "вшитыми" в растр субтитрами. Если будут затруднения именно с контейнером AVI, то "перенос" видеозаписи в контейнер MP4 осуществляется как в примере выше:
ffmpeg.exe -i "film_x264aac-SUB.avi"  -vcodec copy -bsf:a aac_adtstoasc -acodec copy -f mp4 -y "film_x264aac-SUB.mp4"

     Мне пришлось вставить лишь другие имена.

     Другая программа, позволяющая "рисовать" субтитры на изображении, это Avidemux.


     По команде /File/-/Open/ выбирается исходный видеофайл. Avidemux "всеядна" (кодеки встроены), поэтому постарается открыть ваше видео в любом формате. Слева опция "Video Output", выбираем из списка кодек Mpeg4 AVC (x264). "Audio Output" оставляем COPY. Внизу "Output Format" выбираем MP4 Muxer.

     Кстати, можно заметить, что при выборе кодека Mpeg4 AVC (x264) стали доступны кнопки Configure и Filters. Сначала настроем качество кодирования - кнопка Configure. У меня выставлено Rate Control, Encoding mode: Constant Rate Factor (Single Pass). Степень качества 20. Если потребуется и далее работать с файлом, то можно установить качество 10 (с наименьшими потерями). У меня же параметр выставлен для публикации в Интернет. Качество видео настроили, теперь нажимаем Filters и в появившемся окне, слева выбираем пункт Subtitles. В средней части окна необходимо выбрать фильтр для субтитров "SSA/ASS/SRT" и дважды по нему кликнуть левой кнопкой мыши, либо нажать на значок - зеленый плюс внизу окна. Программа откроет диалог поиска и открытия файла субтитров. Отыскиваем файл SRT, который создала программа ELAN. Будет предложено сконвертировать SRT в SSA с чем и соглашаемся.


Avidemux, по неизвестной пока причине, может долго (более минуты) открывать и преобразовывать этот файл, поэтому следует запастись терпением. Программа не зависла! В дальнейшем субтитры будут открываться быстрей.

     После преобразования SRT-файла, в каталоге рядом с ним будет создан SSA-файл. Avidemux создает титры, которые на мой взгляд достаточно сильно выделяются на основном фоне. Можно оставить все как есть, но если есть желание, то могу порекомендовать следующие изменения:
1. Полученный файл SSA открывается в текстовом редакторе Блокнот.
2. В нем ищется строка:
Style: Default,Arial,18,&H00ffffff,&H0000ffff,&H00000000,&H00000000,0,0,0,0,100,100,0,0.00,1,2,2,2,30,30,10,0
и заменяется на следующую:
Style: Default,Arial,18,&H00ffffff,&H0000ffff,&H00000000,&H00888888,0,0,0,0,100,100,0,0.00,1,1,2,2,30,30,10,0
(тень становится светлее, обводка букв тоньше).
Файл SSA сохраняется, после чего заново устанавливается в фильтрах Avidemux (нужно удалить существующий и добавить новый).



В завершение нажимается кнопка с изображением дискеты (или меню /File/-/Save/), после чего будет предложено указать каталог с новым видеофильмом и процесс кодирования начнется. Кодирование займет определенное время, которое зависит от продолжительности фильма и размеров видеокадра.


Получившийся файл воспроизводится в проигрывателе VLC. Для публикации в Интернет его можно упаковать в WEBM, или оставить без изменений.

(C) Бовин В.Б.
Внесение изменений: 18.08.2015