Субтитры и аудиодорожки: WebVTT, IMSC, мультиязычное аудио

Автор: Николай СапуновОбновлено: август 202633 мин чтения
Содержание статьи +

Кратко

Субтитры и несколько аудиодорожек находятся в том же манифесте, что и видео, но описываются, сегментируются и доставляются отдельным набором тегов – о которых большинство инженеров узнают только тогда, когда глухой зритель пишет жалобу или французская аудитория не может найти дубляж. WebVTT – это «лингва франка» веб-субтитров и единственный текстовый формат, который Apple до сих пор требует в HLS в виде сегментированного plain-text; IMSC1 – это формат уровня вещания, упакованный во фрагментированный MP4, единственный разрешённый CMAF профиль TTML и единственный способ обеспечить цветные, позиционированные, иллюстрированные субтитры, которые выживут при строгом пакаджинге. Несколько аудиодорожек – оригинал, дубляж, тифлокомментарий, режиссёрский комментарий, downmix-стерео, полноценный 5.1 или Dolby Atmos – объявляются как группа EXT-X-MEDIA в HLS или параллельные AdaptationSet в DASH, и именно атрибуты этих тегов определяют, что будет звучать в Париже по умолчанию, что появится в настройках для пользователя со скринридером и не превратится ли ваш Atmos-мастер в немое стерео на Roku 2018 года. Эта статья проходит по форматам, разметке манифеста, дисциплине язык/доступность и тем продакшен-решениям, от которых зависит, поедут ли субтитры и аудио в продакшен рабочими – или поломанными.

Почему это важно

Субтитры и мультиязычное аудио – это ключевые элементы стримингового продукта, определяющие его пригодность для выхода на регулируемые рынки, доступность для людей с нарушениями слуха или зрения и эффективность маркетинговой кампании в новых регионах. В США требования предъявляет FCC, в ЕС – Акт о доступности (EAA), в Великобритании – Equality Act, в Австралии – Broadcasting Services Act: все они обязывают обеспечивать субтитры для регулируемых видеосервисов; тифлокомментарий обязателен для ряда категорий премиум-контента. Платформенные сертификации Apple, Roku, Samsung и Google Play блокируют публикацию приложений при неправильной разметке доступности в манифесте.

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

Почему субтитры и мультиаудио – это отдельный тип трека

Любой стриминговый манифест описывает три типа медиа: видео, аудио и наложенный на изображение текст. Видео представлено одной или несколькими видеорендициями; звук – одной или несколькими аудиорендициями; текст – субтитры и captions – может отсутствовать или присутствовать в нуле или нескольких текстовых рендициях. Все три типа используют общий таймлайн, но не хранятся в одном файле. 4K HEVC-сегмент видео не содержит ни аудио, ни субтитров. Многоязычная дублированная аудиодорожка – это отдельный сегментированный файл. Французские closed captions – тоже свой. Манифест – это то, что объединяет всё это в плеере.

Это разделение сделано осознанно. Энкодер генерирует изображение один раз и использует его повторно для каждого рынка, на котором выходит шоу. Аудиокоманда создаёт оригинальный мастер и дубляж на каждый язык. Команда доступности готовит закадровые субтитры на языке оригинала, переводные субтитры для каждого рынка, дорожку тифлокомментария для незрячих и видеоналожение с сурдопереводом – там, где это требует регулятор. Если всё это «запекать» в видеопоток, каждый рынок будет означать повторное сжатие изображения. Хранить всё отдельно – единственный способ, при котором математика сходится.

Удобная аналогия: стриминговый манифест – это меню в ресторане, а не одно блюдо. Картинка – основное блюдо; каждая аудиорендиция – вино к нему; каждый трек субтитров – карточка-аннотация на столе. Плеер просматривает меню, спрашивает зрителя – или угадывает по системному языку и настройкам доступности – и заказывает только нужное. Кухня, пакаджер и CDN никогда не собирают всё это в одну тарелку – они отдают плееру только те позиции, которые он запросил.

Структурное следствие в том, что манифест содержит подробные метаданные для каждой текстовой и аудиоверсии: на каком языке она выполнена, является ли это субтитрами с описанием звуков (closed caption – расшифровывает речь и описывает несловесные звуки для глухих) или обычными субтитрами (переводят речь для слышащих зрителей на иноязычном рынке), представляет ли собой тифлокомментарий, являются ли субтитры forced (должны отображаться всегда, когда воспроизводится видео – например, для иноязычных надписей в кадре или текста на экране), и нужно ли выбирать их по умолчанию в данной системной локали. Ошибка в любом из этих параметров может привести к тому, что зритель, которому нужны субтитры, их не увидит, а зритель в Париже автоматически услышит английский язык.

