Блог / Руководство

Как скачать субтитры к видео: форматы и ограничения

Как скачать субтитры к видео: форматы и ограничения

Если плеер показывает субтитры, это не значит, что существует файл субтитров, который можно сохранить. Прежде чем скачивать, нужно понять, как именно это видео передаёт текст: от этого зависит, можно ли сохранить его отдельным .srt или .vtt, смуксировать в видео или вообще нельзя сохранить как текст.

На практике бывает четыре случая. Субтитры веб-видео обычно устроены одним из способов:

  1. Отдельный файл, который плеер загружает рядом с видео.
  2. Текстовая дорожка внутри медиа, лежащая рядом с картинкой и звуком.
  3. Дорожка в потоке, перечисленная в манифесте HLS или DASH так же, как звуковые дорожки.
  4. Пиксели в картинке – вшитые (burned-in, hardcoded) субтитры.

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

Что за текст перед вами

1. Отдельный файл субтитров

В вебе субтитры к обычному видео чаще всего подключаются HTML-элементом <track>, который указывает на файл с размеченным по времени текстом, показываемым вместе с медиа. Согласно справочнику MDN по <track>, дорожки оформляются в WebVTT (файлы .vtt), а у медиаэлемента их может быть несколько, например на разных языках. WebVTT – формат W3C для текстовых дорожек, синхронизированных по времени.

Это самый простой случай: файл уже отделён от видео, и чтобы его сохранить, нужно запросить именно его. Но <track> используют не все сайты: многие плееры загружают .vtt, .srt или JSON своим кодом и сами рисуют текст. Файл при этом есть, просто в HTML страницы его не видно.

2. Дорожка внутри медиа

Субтитры могут быть упакованы и в контейнер. Как сказано в руководстве Mux по FFmpeg, встроенные субтитры хранятся как текстовая дорожка рядом с остальными дорожками контейнера, поэтому их можно извлечь, не изменяя видео. Это типично для уже скачанного файла; потоковый плеер чаще использует случай 1 или 3.

3. Дорожка в потоке

HLS и DASH могут описывать субтитры как отдельные дорожки. В мастер-плейлисте HLS тег EXT-X-MEDIA с TYPE=SUBTITLES указывает на отдельный медиаплейлист с текстом, а спецификация HLS (RFC 8216) определяет WebVTT-сегменты для его передачи. Это значит, что субтитры могут приходить множеством мелких сегментов, а не одним файлом, и загрузчику нужно получить и склеить их.

У HLS есть и другой вариант. Тот же тег с TYPE=CLOSED-CAPTIONS, по спецификации, не должен иметь URI: такие субтитры находятся внутри самого видеопотока, а не в собственном плейлисте. Если поток передаёт субтитры именно так, отдельного текстового ресурса для запроса нет. Но субтитры не обязательно потеряны: встроенные в поток данные CEA-608 или CEA-708 иногда умеют извлекать инструменты, читающие видеопоток, однако выдаст ли их MAX как дорожку, эта статья обещать не может. DASH тоже может перечислять текстовые дорожки отдельными наборами в манифесте; как манифест группирует дорожки, объясняет руководство по DASH. Устройство HLS – в статье Как скачать M3U8 / HLS-видео в Chrome.

4. Вшитые субтитры

Вшитые (hardcoded) субтитры – часть изображения видео. Mux отмечает, что их нельзя извлечь отдельным файлом, потому что текста в разбираемом виде нет. Это пиксели. Чтобы получить текст, пришлось бы читать кадры, то есть применять оптическое распознавание символов (OCR) – это другой и несовершенный процесс, которого обычный загрузчик не выполняет.

Если субтитры нельзя выключить в плеере и нет меню языков, вероятно, они вшиты. Но уверенности нет: некоторые плееры не показывают меню, даже когда текст – отдельная дорожка.

Как понять, какой у вас случай

Ни одна проверка не решает вопрос в одиночку, но вместе они сужают круг:

Наблюдение О чём это говорит
В плеере есть меню субтитров или языков, и текст меняется при переключении Текстовая дорожка существует – в любом из случаев 1–3.
Текст нельзя выключить, выбора языков нет Вероятно, вшит, хотя плеер мог просто не показать дорожку.
В DevTools на вкладке Network с фильтром vtt или srt при включении субтитров загружается файл Отдельный файл субтитров (случай 1). Многие сайты называют его иначе, так что пустой фильтр ничего не доказывает.
Фильтр m3u8 показывает мастер-плейлист с записями TYPE=SUBTITLES Дорожка субтитров в потоке HLS (случай 3).
Запись TYPE=CLOSED-CAPTIONS без URI Субтитры внутри видеопотока, отдельного плейлиста для загрузки нет.
В скачанном файле инструмент вроде ffprobe показывает поток субтитров Встроенная дорожка (случай 2).

