Русский

Видео и субтитры · Инструментарий субтитров

Сравнение тайм-кодов субтитров: SRT запятых, VTT точек и SMPTE кадров.

· Фон

субтитры таймкоды частота кадров

Одно мгновение записывается тремя способами: тайм-код с запятой, тайм-код с точкой и тайм-код на основе кадров.
Оригинальная векторная иллюстрация ToolAcre

В субтитрах отображаются три способа записи времени: ЧЧ:ММ:СС,ммм для SRT, ЧЧ:ММ:SS.mmm для WebVTT и ЧЧ:ММ:СС:FF для SMPTE. В этом посте объясняется, что означает каждый из них, как они конвертируются и где конверсии идут не так.

Один и тот же момент, написанный тремя способами — краткий обзор таймкодов, которые редактор встречает в одном проекте.

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

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

Миллисекунды через запятую: SRT — европейская десятичная привычка, ставшая правилом формата.

SRT записывает часы, минуты, секунды, запятую и ровно три цифры миллисекунд. Запятая является десятичным разделителем в европейской конвенции, и она стала правилом формата по использованию, а не по спецификации, поскольку у SubRip не было стандартного документа, который бы это исправлял. В ценности нет ничего европейского; только пунктуация есть.

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

Миллисекунды с точкой: WebVTT — то же значение, другой разделитель и почему это важно для парсеров

WebVTT записывает то же значение через точку и позволяет полностью опустить поле часов, поэтому форма с двумя полями действительна, тогда как SRT ожидает три. Для парсера это действительно разные грамматики, поэтому файл может быть отклонен только из-за пунктуации, несмотря на то, что все цифры в нем правильные.

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

Кадры: тайм-код SMPTE — ЧЧ:ММ:СС:FF, его зависимость от частоты кадров и проблема с пропуском кадров.

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

Drop-frame добавляет вторую сложность. Материал с частотой 29.97 кадров в секунду подсчитывается так, как если бы его было тридцать, и чтобы счет соответствовал часам, два номера кадров пропускаются в начале большинства минут, за исключением каждой десятой минуты. Кадры не пропадают; есть только этикетки. Тайм-код с пропуском кадров — это соглашение об подсчете, и его обработка как простого подсчета кадров приводит к ошибке, которая растет по всей программе.

Преобразование кадров в миллисекунды — арифметика и округление, приводящие к небольшим, но реальным ошибкам.

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

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

Рабочий пример: один сигнал при 25 кадрах в секунду и при пропуске кадров 29.97 — преобразование обоих в миллисекунды и сравнение

Возьмите одну реплику за одну минуту тридцать секунд и двенадцать кадров. При двадцати пяти кадрах в секунду двенадцать кадров составляют двенадцать двадцать пятых секунды, что составляет ровно четыреста восемьдесят миллисекунд, то есть момент равен девяноста тысячам четыреста восьмидесяти миллисекундам.

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

На что это не распространяется — часы после 99, отрицательное время и тайм-код в метаданных контейнера.

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

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

Вывод: знайте, по каким часам вы читаете — как Subtitle Toolkit точно преобразует тайм-коды SRT и WebVTT.

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

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