Рис. 1. Стриминговый манифест содержит видео, аудио и текст как три независимые группы рендиций. Плеер выбирает по одной рендиции из каждой группы – на основе системной локали, настроек доступности и предпочтений пользователя. Видео кодируется один раз, а аудио и текст могут различаться в зависимости от региона.

WebVTT: формат, который понимает каждый веб-плеер

WebVTT – Web Video Text Tracks – это формат субтитров и надписей, разработанный группой W3C Timed Text Working Group для открытого веба. Это текстовый формат, который современные браузеры обрабатывают нативно через элемент <track>. WebVTT – единственный формат субтитров, который протокол HLS допускает в виде текстовых сегментов (не fMP4). Файл WebVTT компактный, легко читается человеком и прост в редактировании – те же преимущества, что сделали .srt популярным двадцать лет назад, плюс стандартизация, благодаря которой браузеры и пакеры одинаково интерпретируют значение каждой cue.

Минимальный WebVTT-файл выглядит так:

WEBVTT

00:00:03.000 --> 00:00:06.500
Добро пожаловать на брифинг.

00:00:06.800 --> 00:00:09.200 line:85% align:middle
[хлопает дверь]
Точно по графику, как обещали.

Файл начинается с магического заголовка WEBVTT. Каждый блок после заголовка – это cue: время начала, время окончания, стрелка между ними и одна или несколько строк текста. Cue отображается на таймлайне с момента старта до конца; плеер накладывает текст на изображение в этом временном интервале. Опциональные настройки cue после таймстампа – как в line:85% align:middle – определяют, где появится текст и как он будет выровнен; при их отсутствии плеер использует значения по умолчанию (обычно – внизу по центру с небольшим отступом). WebVTT поддерживает метки говорящих, базовую стилизацию через инлайн-теги вроде <b> и <i>, а также треки глав и метаданных, которые не связаны с отображаемыми субтитрами.

Для доставки в HLS WebVTT сегментируется. Пакаджер разбивает полный WebVTT-файл на фрагменты, выравнивая их по сегментам видео – обычно каждые 6 секунд, иногда 10 – чтобы плеер мог запрашивать только нужные временные окна cue и не перегружал память при 4-часовом эфире. Каждый сегмент представляет собой валидный самостоятельный WebVTT-файл со своим заголовком WEBVTT. Чтобы временные метки cue оставались привязаны к медиатаймлайну между сегментами, пакаджер добавляет в каждый фрагмент заголовок X-TIMESTAMP-MAP, который синхронизирует локальное время сегмента с presentation timestamp медиа. Apple HLS Authoring Specification чётко описывает этот формат: X-TIMESTAMP-MAP=LOCAL:<cue time>,MPEGTS:<media time>. Без этого заголовка субтитры отображаются на экране, но с неправильным временем – типичный баг, возникающий, когда сторонний инструмент генерирует WebVTT без учёта особенностей HLS.

WebVTT-куы могут содержать forced-контент – фразу, которую необходимо отображать независимо от того, включены ли у зрителя субтитры, поскольку в кадре присутствует текст на иностранном языке, и зрителям нужен перевод, чтобы следить за сюжетом. В манифесте HLS атрибут FORCED=YES на строке EXT-X-MEDIA помечает forced-рендицию; сам WebVTT-файл содержит только forced-куы, а не полный трек субтитров.

Чего WebVTT делает плохо – это типографическое богатство. Цветной текст на цветном фоне, глифы, которых нет в стандартном шрифте у зрителя (арабский, CJK, сложные письменности, требующие шейпинга), битмап-субтитры с уже стилизованной графикой, кадровая точность позиционирования сверх того, что выражают line: и position:. Любая из этих потребностей толкает проект в сторону IMSC1.

IMSC1: формат, используемый в вещании

IMSC1 – TTML Profiles for Internet Media Subtitles and Captions – это профиль TTML (Timed Text Markup Language) от W3C, на котором индустрия вещания и OTT-сервисов стандартизировала формат премиум-субтитров. IMSC1 определяет два профиля: Text profile, стилизующий текст в духе HTML+CSS, и Image profile, в котором каждая cue представляет собой PNG-изображение (подход, распространённый в Японии и Корее, где богатая типографика субтитров не может быть надёжно воспроизведена стандартными текстовыми движками). IMSC1 поддерживает цвет cue, заливку фона, обводку и тени, точное позиционирование в процентах или пикселях, ruby-аннотации для CJK-языков и двунаправленную раскладку для иврита и арабского.

