Видеотаймлайн из сцен и подписей

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

Видеотаймлайн из сцен и подписей

Назначение

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

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

Представление данных

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

Текст подписи при этом хранится в какой-то кодировке, и выбор кодировки — отдельное решение. UTF-8 кодирует латинские символы одним байтом, но для кириллицы обычно требуется два байта на символ; UTF-32LE использует четыре байта на каждый скалярный код Unicode, а не на видимый глиф. Слово «Привет» займёт 12 байт в UTF-8 и 24 байта в UTF-32LE без BOM. Эти расчёты относятся к тексту как к данным и не зависят от того, в какой момент времени подпись показывается.

Пример таймлайна

Рассмотрим полностью условный таймлайн на общей абсолютной шкале времени. Пусть сцена 1 занимает интервал [0, 4), сцена 2 — интервал [4, 10), сцена 3 — интервал [10, 13), где квадратные скобки означают включение начала и исключение конца. Подпись с интервалом [5, 10) целиком лежит внутри сцены 2: её начало 5 не меньше начала сцены 4, а её конец 10 не превосходит конца сцены 10.

Если бы подпись была задана как [3, 5), она бы пересекла границу между сценами 1 и 2, и тогда проверка «длительность подписи не больше длительности сцены» уже не гарантировала бы попадание: длительность 2 секунды меньше длительности сцены 1, равной 4 секундам, но интервал всё равно выходит за её пределы. Для подписи, ограниченной одной сценой, достаточно проверить четыре неравенства: начало сцены не больше начала подписи, начало подписи меньше её конца, конец подписи не больше конца сцены. Подписи, пересекающие несколько сцен, можно разрешать намеренно, если так задумана композиция.

Формат вывода

Длительности сцен и интервалы подписей описывают содержание, но не определяют файл. Контейнер задаёт структуру записи: как в нём хранятся кадры, дорожки субтитров и служебные данные. Кодек определяет, как сжимается изображение. Частота кадров переводит секунды в кадры: при условной постоянной частоте 25 кадров в секунду один кадр длится 0,04 секунды, и момент 5 секунд приходится на кадр с индексом 125. Это иллюстративное предположение о постоянной частоте; реальные потоки могут иметь переменную частоту, и тогда нужен точный таймбейс, а не умножение на константу.

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

Ограничения

Некорректное отображение подписи не всегда означает ошибку в кодировке или тайминге. Глиф может отсутствовать в шрифте, текст может ломаться из-за переносов, а компоновка может не уместить строку в кадр. Симптом «подпись выглядит странно» требует проверки нескольких слоёв, и утверждать, что причина только в метках времени, было бы преждевременным.

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

Практическая проверка

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

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

Связанные материалы

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

Функции из каталога VideoPint упоминаются в архивных материалах как раздел справочника, но их сигнатуры и поведение здесь не утверждаются. Материал описывает общие принципы построения видеотаймлайна, которые не зависят от конкретного пакета функций.