Так как посетители форума заинтересовались возможностями библиотеки
FFmpeg, то самое время вернуться к этому часто задаваемому вопросу. Программа "Балаболка" по-прежнему не может сама создать видеофайл с речью и текстом, но она способна генерировать главное - звуковой файл и файл субтитров; всё остальное сделает утилита ffmpeg.exe.
Как создать видеофайл с речью
Чтобы создать файл со звуковой дорожкой, достаточно подготовить заранее один кадр. Например, это будет черный прямоугольник, рисунок в формате PNG. Для тестов я использовал файл INPUT.PNG размером 800x450. Также, создал в "Балаболке" звуковой файл INPUT.WAV с речью и файл субтитров INPUT.SRT. Для того, чтобы "Балаболка" создавала субтитры для звукового файла, надо активировать настройку "
Создавать файл формата SRT"
(пункт главного меню "Настройки | Аудиофайлы", вкладка "LRC, SRT"). Рекомендуется сохранять файл субтитров в кодировке UTF-8.
С помощью FFmpeg создал видеофайл со встроенными субтитрами, и тут меня ждал неприятный сюрприз: медиапроигрыватели отказывались показывать субтитры для этого видеофайла. Одни плееры вообще ничего не отрисовывали, другие показывали только первую строчку субтитров. Выглядело это так, как будто плееры выводили на экран один исходный кадр и больше не собирались ничего показывать (хотя при создании видеофайла была указана частота 25 кадров в секунду).
Не стал разбираться, что не так с указанными мной параметрами, а решил проблему по-другому: раз одного уникального видеокадра мало, надо подавать на вход FFmpeg два видеокадра. Создал
анимированный GIF-файл с двумя одинаковыми кадрами - черные прямоугольники сменяют друг друга через короткие промежутки времени в бесконечном цикле. И уже именно файл INPUT.GIF стал основой для создания видеодорожки.
Команда на создание видеофайла выглядит так:
Код: Выделить всё
ffmpeg -ignore_loop 0 -i input.gif -i input.wav -shortest -y input.mp4
► Показать
-ignore_loop 0 - анимированный GIF будет воспроизводиться снова и снова (визуально это никак не проявит себя, два черных прямоугольника будут сменять друг друга - но зато видеоплееры будут корректно показывать субтитры);
-shortest - видеофайл будет равен по продолжительности звуковому файлу;
-y - перезаписывать видеофайл без подтверждения;
В качестве звуковой дорожки можно использовать файл формата WAV, так как FFmpeg сама выполнит перекодирование аудиоданных с помощью встроенного кодека.
Если нет необходимости просматривать сообщения, выдаваемые утилитой FFmpeg, можно отключить показ служебной информации с помощью параметров
-v quiet или
-loglevel panic:
Код: Выделить всё
ffmpeg -ignore_loop 0 -i input.gif -i input.wav -shortest -y -v quiet input.mp4
На этом можно было и остановиться: создан видеофайл с речью и пустым черным прямоугольником в качестве видео. Достаточно положить файл субтитров рядом с видеофайлом на диске, и любой современный видеоплеер сможет показать текст при воспроизведении видео. А можно "упаковать" субтитры внутрь видеофайла.
Есть два способа хранить текстовые субтитры внутри видеофайла:
- "Вшить" субтитры внутрь видеокадров (это называется "вшитые" или "жёсткие" субтитры, "хардсаб"); субтитры станут частью рисунка видеокадра.
- Вставить субтитры внутрь файла MKV, и они станут отдельной "дорожкой" (это называется "программные" или "мягкие" субтитры).
Утилита FFmpeg позволяет создать оба вида субтитров в видеофайле.
Как создать видеофайл с "вшитыми" субтитрами
Можно использовать BAT-файл со следующими командами:
Код: Выделить всё
ffmpeg -ignore_loop 0 -i input.gif -i input.wav -shortest -y input.mp4
ffmpeg -i input.mp4 -vf subtitles=input.srt:force_style='Alignment=10,FontName=Tahoma,FontSize=30' -y output.mp4
del input.mp4
► Показать
-vf subtitles - параметр для добавления субтитров;
force_style - дополнительные настройки для субтитров: применяются те же параметры, что и для формата субтитров ASS. Например, значение параметра 'Alignment=10' означает, что текст будет отрисовываться в центре видеокадра по горизонтали и вертикали.
Такие субтитры хороши тем, что не требуют от видеоплеера никаких дополнительных усилий для показа. Но и качество изображения будет не идеальным, так как при кодировании видео могут возникнуть "артефакты".
Как создать видеофайл с дорожкой субтитров
Пример BAT-файла:
Код: Выделить всё
ffmpeg -ignore_loop 0 -i input.gif -i input.wav -shortest -y input.mp4
ffmpeg -i input.srt input.ass
ffmpeg -i input.mp4 -f ass -i input.ass -map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy -c:s copy -disposition:s:0 default -y output.mkv
del input.mp4
del input.ass
► Показать
-disposition:s:0 default - дорожка субтитров будет использоваться по умолчанию
Как можно заметить, будет выполнено преобразование субтитров из формата SRT в формат ASS. Это необязательная процедура, но я рекомендую ее осуществлять. Формат SRT - очень простой, он содержит лишь текст и метки времени. Формат ASS обладает значительно большими возможностями; подробнее о нем можно прочитать, например,
здесь. Получив файл субтитров в формате ASS, можно изменить оформление субтитров так, как Вам захочется, перед вставкой в видеофайл.
Обращаю Ваше внимание, что я привел лишь
самые общие примеры команд для создания видеофайлов. Можно значительно расширить их: использовать различные кодеки или изменять настройки для того, чтобы добиться лучшего качества или меньшего размера видеофайла. Кодирование файла выполняется достаточно медленно, так что можно экспериментировать с многочисленными параметрами, чтобы ускорить этот процесс (с описанием параметров можно ознакомиться в
документации FFmpeg). Также, можно бесконечно заниматься изменением оформления субтитров (черные буквы на белом фоне, белые буквы на черном фоне, логотип в углу экрана, размер букв, шрифт и т.д.). Удачи в поисках наилучшего варианта.