IMSC1.0.1 стала рекомендацией W3C в 2018 году; IMSC1.1 в 2020 году расширила возможности стилизации; IMSC1.2 – текущая редакция, совместимая с документами IMSC1.1 и поддерживающая современные практики. CMAF – единый формат упаковки для HLS и DASH – поддерживает только один профиль TTML, а именно IMSC1. Если контент упаковывается в формате CMAF, субтитры могут быть либо WebVTT, либо IMSC1 – других вариантов нет.

Структурное отличие от WebVTT заключается в том, что IMSC-контент встраивается в фрагментированные MP4-сегменты. Пакаджер оборачивает IMSC XML в боксы MPEG-4 Part 30 (ISO/IEC 14496-30) и формирует fMP4-файл с расширением .mp4 или .m4s и кодеком stpp (профиль subtitle/text). В HLS такие сегменты называются IMSC Segments, а в DASH они передаются в AdaptationSet с contentType="application" и codecs="stpp". Apple HLS Authoring Specification требует, чтобы каждый IMSC Segment содержал все семплы субтитров, которые должны отображаться в течение EXTINF длительности сегмента, а также все определения стилей, на которые ссылается любой из этих семплов – сегменты должны быть независимы при парсинге, как и видеосегменты.

Поддержка IMSC в плеерах универсальна на крупных платформах и неравномерна на более мелких. iOS и tvOS получили IMSC1 Text profile после WWDC 2017; Android Exoplayer, Shaka Player и большинство нативных плееров Smart TV добавили его в 2018–2020 годах. hls.js реализовал IMSC в виде плагина, а не по умолчанию – CMAF-совместимый HLS-поток с IMSC-субтитрами может не воспроизводиться без ошибок на веб-плеерах, где этот плагин не подключён. Прагматичная стратегия на 2026 год – использовать WebVTT как универсальный текстовый трек и добавлять IMSC только там, где это требуется типографикой или условиями контракта с downstream-платформой.

CEA-608 и CEA-708: «выжившие» в битпотоке

Третье семейство субтитров – captions – выжило в 2026 году не потому, что вокруг него разрабатывают новые системы, а потому, что это legacy-формат обмена, который workflow broadcast-субтитрования использует со времён аналогового вещания. CEA-608 – оригинальный стандарт line-21 captions для NTSC начала 1980-х: 32 символа в строке, два цвета, три режима отображения (pop-on / paint-on / roll-up), не более одного-двух одновременных сервисов. CEA-708 – современный цифровой преемник ATSC, принятый в 1998 году, поддерживающий до 63 service-каналов, несколько шрифтов, цветов, прозрачность и более гибкое позиционирование. Декодеры 708 обязаны уметь декодировать встроенные 608-субтитры, поэтому один 708-битстрим содержит как 608-совместимые, так и более богатые 708-данные параллельно.

Для стриминга это важно, потому что субтитры, созданные до энкодера – например, лайв-сервисом, broadcast-фидом или архивным мастером – часто встроены в видеопоток H.264 или H.265 в виде сообщений SEI (Supplemental Enhancement Information), содержащих payload стандартов 608 или 708. У пакаджера есть два варианта: либо оставить субтитры в видеопотоке и попросить плеер извлечь их на стороне рендера, либо удалить их и передать отдельно в формате WebVTT или IMSC – как сторонние файлы (сайдкары).

HLS-манифест сигнализирует in-bitstream-путь тегом EXT-X-MEDIA с TYPE=CLOSED-CAPTIONS, у которого атрибут INSTREAM-ID называет 608-сервис (CC1–CC4) или 708-сервис (SERVICE1–SERVICE63). Плеер читает значение, вытаскивает captions из SEI внутри сегмента и отрисовывает их. Строка EXT-X-STREAM-INF варианта затем ссылается на closed-captions-группу атрибутом CLOSED-CAPTIONS. Вариант без встроенных captions ставит атрибут в NONE явно; пропустить атрибут легально, но это типичный источник несогласованного поведения плееров.

Sidecar-подход извлекает данные 608/708 на пакаджере и передаёт их в виде WebVTT или IMSC-рендиции – так же, как если бы субтитры были созданы вручную. Это более чистая архитектура для новых сборок: каждый трек субтитров помещается в отдельное семейство тегов манифеста, что даёт пакаджеру возможность нормализовать стилизацию. Минус в том, что субтитры, созданные в прямом эфире на основе данных 608 (line-21), теряют точность при конвертации: цвет и позиционирование, которые формат 708 поддерживает нативно, в WebVTT приходится аппроксимировать.

Прагматичная позиция на 2026 год – оставлять CEA-608/708 в битстриме при ингесте из вещательного источника, а затем конвертировать в WebVTT для плеера. Roku, Smart TV и старые Android-устройства до сих пор надёжно читают встроенные 608/708; веб-плееры предпочитают sidecar. Если энкодер позволяет – отгружайте оба формата.

