Как с помощью ffmpeg встроить одну из нескольких дорожек SRT-субтитров, используя при этом -filter-complex?

Вопрос или проблема

Общие инструкции по встраиванию субтитров можно найти здесь: 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

Разбор команды

  1. Флаги и входные данные:

    • -y: перезаписывать выходные файлы без подтверждения.
    • -i source.mkv: указывает входной файл (в данном случае это MKV файл с несколькими субтитрами).
  2. Настройки видео:

    • -c:v vp9: указывает, что будет использоваться кодек VP9.
    • -row-mt 1: включает многопоточность для кодирования строк.
    • -crf 24: задает уровень качества видеокодирования (чем меньше значение, тем выше качество).
    • -s 720x480: устанавливает разрешение выходного видео.
    • -sar "32:27": задает соотношение сторон.
  3. Использование -filter_complex:

    • Здесь происходит последовательная обработка видео:
      • [0:v] – это ссылка на поток видео из входного файла.
      • Фильтры zscale и tonemap используются для цветокоррекции и преобразования HDR в SDR.
      • format=yuv420p – задает формат пикселей для совместимости.
  4. Добавление субтитров:

    • [v0]subtitles=source.mkv:si=1[v]: здесь происходит добавление субтитров из входного файла source.mkv с указанием номера дорожки :si=1. Это позволяет выбрать желаемую дорожку из нескольких.
  5. Вывод и дополнительные флаги:

    • -map "[v]": выбирает обработанный видеопоток для вывода.
    • -an: исключает аудиопоток из выходного файла.
    • -dash 1: указывает на создание DASH формата для адаптивного стриминга.
    • -map_chapters -1: отключает добавление глав из входного файла.
    • -f webm out.webm: задает выходной формат и имя файла.

Заключение

Используя указанный подход, вы можете эффективно интегрировать SRT-субтитры в видео, одновременно применяя сложные фильтры. Главное — сохранять последовательность фильтров и правильно указывать нужные дорожки субтитров. Таким образом, FFmpeg предоставляет гибкость в обработке мультимедийных файлов, позволяя проводить тонкие настройки, необходимые для адаптивного стриминга и улучшения качества видео.

Оцените материал
Добавить комментарий

Капча загружается...