Адрес видео вида blob: не говорит, откуда берутся субтитры. Это источник видеоэлемента, а текст субтитров может подгружаться совсем из другого места.

Субтитры или титры (captions)?

Эти слова часто используют как синонимы, но они не тождественны. Справочник MDN по <track> различает subtitles – расшифровку или перевод диалога для зрителей, которые слышат звук, и captions – они дополнительно описывают звуковые эффекты, музыку и другую звуковую информацию для тех, кто не слышит. Единообразно ли конкретный публикатор их называет – другой вопрос. Для скачивания важно лишь, что текст существует как дорожка, которую страница отдаёт.

Отдельный файл или вместе с видео?

Когда вы убедились, что текстовая дорожка есть, нужно решить, как её хранить.

Сохраните отдельным файлом, если хотите править, переводить, переиспользовать или архивировать текст либо если ваш плеер подхватывает файл субтитров рядом с видео. Mux называет локализацию, доступность и автоматизацию типичными причинами извлечения субтитров: с отдельным файлом проще работать редакторам и инструментам. Он также подойдёт к любому видеофайлу.

Смуксируйте в видео, если нужен один файл с картинкой, звуком и субтитрами, например для устройства, которое работает только с одним файлом. Муксинг помещает дорожки в один контейнер, не изменяя видео, но контейнер должен поддерживать этот формат субтитров. Здесь сочетание может не получиться, и поэтому полезно иметь отдельный файл про запас.

Распространённые форматы:

Формат Заметки
SRT Простой размеченный по времени текст. Очень широко поддерживается плеерами и редакторами, форматирования почти нет.
VTT (WebVTT) Формат, который браузеры используют для <track>. Умеет базовое оформление и позиционирование, естественный выбор для веб-воспроизведения.
ASS Предназначен для сложного оформления и позиционирования – так его применение описывает Mux.
Исходный формат Дорожка в том виде, в каком её отдал источник, без конвертации. Полезен, когда нужно ничего не потерять.

Конвертация в более простой формат может убрать оформление, поэтому если оно важно, выбирайте исходный формат.

Скачивание субтитров в MAX

MAX умеет сохранять доступные дорожки субтитров как SRT, VTT, ASS или в исходном формате, а также объединять выбранные дорожки видео, аудио и субтитров в один файл или сохранять их по отдельности. Это работает, когда источник отдаёт поддерживаемую дорожку. MAX не создаёт субтитры, которые сайт не публикует, не расшифровывает речь и не читает вшитый текст.

  1. Установите MAX из Chrome Web Store (бесплатно).
  2. Откройте страницу, запустите видео и включите субтитры в плеере, чтобы сайт их запросил.
  3. Откройте всплывающее окно MAX и выберите нужную дорожку субтитров среди найденных медиа – либо выберите дорожки видео, аудио и субтитров для объединения, а также формат вывода.
  4. Скачайте.

Если дорожка субтитров не появилась, сначала включите субтитры в плеере и попробуйте Force Detection. В журнале изменений MAX честно сказано, что более строгое обнаружение, сделанное ради менее навязчивой работы при обычном просмотре, может пропускать медиа, найденные раньше, – особенно субтитры, поэтому о ненайденной дорожке стоит сообщить. MAX не поддерживает защищённые DRM медиа и YouTube.

Если хотите взять сразу несколько дорожек, помните, что каждая – отдельная загрузка. Выбор пяти аудио- и пяти дорожек субтитров приводит к десяти операциям, как описано в журнале изменений MAX.

Когда нет дорожки субтитров для сохранения

Здесь три разные ситуации: нет отдельного ресурса субтитров, данные субтитров встроены в медиа и текст вшит в пиксели. Только в последней нечего восстанавливать. Загрузчик, собирающий дорожки субтитров, может не найти ничего ни в одной из них. Так бывает, когда:

  • субтитры вшиты в картинку,
  • сайт рисует их из источника, который страница не отдаёт браузеру как файл или поток,
  • это closed captions внутри видеопотока, у которых нет отдельного ресурса для загрузки (специальные инструменты могут извлечь такие встроенные данные, но загрузчик, собирающий только отдельные дорожки, их не увидит), или
  • медиа защищено – тогда ничего из сказанного не применимо, и эта статья не помогает защиту обходить.

В таких случаях попросите у публикатора расшифровку или файл субтитров либо воспользуйтесь загрузкой и субтитрами самой платформы. Сгенерированная расшифровка – другое дело: она создаётся сервисом распознавания речи, а не берётся из исходных субтитров, и в ней могут быть ошибки.

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