Разметка манифеста: как HLS всё это связывает

Многоязычный HLS-манифест с субтитрами – лучшее место, чтобы увидеть, как всё перечисленное собирается воедино. Пример ниже сокращён для ясности, но при этом остаётся корректным и достаточно полным, чтобы воспроизводиться в современном hls.js или нативном iOS-плеере.

#EXTM3U
#EXT-X-VERSION:7

# Аудиорендиции — три языка + тифлокомментарий
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac-main",NAME="English",
  LANGUAGE="en",DEFAULT=YES,AUTOSELECT=YES,CHANNELS="2",URI="audio/en/main.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac-main",NAME="Français",
  LANGUAGE="fr",DEFAULT=NO,AUTOSELECT=YES,CHANNELS="2",URI="audio/fr/main.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac-main",NAME="Español",
  LANGUAGE="es",DEFAULT=NO,AUTOSELECT=YES,CHANNELS="2",URI="audio/es/main.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac-main",NAME="English (Audio Description)",
  LANGUAGE="en",DEFAULT=NO,AUTOSELECT=NO,CHANNELS="2",
  CHARACTERISTICS="public.accessibility.describes-video",URI="audio/en-ad/main.m3u8"

# Рендиции субтитров — WebVTT для веба, IMSC для премиум-рынков
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English (CC)",
  LANGUAGE="en",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,
  CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog,
                   public.accessibility.describes-music-and-sound",
  URI="subs/en/main.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Français",
  LANGUAGE="fr",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,URI="subs/fr/main.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Français (forcés)",
  LANGUAGE="fr",DEFAULT=NO,AUTOSELECT=NO,FORCED=YES,URI="subs/fr-forced/main.m3u8"

# Видеорендиции — каждая ссылается на группы аудио и субтитров
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2",
  AUDIO="aac-main",SUBTITLES="subs",CLOSED-CAPTIONS=NONE
video/1080p/main.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d401f,mp4a.40.2",
  AUDIO="aac-main",SUBTITLES="subs",CLOSED-CAPTIONS=NONE
video/720p/main.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=900000,RESOLUTION=640x360,CODECS="avc1.42c01e,mp4a.40.2",
  AUDIO="aac-main",SUBTITLES="subs",CLOSED-CAPTIONS=NONE
video/360p/main.m3u8

Читать сверху вниз: четыре аудиорендиции в группе aac-main, три рендиции субтитров в группе subs, три видеоварианта – каждый из которых ссылается на обе группы по их GROUP-ID. Зритель слышит одну аудиорендицию за раз и видит ноль или одну рендицию субтитров одновременно; видеорендиция переключается по полосе через ABR. Атрибуты AUDIO= и SUBTITLES= на EXT-X-STREAM-INF – это связка, означающая: «это видео можно комбинировать с любым элементом из этих групп». CLOSED-CAPTIONS=NONE – явный сигнал об отсутствии встроенных субтитров; его лучше задавать явно, а не опускать, потому что некоторые плееры интерпретируют отсутствие как «неизвестно – попробуй извлечь» и напрасно тратят ресурсы.

Каждый атрибут в каждой строке EXT-X-MEDIA имеет значение. LANGUAGE – это тег BCP 47 в кавычках: "en", "en-US", "fr", "pt-BR", "zh-Hans" – и плеер использует его для сопоставления системной локали при выборе значения по умолчанию. DEFAULT=YES помечает рендицию, которая воспроизводится, если зритель не указал своих предпочтений; в одной группе может быть только одна рендиция с таким флагом. AUTOSELECT=YES помечает рендицию как подходящую для автоматического выбора системой (например, Mac, настроенный на французский язык, выберет французское аудио, если оно AUTOSELECT=YES); рендиция, помеченная как DEFAULT, обязательно должна быть также помечена как AUTOSELECT. FORCED=YES (только для субтитров) помечает принудительный нарративный трек, который отображается независимо от настройки пользователя «субтитры включены». CHARACTERISTICS – список ролей доступности из таксономии iTunes Media Characteristics, разделённый запятыми: public.accessibility.describes-video – для тифлокомментария, public.accessibility.transcribes-spoken-dialog – для закрытых субтитров (closed captions), public.accessibility.describes-music-and-sound – для субтитров с описанием неречевых звуков. CHANNELS – количество и конфигурация аудиоканалов: "2" – для стерео, "6" – для 5.1, "12/JOC" – для Dolby Digital Plus с миксом Atmos Joint Object Coding, который при необходимости преобразуется в 5.1 на устройствах, не поддерживающих Atmos.

