Русский

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

Почему файл субтитров воспроизводится в VLC, но не воспроизводится в элементе дорожки HTML5

· Как это работает

субтитры вебвтт обработка браузера

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

Настольные плееры прощают ошибки; элемент отслеживания браузера — нет. В этом посте объясняется, как анализатор заголовков HTML5 считывает файл WebVTT, какие ошибки он автоматически удаляет и как подготовить файл, который оба принимают.

Тот же файл работает в VLC и ничего не показывает на веб-странице — два парсера, два уровня допуска.

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

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

Как элемент track загружает файл субтитров — запрос, тип MIME, CORS для треков с разными источниками и проверка заголовка WEBVTT.

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

Затем идет проверка заголовка. Файл WebVTT должен начинаться с подписи WEBVTT, которой может предшествовать знак порядка байтов, а файл без нее не является файлом WebVTT. Это единственная наиболее распространенная причина, по которой файл SRT, переименованный в расширение VTT, ничего не отображает: при переименовании изменилось расширение, а не первая строка.

Синтаксический анализ сигнала за сигналом — что делает браузер с неверным тайм-кодом или неожиданной строкой и почему ошибка остается молчаливой

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

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

Снисходительность настольных проигрывателей — почему VLC и другие принимают файлы, которые технически недействительны

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

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

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

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

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

Чего здесь не касается — стилизация с помощью ::cue, настройки позиционирования и живые подписи.

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

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

Вывод: приготовьтесь к самому строгому анализатору — как преобразование и очистка Subtitle Toolkit создают файл, который принимает элемент track.

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

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