Вопрос или проблема
Общие инструкции по встраиванию субтитров можно найти здесь: https://trac.ffmpeg.org/wiki/HowToBurnSubtitlesIntoVideo
Я много раз успешно использовал инструкции для субтитров на основе изображений. Но теперь, когда мне нужно встраивать субтитры SRT, я не могу использовать приведенные выше инструкции по двум причинам:
- Мне нужно одновременно использовать сложный фильтр (-filter-complex), который не может быть объединен с простым фильтром (-vf).
- Субтитровая дорожка, которую я хочу встроить, является одной из нескольких дорожек, встроенных в видеофайл, поэтому даже если
subtitles=video.mkv
работал, этот метод не позволяет указать конкретный номер субтитровой дорожки.
Существует ли что-то подобное опции -filter-complex
[0:v][0:s:1]overlay[v]
, что работало бы со SRT и другими текстовыми, не изображенческими субтитрами?
Ах, я разобрался.
ffmpeg -y -i source.mkv -c:v vp9 -row-mt 1 -crf 24 -s 720x480 -sar "32:27" \
-filter_complex "[0:v]zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709, \
tonemap=tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p[v0]; \
[v0]subtitles=source.mkv:si=1[v]" -map "[v]" -an -dash 1 \
-map_chapters -1 -f webm out.webm
Я не осознавал, что можно добавить почти такой же синтаксис, как для простого фильтра, в сложный фильтр, если использовать правильные названия параметров для объединения компонентов фильтра.
Я также узнал, что имя файла видео с несколькими встроенными субтитровыми дорожками можно дополнить селектором дорожки в формате :si=
индекс.
Я использую эту команду для генерации предконвертированных видео потока с различным разрешением для адаптивного потокового вещания. Часть фильтра, не относящаяся к субтитрам, предназначена для преобразования HDR-видео в SDR.
Ответ или решение
Для работы с субтитрами SRT и использования фильтра -filter_complex
в FFmpeg, необходимо учитывать несколько ключевых аспектов, особенно когда требуется указать конкретную дорожку субтитров из нескольких доступных. Ниже приведена подробная инструкция о том, как корректно реализовать задачу, включая синтаксис и полное объяснение команд.
Общие сведения о FFmpeg и SRT-субтитрах
FFmpeg – это мощный инструмент для обработки видео и аудио файлов, позволяющий выполнять различные операции, такие как кодирование, декодирование, конвертация форматов и добавление субтитров. При работе с SRT-субтитрами важно понимать, что они являются текстовыми и, в отличие от графических субтитров, не требуют дополнительных ресурсов для их отображения.
Пример команды
Для начала приведем пример команды, в которой одновременно выполняются операции с видео и добавляются субтитры:
ffmpeg -y -i source.mkv -c:v vp9 -row-mt 1 -crf 24 -s 720x480 -sar "32:27" \
-filter_complex "[0:v]zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709, \
tonemap=tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p[v0]; \
[v0]subtitles=source.mkv:si=1[v]" -map "[v]" -an -dash 1 \
-map_chapters -1 -f webm out.webm
Разбор команды
-
Флаги и входные данные:
-y
: перезаписывать выходные файлы без подтверждения.-i source.mkv
: указывает входной файл (в данном случае это MKV файл с несколькими субтитрами).
-
Настройки видео:
-c:v vp9
: указывает, что будет использоваться кодек VP9.-row-mt 1
: включает многопоточность для кодирования строк.-crf 24
: задает уровень качества видеокодирования (чем меньше значение, тем выше качество).-s 720x480
: устанавливает разрешение выходного видео.-sar "32:27"
: задает соотношение сторон.
-
Использование
-filter_complex
:- Здесь происходит последовательная обработка видео:
[0:v]
– это ссылка на поток видео из входного файла.- Фильтры
zscale
иtonemap
используются для цветокоррекции и преобразования HDR в SDR. format=yuv420p
– задает формат пикселей для совместимости.
- Здесь происходит последовательная обработка видео:
-
Добавление субтитров:
[v0]subtitles=source.mkv:si=1[v]
: здесь происходит добавление субтитров из входного файлаsource.mkv
с указанием номера дорожки:si=1
. Это позволяет выбрать желаемую дорожку из нескольких.
-
Вывод и дополнительные флаги:
-map "[v]"
: выбирает обработанный видеопоток для вывода.-an
: исключает аудиопоток из выходного файла.-dash 1
: указывает на создание DASH формата для адаптивного стриминга.-map_chapters -1
: отключает добавление глав из входного файла.-f webm out.webm
: задает выходной формат и имя файла.
Заключение
Используя указанный подход, вы можете эффективно интегрировать SRT-субтитры в видео, одновременно применяя сложные фильтры. Главное — сохранять последовательность фильтров и правильно указывать нужные дорожки субтитров. Таким образом, FFmpeg предоставляет гибкость в обработке мультимедийных файлов, позволяя проводить тонкие настройки, необходимые для адаптивного стриминга и улучшения качества видео.