Самый частый баг манифеста – несоответствие GROUP-ID: строка EXT-X-STREAM-INF ссылается на AUDIO="aac-main", а аудиорендеры объявлены с GROUP-ID="aac-1". Плеер загружает вариант, не находит подходящую аудиогруппу и проигрывает видео без звука. Этот случай обязательно проверяйте в CI.

Второй частый баг – отсутствие DEFAULT=YES в аудиогруппе. Спецификация HLS это допускает (плеер должен сам выбрать подходящую рендицию), но поведение плееров на практике различается: некоторые модели Roku вообще отказываются воспроизводить поток, другие выбирают трек по алфавиту, игнорируя системную локаль. Всегда отмечайте ровно одну рендицию в каждой группе как DEFAULT.

DASH: та же история, другие теги

DASH MPD выражает это разделение через элементы AdaptationSet. Видео размещается в AdaptationSet с contentType="video"; каждый аудиодорожка – в отдельном AdaptationSet с contentType="audio" и lang="en"; каждый язык субтитров – в AdaptationSet с contentType="text" (или application для IMSC) и lang="fr". Плеер проходит по MPD, выбирает по одному AdaptationSet из каждого contentType и объединяет их.

DASH выражает доступность через дескрипторы Role, Accessibility и EssentialProperty. Трек тифлокомментария содержит <Accessibility schemeIdUri="urn:tva:metadata:cs:AudioPurposeCS:2007" value="1"/> (где «1» – код TVA AudioPurpose «для слабовидящих»), а также <Role schemeIdUri="urn:mpeg:dash:role:2011" value="alternate"/> для пометки «не по умолчанию». Трек принудительных субтитров содержит <Role schemeIdUri="urn:mpeg:dash:role:2011" value="forced-subtitle"/>. Трек закрытых субтитров (в отличие от обычных субтитров) содержит <Role value="caption"/>. Словарь более многословный, чем в HLS, и пространства имён URI сложнее запомнить, но семантика остаётся той же.

CMAF объединяет DASH и HLS в едином формате упаковки: согласно CMAF, текстовые треки должны быть представлены как сегментированные CMAF-треки – использование сторонних WebVTT-файлов в виде sidecar-файлов в строго CMAF-совместимом потоке не допускается. На практике пакеры, ориентированные одновременно на DASH-IF и экосистему Apple, выпускают WebVTT в двух форматах: в «сыром» виде .vtt – для доставки только по HLS, и в виде CMAF-упакованных сегментов WebVTT (кодек wvtt) – для DASH и строгого CMAF. В MPD тогда описывается AdaptationSet для WebVTT с mimeType="application/mp4" и codecs="wvtt". IMSC следует той же схеме с кодеком stpp.

Рис. 2. HLS описывает альтернативный аудио и текст в виде плоского списка рендийций EXT-X-MEDIA, связанных с вариантами через GROUP-ID. DASH представляет ту же структуру с помощью AdaptationSet’ов, различая их по contentType и lang. Семантика одинакова; различаются лишь синтаксические формы представления.

Аудио: один поток, много миксов

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

ТрекЯзыкКаналыКодекПрименение
Оригинальный диалоговый миксen2.0AAC-LCДефолт для англоязычной аудитории
Оригинальный surrounden5.1AC-3 / E-AC-3Домашний кинотеатр (английский)
Atmos object-миксen12/JOCE-AC-3 + JOCAtmos-совместимые устройства
Локализованный дубляж (FR)fr2.0AAC-LCДефолт для франкоязычной аудитории
Локализованный дубляж (FR)fr5.1E-AC-3Французский домашний кинотеатр
Локализованный дубляж (ES, DE, JP, …)…2.0AAC-LCПо одному на отгружаемый рынок
Тифлокомментарий (en)en2.0AAC-LCОбязательный a11y-трек
Режиссёрский комментарийen2.0AAC-LCБонусный контент

Плеер выбирает максимум один трек в каждый момент. Логика выбора, по убыванию приоритета: явный выбор пользователя из меню выигрывает; явная a11y-настройка (системный тумблер «Audio Descriptions» на iOS, «Audio Description» на Android TV) выигрывает дальше, против любой рендиции с CHARACTERISTICS="public.accessibility.describes-video" для языка пользователя; совпадение системной локали с LANGUAGE среди AUTOSELECT=YES выигрывает дальше; рендиция с DEFAULT=YES – последний резерв.

