Non-drop-frame в drop-frame
Или вставьте текст субтитров
Параметры
30 fps non-drop и 29,97 drop-frame пишут одни и те же часы по-разному, и это поле выбирает, как файл читается и как записывается обратно. Реплика через час читается как 01:00:00,000 в одном и 01:00:03,600 в другом — разница 3,6 секунды в час, а не ошибка округления. Заголовок страницы называет одно направление, и поле предлагает только его, поэтому полученный файл — тот, о котором страница. В тексте ничего не меняется: ни одна реплика не пересчитывается относительно видео, частота кадров не преобразуется, а реплика в пределах первой минуты часа возвращается точно такой, какой вошла, потому что там не отбрасывается ни одна метка кадра.
В какой частоте кадров считается тайминг. На страницах форматов это то, что нужно MicroDVD: он хранит время в номерах кадров. На страницах частоты кадров это частота, по которой файл был рассчитан, — версия, для которой делались субтитры, — а второе поле страницы принимает частоту видео, с которым вы будете их использовать. Обычные значения: 23,976, 24, 25, 29,97, 30, 50, 59,94 и 60. Ошибка сдвигает весь таймлайн, а на страницах частоты кадров — на коэффициент, а не на фиксированную величину.
Эта страница переписывает каждый таймкод субтитров из 30 fps non-drop в 29,97 fps drop-frame, поэтому каждая отметка увеличивается на величину, которая растёт с длительностью программы: внутри первой минуты часа — ни на сколько, через час — на 3,6 секунды, через десять часов — на 36 секунд, и на часе 01:00:00,000 становится 01:00:03,600. Слова, номера реплик, их порядок и переносы строк остаются как были.
Внутри первой минуты ни одна метка не выбрасывается, поэтому обе конвенции пишут эти шестьдесят секунд одинаково; отметка, уже стоящая на кадре 30 fps, не меняется вовсе, а отметка между двумя кадрами сдвигается к ближайшему — максимум на 17 мс. Это не конвертация частоты кадров: интервалы между репликами не растягиваются, а файл читается и записывается в этом браузере без отправки.
Примеры
Файл на пятой минуте
Вход
1
00:05:00,000 --> 00:05:02,000
The room is dark.
2
00:10:00,000 --> 00:10:03,000
A cold night.
Выход
1
00:05:00,333 --> 00:05:02,333
The room is dark.
2
00:10:00,600 --> 00:10:03,600
A cold night.
Две реплики сдвигаются на разные величины, и в этом вся операция: на пятой минуте drop-frame выбросил десять меток, поэтому часы читаются на 333 мс позже, а на десятой минуте — восемнадцать, то есть на 600 мс позже. Текст и номера реплик принадлежат файлу — переписываются только два значения часов на реплику.
Тот же файл на часе
Вход
1
01:00:00,000 --> 01:00:03,000
An hour into the programme.
Выход
1
01:00:03,600 --> 01:00:06,600
An hour into the programme.
На часе две конвенции расходятся на 3,6 секунды, то есть на 108 выброшенных меток. Это число и стоит сверять при проверке страницы: первая строка результата должна быть ровно на 3600 мс позже первой строки входа. Оба края реплики сдвигаются, поэтому длина реплики сохраняется.
Реплика внутри первой минуты
Вход
1
00:00:02,000 --> 00:00:04,000
Nothing to re-label yet.
2
00:05:00,000 --> 00:05:02,000
This one does move.
Выход
1
00:00:02,000 --> 00:00:04,000
Nothing to re-label yet.
2
00:05:00,333 --> 00:05:02,333
This one does move.
Первая реплика возвращается байт в байт, а вторая сдвигается — в одном прогоне. В течение первой минуты часа ни одна метка не выбрасывается, поэтому обе конвенции пишут эти шестьдесят секунд одинаково, а 00:00:02,000 уже стоит на кадре 30 fps. Время между кадрами притянулось бы к ближайшему с точностью до 17 мс — это то же приведение к сетке, которое страница применяет по всему файлу. Одна реплика без изменений рядом с другой, которая сдвинулась, — ожидаемый результат, а не половина прогона.
Частые вопросы
Чем drop-frame таймкод отличается от non-drop-frame?
Оба считают 30 меток в секунду, но 29,97 fps не выдаёт 30 кадров в секунду — он выдаёт примерно 29,97, поэтому часы, считающие по 30 меток, постепенно отстают от реального времени. Drop-frame исправляет это, выбрасывая две метки в начале каждой минуты, кроме каждой десятой: метки выбрасываются, хотя кадры остаются. Non-drop сохраняет все метки и уплывает: после часа программы разница составляет 3,6 секунды, после десяти часов — 36 секунд.
Почему реплика на часе выходит на 3,6 секунды позже, чем вошла?
Потому что 3,6 секунды — это итог часа выброшенных меток: по две метки в минуту на протяжении 54 минут из каждых 60, при 33,37 мс на метку, то есть 108 меток или 3600 мс в час. Страница не добавляет задержку, а записывает те же кадры в другой конвенции, и при чтении этой конвенции в этой точке программы получается позже. Реплика 01:00:00,000 входит и 01:00:03,600 выходит; оба края сдвигаются одинаково, поэтому длина реплики сохраняется до миллисекунды.
Почему первая минута файла осталась без изменений?
Потому что в течение первой минуты часа ни одна метка не выбрасывается, и обе конвенции пишут этот отрезок одинаково: 00:00:02,000 означает 60 кадров и там, и там. Дрейф начинается на первой границе минуты и дальше только растёт. Внутри этого отрезка время может сдвинуть только приведение к сетке 30 fps: значение между двумя кадрами, например 00:00:02,010, вернётся как 00:00:02,000, то есть сдвиг составит до 17 мс; времена, снятые покадровым инструментом, уже лежат на сетке и не двигаются.
Какое направление мне нужно — non-drop в drop-frame или наоборот?
Зависит от того, откуда сняты таймкоды в файле. Если вы брали времена из плеера или редактора, настроенного на non-drop, а конвейер, в который вы сдаёте, работает в drop-frame, нужна эта страница: она прибавляет величину, растущую с положением реплики. Если файл размечен по drop-frame-дисплею, а инструмент дальше ожидает non-drop, нужна обратная страница, которая вычитает те же 3600 мс на часе. Быстрая проверка: прогоните файл здесь и сравните одну реплику — если выходное время читается позже входного, направление было верным.
Меняет ли эта страница частоту кадров субтитров?
Нет. Ничего не масштабируется и не растягивается: реплика длиной две секунды остаётся двухсекундной, а расстояния между репликами не меняются, потому что каждая сдвигается на величину, зависящую от её положения, а не на коэффициент. Файл, рассчитанный под видео 25 fps, здесь тоже не пересчитывается; поле частоты кадров существует потому, что MicroDVD хранит тайминги номерами кадров и без неё не читается. Пересчёт интервалов под другую частоту кадров — отдельная операция со своей страницей.
Записано ли где-нибудь в файле, что таймкоды теперь drop-frame?
Нет, и ни один из читаемых здесь форматов не может этого записать: SRT, WebVTT, ASS, SSA, SBV, SAMI, MicroDVD, TTML, JSON и CSV хранят время и ничего о том, как оно посчитано. В файле, который вы перетащили, этого тоже не было. Поэтому страница меняет числа, а то, какую конвенцию они означают, по-прежнему определяет ваш конвейер — та же договорённость, что была раньше, только теперь числа ей соответствуют. Если у инструмента ниже по конвейеру есть собственная настройка drop-frame, именно она и прочитает эти значения.