Значение channels невелико, но критически важно. Современный смартфон и Smart TV 2024 года поддерживают формат 5.1, однако ресивер 2017 года может воспроизводить только стерео. Атрибут CHANNELS в спецификации HLS позволяет плееру пропускать рендеринги, которые устройство не способно обработать – например, 5.1-рендеринг с CHANNELS="6" будет отфильтрован устройством, поддерживающим только стерео, и плеер автоматически перейдёт на 2.0-версию того же языка. Поддержка Atmos обозначается суффиксом JOC: CHANNELS="12/JOC" – для миксов 5.1.4 или 7.1.4, CHANNELS="16/JOC" – для 9.1.6. Устройства, не распознающие JOC, игнорируют такую рендеринг; устройства, поддерживающие JOC, извлекают объектные данные Dolby Atmos из payload Joint Object Coding параллельно с базовым 5.1-каналом.

Прагматичная лестница 2026 года для tier-1 OTT:

  • На язык: одна AAC-LC стерео-рендиция в 128 кбит/с для универсальной совместимости; одна E-AC-3 5.1 в 384 кбит/с для домашних кинотеатров; опционально – одна Atmos-JOC в 768 кбит/с для устройств, совместимых с Atmos.
  • Плюс, на основной язык рынка: один тифлокомментарий в формате AAC-LC стерео в 128 кбит/с с характеристикой describes-video.
  • Плюс, опционально: один режиссёрский комментарий в формате AAC-LC стерео для контента, где он добавляет ценность.

Суммарный битрейт, добавляемый аудио, невелик по сравнению с видео: при шести аудиорендициях по 200–800 кбит/с получается, максимум, 2 Мбит/с дополнительной полосы – даже до того, как плеер выберет один из треков, а на деле доставляется только один. Стоимость заключается в усилиях по кодированию, сложности упаковки и необходимости поддерживать дисциплину каталога, чтобы не забыть, что шоу 9847, серия 12, требует Atmos-рендер на английском и стереодубляж на семи языках.

Доступность: теги, которые решают, дойдут ли субтитры до своей аудитории

Просто наличия субтитров недостаточно. WebVTT-трек, указанный в манифесте без правильных характеристик, появится в меню плеера как «English», а не как «English CC», и зритель, у которого включён системный параметр «Always show captions», не получит их автоматически. Спецификация HLS использует словарь media-характеристик от Apple iTunes Connect для атрибута CHARACTERISTICS, и именно правильное указание значений превращает обычный трек субтитров в распознаваемый трек закрытых субтитров или аудиодескрипции на уровне платформы.

Релевантные характеристики:

  • public.accessibility.transcribes-spoken-dialog – captions включают письменную форму устного диалога. Это отличает CC от subtitles, которые содержат только перевод.
  • public.accessibility.describes-music-and-sound – captions также описывают неречевые звуки ([хлопает дверь], [зловещая музыка]). В сочетании с transcribes-spoken-dialog это канонический сигнал, что трек предназначен для глухих и слабослышащих.
  • public.accessibility.describes-video – аудиорендиция представляет собой тифлокомментарий для слабовидящих, в котором диктор описывает визуальные действия между репликами.
  • public.easy-to-read – captions адаптированы для когнитивной доступности: короткие предложения и более медленный темп чтения (новое требование, поступающее из ЕС).

DASH выражает эквивалентность через дескрипторы Accessibility, как описано выше. Юридические мандаты FCC, EAA, U.K. Equality Act и политики платформ app store основаны на том, что плеер корректно воспроизводит треки с этими тегами, а не просто на их наличии.

Типичная ошибка – обозначить переводной субтитровый трек как closed caption. Французский субтитровый трек, переводящий английский диалог для франкоязычной слышащей аудитории, не должен содержать describes-music-and-sound, потому что он их не описывает. Так вы сообщите платформе, что трек – это CC, и зрители, ищущие контент для доступности, будут введены в заблуждение. Используйте характеристики CC только для треков, которые действительно описывают неречевые звуки; переводные субтитры помечайте как plain без этих флагов.

Вторая типичная ошибка – забыть про FORCED=YES-трек. Если в оригинальной версии фильма французский персонаж говорит по-французски в сцене, предназначенной для англоязычной аудитории, английская версия должна включать forced-subtitle-трек, который будет отображать только эти французские реплики – независимо от того, включены ли у зрителя субтитры. Паттерн HLS – это отдельная рендиция EXT-X-MEDIA с FORCED=YES, содержащая только эти cues, в паре с обычной английской subtitle-рендицией для тех, кто нуждается в полных субтитрах. Без forced-трека зритель услышит французский язык, но не увидит перевода.

Продакшен-пайплайн: от сценария до манифеста

Трек с субтитрами не появляется автоматически. Продакшен-пайплайн, который добавляет французский дубляж или CC-трек в манифест, включает несколько этапов, и если один из них завершится с ошибкой без явного сообщения, баг может остаться незамеченным и потребоваться неделями, чтобы инженеры его обнаружили. Упрощённый пайплайн:

  1. Сценарий и список диалогов финализирует продакшен-команда – это исчерпывающий перечень всех устных реплик с привязкой таймкодов к мастер-таймлайну.
  2. Студия субтитров транскрибирует оригинальные диалоги и неречевые звуки, выпуская исходный файл формата SCC, MCC или IMSC, синхронизированный с мастер-таймкодом.
  3. Команда перевода субтитров переводит список диалогов на каждый требуемый язык, выпуская файлы SRT или WebVTT, также синхронизированные с тем же таймкодом.
  4. Студия дубляжа записывает озвучку на каждом языке в соответствии с мастер-изображением, выпуская отдельный аудиостем на каждый язык.
  5. Студия тифлокомментария составляет и озвучивает описательную закадровую речь между репликами, выпуская отдельный стем тифлокомментария для каждого основного языка рынка.
  6. Мастеринг и контроль качества (QC) проверяют, что каждый файл субтитров корректно воспроизводится на фоне мастер-изображения, а каждый аудиостем синхронизирован с видео с правильным временным сдвигом.
  7. Энкодер создаёт видеорендеры; пакаджер объединяет аудиостемы и файлы субтитров в сегментированные потоки; манифест ссылается на каждую рендер-версию с правильными LANGUAGE, CHARACTERISTICS, DEFAULT, AUTOSELECT, FORCED и CHANNELS.
  8. CDN кэширует все материалы, а плеер выбирает подходящие треки для каждого зрителя.

Где это ломается: шаг 7 – место, где чаще всего возникают a11y-ошибки. Энкодер и пакаджер не зависят от содержимого – они видят аудиофайл A и файл субтитров B и генерируют потоки, не зная, что A – это тифлокомментарий, а B – трек принудительных субтитров. Либо upstream-пайплайн передаёт эти метаданные (например, XML-сайдкар, описывающий роль и язык каждого файла), и пакаджер их корректно применяет, либо пакаджер использует статическую конфигурацию, которую нужно обновлять под каждое шоу.

В OTT-проектах Фора Софт наиболее надёжным подходом оказывается сборка манифеста на основе CMS: каталог CMS хранит каждый аудио- и субтитровый ассет с указанием языка, роли, конфигурации каналов и флагов доступности как полноценных полей, а этап сборки в сборщике пакетов использует эти данные для формирования корректных объявлений EXT-X-MEDIA или AdaptationSet. Статические шаблоны манифеста не масштабируются за пределы небольшого числа шоу.

Рис. 3. Восемь шагов от сценария до доставки. Большинство багов доступности возникает на шаге 7 – в пакаджере – когда метаданные CMS о языке, роли, конфигурации каналов или флагах доступности отсутствуют или указаны неверно.

Что плеер реально делает

Когда плеер загружает манифест, он разбирает каждую строку EXT-X-MEDIA и EXT-X-STREAM-INF в модель, хранящуюся в памяти: множество вариантов, каждый из которых указывает на одну или несколько групп рендиций. Начальный выбор работает примерно так:

  1. Определить системную локаль (например, fr-CA).
  2. Для каждого типа рендиции (аудио, субтитры, закрытые субтитры) отфильтровать только те, у которых есть AUTOSELECT=YES.
  3. Среди них выбрать рендицию, чей LANGUAGE наиболее точно соответствует локали. Соответствие по стандарту BCP 47 не является жёстким: сначала проверяется точное совпадение fr-CA с fr-CA, затем – совпадение на уровне языка с fr, и, наконец, применяются значения по умолчанию.
  4. Применить a11y-наложения: если в системе включена опция «Audio Descriptions», отдавать приоритет аудиорендициям с CHARACTERISTICS=public.accessibility.describes-video для совпадающего языка. Если включена опция «Captions and Subtitles», использовать лучшую CC-рендицию.
  5. Если подходящих вариантов нет – перейти к DEFAULT=YES в каждой группе.
  6. Применить принудительную субтитровую рендицию (FORCED=YES), соответствующую языку выбранного аудио – это случай, когда зритель, не включавший субтитры, всё равно видит принудительный трек с иноязычными надписями.

Затем плеер начинает параллельную загрузку сегментов выбранного видео, выбранной аудиорендиции и, при наличии, одной субтитровой рендииции. Каждый трек загружается по отдельному URL, декодируется в отдельном пайплайне и синхронизируется по метке времени представления медиа (media presentation timestamp).

Типичная ошибка – думать, что плеер сам всё разберёт. Плееры следуют спецификации, но в ней есть неоднозначности. Манифест с двумя AUTOSELECT=YES французскими аудиорендициями и без DEFAULT=YES будет интерпретироваться по-разному в iOS, Android Exoplayer, hls.js и Shaka. Всегда указывайте ровно одну DEFAULT=YES на группу, даже если это кажется избыточным.

Типичная ошибка – расхождение LANGUAGE. WebVTT-трек с LANGUAGE="en" не будет автовыбран для зрителя с системной локалью en-GB, если плеер не реализует BCP 47-fallback к базовому языку. Большинство реализует, но не все. Безопасный паттерн – помечать треки максимально специфичным BCP 47-тегом, который реально описывает контент (en-US, pt-BR, zh-Hant-HK), и предоставлять базовую рендицию (en, pt, zh) как fallback для несовпавших локалей.

Где Фора Софт вписывается в это

Фора Софт разрабатывает стриминговые системы с 2005 года в таких сферах, как OTT, телемедицина, e-learning, видеонаблюдение и живые конференции. Субтитры и мультиязычное аудио – неотъемлемая часть каждой из этих областей: e-learning-платформе, работающей по всей Европе, требуются принудительные субтитры на семи языках; телемедицинскому решению для рынка со стареющим населением – субтитры для глухих и слабослышащих на каждой консультации; OTT-продукту, выходящему на рынок Квебека, – аудиодорожка и субтитры на квебекском французском, отличающиеся от европейского варианта. Мы проектируем схему каталога, этап упаковки, сборку манифеста и интерфейс плеера комплексно – ведь ошибка всегда возникает на одном из этапов передачи, а не в изолированной части системы.

Типичные ошибки, обнаруженные через две недели после запуска

  • Французское аудио воспроизводится, когда системный язык iOS – французский, а французские субтитры – нет: причина в том, что рендиция субтитров помечена как AUTOSELECT=NO, скопированная из шаблона forced-subtitle.
  • Рендиция 5.1 выбирается на стерео-Roku и преобразуется в тихое и некачественное стерео: причина – отсутствует атрибут CHANNELS, из-за чего плеер не может отфильтровать нужную рендицию.
  • CC-трек отображается в меню iOS как «English», а не «English CC»: причина – атрибут CHARACTERISTICS не имеет пары с transcribes-spoken-dialog,describes-music-and-sound.
  • WebVTT-каусы появляются с задержкой после первого обновления манифеста в прямом эфире: причина – пакаджер не выдал X-TIMESTAMP-MAP для пер-сегментных WebVTT-файлов.
  • Испанский дубляж воспроизводится в Мексике, но не в Аргентине: причина – есть треки LANGUAGE="es-MX" и LANGUAGE="es-AR", но отсутствует fallback-рендиция LANGUAGE="es", и плеер отказался использовать откат.
  • hls.js корректно воспроизводит WebVTT в Chrome, но показывает пустые субтитры в Safari: причина – UTF-8 BOM в начале файла сбивает парсер WebKit. На пакаджере нужно удалять BOM.
  • Dolby Atmos воспроизводится как тишина на Roku Express 2018 года: причина – в группе объявлена только рендиция 12/JOC, а устройство не поддерживает декодирование JOC; необходимо также отгружать fallback-рендицию 6 (5.1) в той же группе.

Эталонные манифесты

PDF-компаньон к этой статье содержит два end-to-end эталонных манифеста – один для HLS, другой для DASH – для гипотетического трёхъязычного шоу с тифлокомментарием и поддержкой мультибитрейта, при этом каждый атрибут подробно задокументирован. Используйте его как канонический стартовый шаблон для следующего шоу в каталоге.

Скачать справочный пакет по captions и мультиаудио

Ключевые выводы

  • Captions и аудио – независимые группы рендиций в манифесте, которые объединяются с видео в плеере через GROUP-ID (HLS) или выбор AdaptationSet (DASH).
  • WebVTT – универсальный текстовый формат; IMSC1 – стандарт уровня вещания внутри fMP4; CEA-608/708 продолжает использоваться как устаревший in-битстрим формат.
  • LANGUAGE (BCP 47), DEFAULT, AUTOSELECT, FORCED, CHANNELS и CHARACTERISTICS – шесть атрибутов, определяющих, дойдёт ли нужный трек до нужного зрителя.
  • Поддержка Atmos указывается через CHANNELS="12/JOC" или "16/JOC"; всегда используйте резервный вариант в формате 5.1 или стерео для устройств без поддержки JOC.
  • Доступность – это дисциплина тегов, а не просто наличие треков: transcribes-spoken-dialog, describes-music-and-sound, describes-video – то, что интерпретируют платформы.
  • Сборка манифеста, управляемая CMS, масштабируется на большее количество шоу, в отличие от статических шаблонов.

Что почитать дальше

Строите такую систему?

Подберём параметры кодирования под ваш контент и посчитаем стоимость доставки до старта разработки.